* [PATCH 0/4] mmiotrace: various fixes and cleaning
@ 2009-04-28 19:17 Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: fix range test Stuart Bennett
2009-04-29 9:36 ` [PATCH 0/4] mmiotrace: various fixes and cleaning Ingo Molnar
0 siblings, 2 replies; 11+ messages in thread
From: Stuart Bennett @ 2009-04-28 19:17 UTC (permalink / raw)
To: Ingo Molnar, Steven Rostedt; +Cc: Pekka Paalanen, linux-kernel
Hi all, this set contains one bug fix, a couple of cleanups, and a better fix
to the mmiotrace+gdb issue
Pekka Paalanen has kindly reviewed and acked all the changes.
It has been tested on 2.6.30-rc3 using a 32 bit processor and tracing the
proprietary Nvidia driver, and also builds cleanly on today's tip/master on
a 64 bit system
Stuart
Stuart Bennett (4):
x86 mmiotrace: fix range test
x86 mmiotrace: code consistency/legibility improvement
x86 mmiotrace: refactor clearing/restore of page presence
x86 mmiotrace: only register for die notifier when tracer active
arch/x86/mm/kmmio.c | 100 ++++++++++++++++++++++++++-------------------
arch/x86/mm/mmio-mod.c | 2 +
include/linux/mmiotrace.h | 2 +
3 files changed, 62 insertions(+), 42 deletions(-)
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] x86 mmiotrace: fix range test
2009-04-28 19:17 [PATCH 0/4] mmiotrace: various fixes and cleaning Stuart Bennett
@ 2009-04-28 19:17 ` Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: code consistency/legibility improvement Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/urgent] tracing: x86, mmiotrace: fix range test tip-bot for Stuart Bennett
2009-04-29 9:36 ` [PATCH 0/4] mmiotrace: various fixes and cleaning Ingo Molnar
1 sibling, 2 replies; 11+ messages in thread
From: Stuart Bennett @ 2009-04-28 19:17 UTC (permalink / raw)
To: Ingo Molnar, Steven Rostedt; +Cc: Pekka Paalanen, linux-kernel, Stuart Bennett
Matching on (addr == (p->addr + p->len)) causes problems when mappings
are adjacent
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
---
arch/x86/mm/kmmio.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index 4f115e0..50dc802 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -87,7 +87,7 @@ static struct kmmio_probe *get_kmmio_probe(unsigned long addr)
{
struct kmmio_probe *p;
list_for_each_entry_rcu(p, &kmmio_probes, list) {
- if (addr >= p->addr && addr <= (p->addr + p->len))
+ if (addr >= p->addr && addr < (p->addr + p->len))
return p;
}
return NULL;
--
1.5.4.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] x86 mmiotrace: code consistency/legibility improvement
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: fix range test Stuart Bennett
@ 2009-04-28 19:17 ` Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: refactor clearing/restore of page presence Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/core] tracing: x86, mmiotrace: code consistency/legibility improvement tip-bot for Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/urgent] tracing: x86, mmiotrace: fix range test tip-bot for Stuart Bennett
1 sibling, 2 replies; 11+ messages in thread
From: Stuart Bennett @ 2009-04-28 19:17 UTC (permalink / raw)
To: Ingo Molnar, Steven Rostedt; +Cc: Pekka Paalanen, linux-kernel, Stuart Bennett
kmmio_probe being *p and kmmio_fault_page being sometimes *f and
sometimes *p is not helpful
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
---
arch/x86/mm/kmmio.c | 34 +++++++++++++++++-----------------
1 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index 50dc802..6db840e 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -97,13 +97,13 @@ static struct kmmio_probe *get_kmmio_probe(unsigned long addr)
static struct kmmio_fault_page *get_kmmio_fault_page(unsigned long page)
{
struct list_head *head;
- struct kmmio_fault_page *p;
+ struct kmmio_fault_page *f;
page &= PAGE_MASK;
head = kmmio_page_list(page);
- list_for_each_entry_rcu(p, head, list) {
- if (p->page == page)
- return p;
+ list_for_each_entry_rcu(f, head, list) {
+ if (f->page == page)
+ return f;
}
return NULL;
}
@@ -439,12 +439,12 @@ static void rcu_free_kmmio_fault_pages(struct rcu_head *head)
head,
struct kmmio_delayed_release,
rcu);
- struct kmmio_fault_page *p = dr->release_list;
- while (p) {
- struct kmmio_fault_page *next = p->release_next;
- BUG_ON(p->count);
- kfree(p);
- p = next;
+ struct kmmio_fault_page *f = dr->release_list;
+ while (f) {
+ struct kmmio_fault_page *next = f->release_next;
+ BUG_ON(f->count);
+ kfree(f);
+ f = next;
}
kfree(dr);
}
@@ -453,19 +453,19 @@ static void remove_kmmio_fault_pages(struct rcu_head *head)
{
struct kmmio_delayed_release *dr =
container_of(head, struct kmmio_delayed_release, rcu);
- struct kmmio_fault_page *p = dr->release_list;
+ struct kmmio_fault_page *f = dr->release_list;
struct kmmio_fault_page **prevp = &dr->release_list;
unsigned long flags;
spin_lock_irqsave(&kmmio_lock, flags);
- while (p) {
- if (!p->count) {
- list_del_rcu(&p->list);
- prevp = &p->release_next;
+ while (f) {
+ if (!f->count) {
+ list_del_rcu(&f->list);
+ prevp = &f->release_next;
} else {
- *prevp = p->release_next;
+ *prevp = f->release_next;
}
- p = p->release_next;
+ f = f->release_next;
}
spin_unlock_irqrestore(&kmmio_lock, flags);
--
1.5.4.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] x86 mmiotrace: refactor clearing/restore of page presence
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: code consistency/legibility improvement Stuart Bennett
@ 2009-04-28 19:17 ` Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: only register for die notifier when tracer active Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/core] tracing: x86, mmiotrace: refactor clearing/restore of page presence tip-bot for Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/core] tracing: x86, mmiotrace: code consistency/legibility improvement tip-bot for Stuart Bennett
1 sibling, 2 replies; 11+ messages in thread
From: Stuart Bennett @ 2009-04-28 19:17 UTC (permalink / raw)
To: Ingo Molnar, Steven Rostedt; +Cc: Pekka Paalanen, linux-kernel, Stuart Bennett
* change function names to clear_* from set_*: in reality we only clear
and restore page presence, and never unconditionally set present.
Using clear_*({true, false}, ...) is therefore more honest than
set_*({false, true}, ...)
* upgrade presence storage to pteval_t: doing user-space tracing will
require saving and manipulation of the _PAGE_PROTNONE bit, in addition
to the existing _PAGE_PRESENT changes, and having multiple bools stored
and passed around does not seem optimal
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
---
arch/x86/mm/kmmio.c | 43 ++++++++++++++++++++++---------------------
1 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index 6db840e..422f49e 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -32,7 +32,7 @@ struct kmmio_fault_page {
struct list_head list;
struct kmmio_fault_page *release_next;
unsigned long page; /* location of the fault page */
- bool old_presence; /* page presence prior to arming */
+ pteval_t old_presence; /* page presence prior to arming */
bool armed;
/*
@@ -108,49 +108,51 @@ static struct kmmio_fault_page *get_kmmio_fault_page(unsigned long page)
return NULL;
}
-static void set_pmd_presence(pmd_t *pmd, bool present, bool *old)
+static void clear_pmd_presence(pmd_t *pmd, bool clear, pmdval_t *old)
{
pmdval_t v = pmd_val(*pmd);
- *old = !!(v & _PAGE_PRESENT);
- v &= ~_PAGE_PRESENT;
- if (present)
- v |= _PAGE_PRESENT;
+ if (clear) {
+ *old = v & _PAGE_PRESENT;
+ v &= ~_PAGE_PRESENT;
+ } else /* presume this has been called with clear==true previously */
+ v |= *old;
set_pmd(pmd, __pmd(v));
}
-static void set_pte_presence(pte_t *pte, bool present, bool *old)
+static void clear_pte_presence(pte_t *pte, bool clear, pteval_t *old)
{
pteval_t v = pte_val(*pte);
- *old = !!(v & _PAGE_PRESENT);
- v &= ~_PAGE_PRESENT;
- if (present)
- v |= _PAGE_PRESENT;
+ if (clear) {
+ *old = v & _PAGE_PRESENT;
+ v &= ~_PAGE_PRESENT;
+ } else /* presume this has been called with clear==true previously */
+ v |= *old;
set_pte_atomic(pte, __pte(v));
}
-static int set_page_presence(unsigned long addr, bool present, bool *old)
+static int clear_page_presence(struct kmmio_fault_page *f, bool clear)
{
unsigned int level;
- pte_t *pte = lookup_address(addr, &level);
+ pte_t *pte = lookup_address(f->page, &level);
if (!pte) {
- pr_err("kmmio: no pte for page 0x%08lx\n", addr);
+ pr_err("kmmio: no pte for page 0x%08lx\n", f->page);
return -1;
}
switch (level) {
case PG_LEVEL_2M:
- set_pmd_presence((pmd_t *)pte, present, old);
+ clear_pmd_presence((pmd_t *)pte, clear, &f->old_presence);
break;
case PG_LEVEL_4K:
- set_pte_presence(pte, present, old);
+ clear_pte_presence(pte, clear, &f->old_presence);
break;
default:
pr_err("kmmio: unexpected page level 0x%x.\n", level);
return -1;
}
- __flush_tlb_one(addr);
+ __flush_tlb_one(f->page);
return 0;
}
@@ -171,9 +173,9 @@ static int arm_kmmio_fault_page(struct kmmio_fault_page *f)
WARN_ONCE(f->armed, KERN_ERR "kmmio page already armed.\n");
if (f->armed) {
pr_warning("kmmio double-arm: page 0x%08lx, ref %d, old %d\n",
- f->page, f->count, f->old_presence);
+ f->page, f->count, !!f->old_presence);
}
- ret = set_page_presence(f->page, false, &f->old_presence);
+ ret = clear_page_presence(f, true);
WARN_ONCE(ret < 0, KERN_ERR "kmmio arming 0x%08lx failed.\n", f->page);
f->armed = true;
return ret;
@@ -182,8 +184,7 @@ static int arm_kmmio_fault_page(struct kmmio_fault_page *f)
/** Restore the given page to saved presence state. */
static void disarm_kmmio_fault_page(struct kmmio_fault_page *f)
{
- bool tmp;
- int ret = set_page_presence(f->page, f->old_presence, &tmp);
+ int ret = clear_page_presence(f, false);
WARN_ONCE(ret < 0,
KERN_ERR "kmmio disarming 0x%08lx failed.\n", f->page);
f->armed = false;
--
1.5.4.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] x86 mmiotrace: only register for die notifier when tracer active
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: refactor clearing/restore of page presence Stuart Bennett
@ 2009-04-28 19:17 ` Stuart Bennett
2009-04-29 9:39 ` Ingo Molnar
2009-04-29 11:05 ` [tip:tracing/core] tracing: x86, " tip-bot for Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/core] tracing: x86, mmiotrace: refactor clearing/restore of page presence tip-bot for Stuart Bennett
1 sibling, 2 replies; 11+ messages in thread
From: Stuart Bennett @ 2009-04-28 19:17 UTC (permalink / raw)
To: Ingo Molnar, Steven Rostedt; +Cc: Pekka Paalanen, linux-kernel, Stuart Bennett
Follow up to afcfe024aebd74b0984a41af9a34e009cf5badaf in Linus' tree
("x86: mmiotrace: quieten spurious warning message")
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
---
arch/x86/mm/kmmio.c | 21 ++++++++++++++++++---
arch/x86/mm/mmio-mod.c | 2 ++
include/linux/mmiotrace.h | 2 ++
3 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index 422f49e..bdbbf0d 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -311,7 +311,12 @@ static int post_kmmio_handler(unsigned long condition, struct pt_regs *regs)
struct kmmio_context *ctx = &get_cpu_var(kmmio_ctx);
if (!ctx->active) {
- pr_debug("kmmio: spurious debug trap on CPU %d.\n",
+ /*
+ * debug traps without an active context are due to either
+ * something external causing them (f.e. using a debugger while
+ * mmio tracing enabled), or erroneous behaviour
+ */
+ pr_warning("kmmio: unexpected debug trap on CPU %d.\n",
smp_processor_id());
goto out;
}
@@ -545,11 +550,21 @@ static struct notifier_block nb_die = {
.notifier_call = kmmio_die_notifier
};
-static int __init init_kmmio(void)
+int kmmio_init(void)
{
int i;
for (i = 0; i < KMMIO_PAGE_TABLE_SIZE; i++)
INIT_LIST_HEAD(&kmmio_page_table[i]);
return register_die_notifier(&nb_die);
}
-fs_initcall(init_kmmio); /* should be before device_initcall() */
+
+void kmmio_cleanup(void)
+{
+ int i;
+
+ unregister_die_notifier(&nb_die);
+ for (i = 0; i < KMMIO_PAGE_TABLE_SIZE; i++)
+ WARN_ONCE(!list_empty(&kmmio_page_table[i]),
+ KERN_ERR "kmmio_page_table not empty at cleanup, "
+ "any further tracing will leak memory\n");
+}
diff --git a/arch/x86/mm/mmio-mod.c b/arch/x86/mm/mmio-mod.c
index c9342ed..132772a 100644
--- a/arch/x86/mm/mmio-mod.c
+++ b/arch/x86/mm/mmio-mod.c
@@ -451,6 +451,7 @@ void enable_mmiotrace(void)
if (nommiotrace)
pr_info(NAME "MMIO tracing disabled.\n");
+ kmmio_init();
enter_uniprocessor();
spin_lock_irq(&trace_lock);
atomic_inc(&mmiotrace_enabled);
@@ -473,6 +474,7 @@ void disable_mmiotrace(void)
clear_trace_list(); /* guarantees: no more kmmio callbacks */
leave_uniprocessor();
+ kmmio_cleanup();
pr_info(NAME "disabled.\n");
out:
mutex_unlock(&mmiotrace_mutex);
diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h
index 3d1b7bd..97491f7 100644
--- a/include/linux/mmiotrace.h
+++ b/include/linux/mmiotrace.h
@@ -30,6 +30,8 @@ extern unsigned int kmmio_count;
extern int register_kmmio_probe(struct kmmio_probe *p);
extern void unregister_kmmio_probe(struct kmmio_probe *p);
+extern int kmmio_init(void);
+extern void kmmio_cleanup(void);
#ifdef CONFIG_MMIOTRACE
/* kmmio is active by some kmmio_probes? */
--
1.5.4.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/4] mmiotrace: various fixes and cleaning
2009-04-28 19:17 [PATCH 0/4] mmiotrace: various fixes and cleaning Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: fix range test Stuart Bennett
@ 2009-04-29 9:36 ` Ingo Molnar
1 sibling, 0 replies; 11+ messages in thread
From: Ingo Molnar @ 2009-04-29 9:36 UTC (permalink / raw)
To: Stuart Bennett; +Cc: Steven Rostedt, Pekka Paalanen, linux-kernel
* Stuart Bennett <stuart@freedesktop.org> wrote:
> Hi all, this set contains one bug fix, a couple of cleanups, and a better fix
> to the mmiotrace+gdb issue
>
> Pekka Paalanen has kindly reviewed and acked all the changes.
>
> It has been tested on 2.6.30-rc3 using a 32 bit processor and tracing the
> proprietary Nvidia driver, and also builds cleanly on today's tip/master on
> a 64 bit system
>
> Stuart
>
> Stuart Bennett (4):
> x86 mmiotrace: fix range test
> x86 mmiotrace: code consistency/legibility improvement
> x86 mmiotrace: refactor clearing/restore of page presence
> x86 mmiotrace: only register for die notifier when tracer active
>
> arch/x86/mm/kmmio.c | 100 ++++++++++++++++++++++++++-------------------
> arch/x86/mm/mmio-mod.c | 2 +
> include/linux/mmiotrace.h | 2 +
> 3 files changed, 62 insertions(+), 42 deletions(-)
I've applied:
33015c8: tracing: x86, mmiotrace: fix range test
to tip:tracing/urgent for v2.6.30, and have applied the other 3
patches to tip:tracing/mmiotrace, for v2.6.31:
0f9a623: tracing: x86, mmiotrace: only register for die notifier when tracer active
46e91d0: tracing: x86, mmiotrace: refactor clearing/restore of page presence
0492e1b: tracing: x86, mmiotrace: code consistency/legibility improvement
Thanks Stuart!
Ingo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] x86 mmiotrace: only register for die notifier when tracer active
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: only register for die notifier when tracer active Stuart Bennett
@ 2009-04-29 9:39 ` Ingo Molnar
2009-04-29 11:05 ` [tip:tracing/core] tracing: x86, " tip-bot for Stuart Bennett
1 sibling, 0 replies; 11+ messages in thread
From: Ingo Molnar @ 2009-04-29 9:39 UTC (permalink / raw)
To: Stuart Bennett; +Cc: Steven Rostedt, Pekka Paalanen, linux-kernel
* Stuart Bennett <stuart@freedesktop.org> wrote:
> Follow up to afcfe024aebd74b0984a41af9a34e009cf5badaf in Linus' tree
> ("x86: mmiotrace: quieten spurious warning message")
>
> Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
> Acked-by: Pekka Paalanen <pq@iki.fi>
> ---
> arch/x86/mm/kmmio.c | 21 ++++++++++++++++++---
> arch/x86/mm/mmio-mod.c | 2 ++
> include/linux/mmiotrace.h | 2 ++
> 3 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
> index 422f49e..bdbbf0d 100644
> --- a/arch/x86/mm/kmmio.c
> +++ b/arch/x86/mm/kmmio.c
> @@ -311,7 +311,12 @@ static int post_kmmio_handler(unsigned long condition, struct pt_regs *regs)
> struct kmmio_context *ctx = &get_cpu_var(kmmio_ctx);
>
> if (!ctx->active) {
> - pr_debug("kmmio: spurious debug trap on CPU %d.\n",
> + /*
> + * debug traps without an active context are due to either
> + * something external causing them (f.e. using a debugger while
> + * mmio tracing enabled), or erroneous behaviour
> + */
> + pr_warning("kmmio: unexpected debug trap on CPU %d.\n",
> smp_processor_id());
> goto out;
> }
> @@ -545,11 +550,21 @@ static struct notifier_block nb_die = {
> .notifier_call = kmmio_die_notifier
> };
>
> -static int __init init_kmmio(void)
> +int kmmio_init(void)
> {
> int i;
> for (i = 0; i < KMMIO_PAGE_TABLE_SIZE; i++)
> INIT_LIST_HEAD(&kmmio_page_table[i]);
> return register_die_notifier(&nb_die);
> }
> -fs_initcall(init_kmmio); /* should be before device_initcall() */
> +
> +void kmmio_cleanup(void)
> +{
> + int i;
> +
> + unregister_die_notifier(&nb_die);
> + for (i = 0; i < KMMIO_PAGE_TABLE_SIZE; i++)
> + WARN_ONCE(!list_empty(&kmmio_page_table[i]),
> + KERN_ERR "kmmio_page_table not empty at cleanup, "
> + "any further tracing will leak memory\n");
> +}
Note, i cleaned this up a bit in the commit i applied - we rather
let strings become over-long than break them in the middle
Ingo
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip:tracing/urgent] tracing: x86, mmiotrace: fix range test
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: fix range test Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: code consistency/legibility improvement Stuart Bennett
@ 2009-04-29 11:04 ` tip-bot for Stuart Bennett
1 sibling, 0 replies; 11+ messages in thread
From: tip-bot for Stuart Bennett @ 2009-04-29 11:04 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, rostedt, pq, stuart, tglx, mingo
Commit-ID: 33015c85995716d03f6293346cf05a1908b0fb9a
Gitweb: http://git.kernel.org/tip/33015c85995716d03f6293346cf05a1908b0fb9a
Author: Stuart Bennett <stuart@freedesktop.org>
AuthorDate: Tue, 28 Apr 2009 20:17:48 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 29 Apr 2009 11:32:22 +0200
tracing: x86, mmiotrace: fix range test
Matching on (addr == (p->addr + p->len)) causes problems when mappings
are adjacent.
[ Impact: fix mmiotrace confusion on adjacent iomaps ]
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1240946271-7083-2-git-send-email-stuart@freedesktop.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/mm/kmmio.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index 4f115e0..50dc802 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -87,7 +87,7 @@ static struct kmmio_probe *get_kmmio_probe(unsigned long addr)
{
struct kmmio_probe *p;
list_for_each_entry_rcu(p, &kmmio_probes, list) {
- if (addr >= p->addr && addr <= (p->addr + p->len))
+ if (addr >= p->addr && addr < (p->addr + p->len))
return p;
}
return NULL;
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip:tracing/core] tracing: x86, mmiotrace: code consistency/legibility improvement
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: code consistency/legibility improvement Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: refactor clearing/restore of page presence Stuart Bennett
@ 2009-04-29 11:04 ` tip-bot for Stuart Bennett
1 sibling, 0 replies; 11+ messages in thread
From: tip-bot for Stuart Bennett @ 2009-04-29 11:04 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, rostedt, pq, stuart, tglx, mingo
Commit-ID: 0492e1bb8fe7d122901c9f3af75e537d4129712e
Gitweb: http://git.kernel.org/tip/0492e1bb8fe7d122901c9f3af75e537d4129712e
Author: Stuart Bennett <stuart@freedesktop.org>
AuthorDate: Tue, 28 Apr 2009 20:17:49 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 29 Apr 2009 11:33:33 +0200
tracing: x86, mmiotrace: code consistency/legibility improvement
kmmio_probe being *p and kmmio_fault_page being sometimes *f and
sometimes *p is not helpful.
[ Impact: cleanup ]
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1240946271-7083-3-git-send-email-stuart@freedesktop.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/mm/kmmio.c | 34 +++++++++++++++++-----------------
1 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index 4f115e0..869181a 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -97,13 +97,13 @@ static struct kmmio_probe *get_kmmio_probe(unsigned long addr)
static struct kmmio_fault_page *get_kmmio_fault_page(unsigned long page)
{
struct list_head *head;
- struct kmmio_fault_page *p;
+ struct kmmio_fault_page *f;
page &= PAGE_MASK;
head = kmmio_page_list(page);
- list_for_each_entry_rcu(p, head, list) {
- if (p->page == page)
- return p;
+ list_for_each_entry_rcu(f, head, list) {
+ if (f->page == page)
+ return f;
}
return NULL;
}
@@ -439,12 +439,12 @@ static void rcu_free_kmmio_fault_pages(struct rcu_head *head)
head,
struct kmmio_delayed_release,
rcu);
- struct kmmio_fault_page *p = dr->release_list;
- while (p) {
- struct kmmio_fault_page *next = p->release_next;
- BUG_ON(p->count);
- kfree(p);
- p = next;
+ struct kmmio_fault_page *f = dr->release_list;
+ while (f) {
+ struct kmmio_fault_page *next = f->release_next;
+ BUG_ON(f->count);
+ kfree(f);
+ f = next;
}
kfree(dr);
}
@@ -453,19 +453,19 @@ static void remove_kmmio_fault_pages(struct rcu_head *head)
{
struct kmmio_delayed_release *dr =
container_of(head, struct kmmio_delayed_release, rcu);
- struct kmmio_fault_page *p = dr->release_list;
+ struct kmmio_fault_page *f = dr->release_list;
struct kmmio_fault_page **prevp = &dr->release_list;
unsigned long flags;
spin_lock_irqsave(&kmmio_lock, flags);
- while (p) {
- if (!p->count) {
- list_del_rcu(&p->list);
- prevp = &p->release_next;
+ while (f) {
+ if (!f->count) {
+ list_del_rcu(&f->list);
+ prevp = &f->release_next;
} else {
- *prevp = p->release_next;
+ *prevp = f->release_next;
}
- p = p->release_next;
+ f = f->release_next;
}
spin_unlock_irqrestore(&kmmio_lock, flags);
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip:tracing/core] tracing: x86, mmiotrace: refactor clearing/restore of page presence
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: refactor clearing/restore of page presence Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: only register for die notifier when tracer active Stuart Bennett
@ 2009-04-29 11:04 ` tip-bot for Stuart Bennett
1 sibling, 0 replies; 11+ messages in thread
From: tip-bot for Stuart Bennett @ 2009-04-29 11:04 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, rostedt, pq, stuart, tglx, mingo
Commit-ID: 46e91d00b1165b14b484aa33800e1bba0794ae1a
Gitweb: http://git.kernel.org/tip/46e91d00b1165b14b484aa33800e1bba0794ae1a
Author: Stuart Bennett <stuart@freedesktop.org>
AuthorDate: Tue, 28 Apr 2009 20:17:50 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 29 Apr 2009 11:33:33 +0200
tracing: x86, mmiotrace: refactor clearing/restore of page presence
* change function names to clear_* from set_*: in reality we only clear
and restore page presence, and never unconditionally set present.
Using clear_*({true, false}, ...) is therefore more honest than
set_*({false, true}, ...)
* upgrade presence storage to pteval_t: doing user-space tracing will
require saving and manipulation of the _PAGE_PROTNONE bit, in addition
to the existing _PAGE_PRESENT changes, and having multiple bools stored
and passed around does not seem optimal
[ Impact: refactor, clean up mmiotrace code ]
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1240946271-7083-4-git-send-email-stuart@freedesktop.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/mm/kmmio.c | 43 ++++++++++++++++++++++---------------------
1 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index 869181a..a769d1a 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -32,7 +32,7 @@ struct kmmio_fault_page {
struct list_head list;
struct kmmio_fault_page *release_next;
unsigned long page; /* location of the fault page */
- bool old_presence; /* page presence prior to arming */
+ pteval_t old_presence; /* page presence prior to arming */
bool armed;
/*
@@ -108,49 +108,51 @@ static struct kmmio_fault_page *get_kmmio_fault_page(unsigned long page)
return NULL;
}
-static void set_pmd_presence(pmd_t *pmd, bool present, bool *old)
+static void clear_pmd_presence(pmd_t *pmd, bool clear, pmdval_t *old)
{
pmdval_t v = pmd_val(*pmd);
- *old = !!(v & _PAGE_PRESENT);
- v &= ~_PAGE_PRESENT;
- if (present)
- v |= _PAGE_PRESENT;
+ if (clear) {
+ *old = v & _PAGE_PRESENT;
+ v &= ~_PAGE_PRESENT;
+ } else /* presume this has been called with clear==true previously */
+ v |= *old;
set_pmd(pmd, __pmd(v));
}
-static void set_pte_presence(pte_t *pte, bool present, bool *old)
+static void clear_pte_presence(pte_t *pte, bool clear, pteval_t *old)
{
pteval_t v = pte_val(*pte);
- *old = !!(v & _PAGE_PRESENT);
- v &= ~_PAGE_PRESENT;
- if (present)
- v |= _PAGE_PRESENT;
+ if (clear) {
+ *old = v & _PAGE_PRESENT;
+ v &= ~_PAGE_PRESENT;
+ } else /* presume this has been called with clear==true previously */
+ v |= *old;
set_pte_atomic(pte, __pte(v));
}
-static int set_page_presence(unsigned long addr, bool present, bool *old)
+static int clear_page_presence(struct kmmio_fault_page *f, bool clear)
{
unsigned int level;
- pte_t *pte = lookup_address(addr, &level);
+ pte_t *pte = lookup_address(f->page, &level);
if (!pte) {
- pr_err("kmmio: no pte for page 0x%08lx\n", addr);
+ pr_err("kmmio: no pte for page 0x%08lx\n", f->page);
return -1;
}
switch (level) {
case PG_LEVEL_2M:
- set_pmd_presence((pmd_t *)pte, present, old);
+ clear_pmd_presence((pmd_t *)pte, clear, &f->old_presence);
break;
case PG_LEVEL_4K:
- set_pte_presence(pte, present, old);
+ clear_pte_presence(pte, clear, &f->old_presence);
break;
default:
pr_err("kmmio: unexpected page level 0x%x.\n", level);
return -1;
}
- __flush_tlb_one(addr);
+ __flush_tlb_one(f->page);
return 0;
}
@@ -171,9 +173,9 @@ static int arm_kmmio_fault_page(struct kmmio_fault_page *f)
WARN_ONCE(f->armed, KERN_ERR "kmmio page already armed.\n");
if (f->armed) {
pr_warning("kmmio double-arm: page 0x%08lx, ref %d, old %d\n",
- f->page, f->count, f->old_presence);
+ f->page, f->count, !!f->old_presence);
}
- ret = set_page_presence(f->page, false, &f->old_presence);
+ ret = clear_page_presence(f, true);
WARN_ONCE(ret < 0, KERN_ERR "kmmio arming 0x%08lx failed.\n", f->page);
f->armed = true;
return ret;
@@ -182,8 +184,7 @@ static int arm_kmmio_fault_page(struct kmmio_fault_page *f)
/** Restore the given page to saved presence state. */
static void disarm_kmmio_fault_page(struct kmmio_fault_page *f)
{
- bool tmp;
- int ret = set_page_presence(f->page, f->old_presence, &tmp);
+ int ret = clear_page_presence(f, false);
WARN_ONCE(ret < 0,
KERN_ERR "kmmio disarming 0x%08lx failed.\n", f->page);
f->armed = false;
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip:tracing/core] tracing: x86, mmiotrace: only register for die notifier when tracer active
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: only register for die notifier when tracer active Stuart Bennett
2009-04-29 9:39 ` Ingo Molnar
@ 2009-04-29 11:05 ` tip-bot for Stuart Bennett
1 sibling, 0 replies; 11+ messages in thread
From: tip-bot for Stuart Bennett @ 2009-04-29 11:05 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, rostedt, pq, stuart, tglx, mingo
Commit-ID: 0f9a623dd6c9b5b4dd00c232f29525bfc7a8ecf2
Gitweb: http://git.kernel.org/tip/0f9a623dd6c9b5b4dd00c232f29525bfc7a8ecf2
Author: Stuart Bennett <stuart@freedesktop.org>
AuthorDate: Tue, 28 Apr 2009 20:17:51 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 29 Apr 2009 11:33:34 +0200
tracing: x86, mmiotrace: only register for die notifier when tracer active
Follow up to afcfe024aebd74b0984a41af9a34e009cf5badaf in Linus' tree
("x86: mmiotrace: quieten spurious warning message")
Signed-off-by: Stuart Bennett <stuart@freedesktop.org>
Acked-by: Pekka Paalanen <pq@iki.fi>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1240946271-7083-5-git-send-email-stuart@freedesktop.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/mm/kmmio.c | 27 ++++++++++++++++++++++-----
arch/x86/mm/mmio-mod.c | 2 ++
include/linux/mmiotrace.h | 2 ++
3 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
index a769d1a..256ce64 100644
--- a/arch/x86/mm/kmmio.c
+++ b/arch/x86/mm/kmmio.c
@@ -311,7 +311,12 @@ static int post_kmmio_handler(unsigned long condition, struct pt_regs *regs)
struct kmmio_context *ctx = &get_cpu_var(kmmio_ctx);
if (!ctx->active) {
- pr_debug("kmmio: spurious debug trap on CPU %d.\n",
+ /*
+ * debug traps without an active context are due to either
+ * something external causing them (f.e. using a debugger while
+ * mmio tracing enabled), or erroneous behaviour
+ */
+ pr_warning("kmmio: unexpected debug trap on CPU %d.\n",
smp_processor_id());
goto out;
}
@@ -529,8 +534,8 @@ void unregister_kmmio_probe(struct kmmio_probe *p)
}
EXPORT_SYMBOL(unregister_kmmio_probe);
-static int kmmio_die_notifier(struct notifier_block *nb, unsigned long val,
- void *args)
+static int
+kmmio_die_notifier(struct notifier_block *nb, unsigned long val, void *args)
{
struct die_args *arg = args;
@@ -545,11 +550,23 @@ static struct notifier_block nb_die = {
.notifier_call = kmmio_die_notifier
};
-static int __init init_kmmio(void)
+int kmmio_init(void)
{
int i;
+
for (i = 0; i < KMMIO_PAGE_TABLE_SIZE; i++)
INIT_LIST_HEAD(&kmmio_page_table[i]);
+
return register_die_notifier(&nb_die);
}
-fs_initcall(init_kmmio); /* should be before device_initcall() */
+
+void kmmio_cleanup(void)
+{
+ int i;
+
+ unregister_die_notifier(&nb_die);
+ for (i = 0; i < KMMIO_PAGE_TABLE_SIZE; i++) {
+ WARN_ONCE(!list_empty(&kmmio_page_table[i]),
+ KERN_ERR "kmmio_page_table not empty at cleanup, any further tracing will leak memory.\n");
+ }
+}
diff --git a/arch/x86/mm/mmio-mod.c b/arch/x86/mm/mmio-mod.c
index c9342ed..132772a 100644
--- a/arch/x86/mm/mmio-mod.c
+++ b/arch/x86/mm/mmio-mod.c
@@ -451,6 +451,7 @@ void enable_mmiotrace(void)
if (nommiotrace)
pr_info(NAME "MMIO tracing disabled.\n");
+ kmmio_init();
enter_uniprocessor();
spin_lock_irq(&trace_lock);
atomic_inc(&mmiotrace_enabled);
@@ -473,6 +474,7 @@ void disable_mmiotrace(void)
clear_trace_list(); /* guarantees: no more kmmio callbacks */
leave_uniprocessor();
+ kmmio_cleanup();
pr_info(NAME "disabled.\n");
out:
mutex_unlock(&mmiotrace_mutex);
diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h
index 3d1b7bd..97491f7 100644
--- a/include/linux/mmiotrace.h
+++ b/include/linux/mmiotrace.h
@@ -30,6 +30,8 @@ extern unsigned int kmmio_count;
extern int register_kmmio_probe(struct kmmio_probe *p);
extern void unregister_kmmio_probe(struct kmmio_probe *p);
+extern int kmmio_init(void);
+extern void kmmio_cleanup(void);
#ifdef CONFIG_MMIOTRACE
/* kmmio is active by some kmmio_probes? */
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2009-04-29 11:06 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-04-28 19:17 [PATCH 0/4] mmiotrace: various fixes and cleaning Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: fix range test Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: code consistency/legibility improvement Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: refactor clearing/restore of page presence Stuart Bennett
2009-04-28 19:17 ` [PATCH] x86 mmiotrace: only register for die notifier when tracer active Stuart Bennett
2009-04-29 9:39 ` Ingo Molnar
2009-04-29 11:05 ` [tip:tracing/core] tracing: x86, " tip-bot for Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/core] tracing: x86, mmiotrace: refactor clearing/restore of page presence tip-bot for Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/core] tracing: x86, mmiotrace: code consistency/legibility improvement tip-bot for Stuart Bennett
2009-04-29 11:04 ` [tip:tracing/urgent] tracing: x86, mmiotrace: fix range test tip-bot for Stuart Bennett
2009-04-29 9:36 ` [PATCH 0/4] mmiotrace: various fixes and cleaning Ingo Molnar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome