From: Li Zhong <zhong@linux.vnet.ibm.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com,
x86@kernel.org, a.p.zijlstra@chello.nl, paulus@samba.org,
mingo@elte.hu, acme@ghostprotocols.net
Subject: [PATCH 2/2 x86] fix page faults by perf events in nmi if kmemcheck is enabled
Date: Mon, 20 Feb 2012 14:07:46 +0800 [thread overview]
Message-ID: <1329718066.3448.33.camel@ThinkPad-T61> (raw)
In-Reply-To: <1329717879.3448.30.camel@ThinkPad-T61>
This patch tries to use __get_free_pages for the perf_event and it's
callchain buffers if CONFIG_KMEMCHECK is enabled.
Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
---
kernel/events/callchain.c | 29 +++++++++++++++++++++++++++++
kernel/events/core.c | 13 +++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c
index 6581a04..57f5eaa 100644
--- a/kernel/events/callchain.c
+++ b/kernel/events/callchain.c
@@ -38,13 +38,25 @@ static void release_callchain_buffers_rcu(struct
rcu_head *head)
{
struct callchain_cpus_entries *entries;
int cpu;
+#ifdef CONFIG_KMEMCHECK
+ int size;
+
+ size = sizeof(struct perf_callchain_entry) * PERF_NR_CONTEXTS;
+#endif
entries = container_of(head, struct callchain_cpus_entries, rcu_head);
for_each_possible_cpu(cpu)
+#ifdef CONFIG_KMEMCHECK
+ free_pages((unsigned long)entries->cpu_entries[cpu],
+ get_order(size));
+ size = offsetof(struct callchain_cpus_entries,
cpu_entries[nr_cpu_ids]);
+ free_pages((unsigned long)entries, get_order(size));
+#else
kfree(entries->cpu_entries[cpu]);
kfree(entries);
+#endif
}
static void release_callchain_buffers(void)
@@ -69,15 +81,25 @@ static int alloc_callchain_buffers(void)
*/
size = offsetof(struct callchain_cpus_entries,
cpu_entries[nr_cpu_ids]);
+#ifdef CONFIG_KMEMCHECK
+ entries = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+ get_order(size));
+#else
entries = kzalloc(size, GFP_KERNEL);
+#endif
if (!entries)
return -ENOMEM;
size = sizeof(struct perf_callchain_entry) * PERF_NR_CONTEXTS;
for_each_possible_cpu(cpu) {
+#ifdef CONFIG_KMEMCHECK
+ entries->cpu_entries[cpu] = (void *)__get_free_pages(
+ GFP_KERNEL, get_order(size));
+#else
entries->cpu_entries[cpu] = kmalloc_node(size, GFP_KERNEL,
cpu_to_node(cpu));
+#endif
if (!entries->cpu_entries[cpu])
goto fail;
}
@@ -88,8 +110,15 @@ static int alloc_callchain_buffers(void)
fail:
for_each_possible_cpu(cpu)
+#ifdef CONFIG_KMEMCHECK
+ free_pages((unsigned long)entries->cpu_entries[cpu],
+ get_order(size));
+ size = offsetof(struct callchain_cpus_entries,
cpu_entries[nr_cpu_ids]);
+ free_pages((unsigned long)entries, get_order(size));
+#else
kfree(entries->cpu_entries[cpu]);
kfree(entries);
+#endif
return -ENOMEM;
}
diff --git a/kernel/events/core.c b/kernel/events/core.c
index ba36013..841c2ab 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2758,7 +2758,11 @@ static void free_event_rcu(struct rcu_head *head)
if (event->ns)
put_pid_ns(event->ns);
perf_event_free_filter(event);
+#ifdef CONFIG_KMEMCHECK
+ free_pages((unsigned long)event, get_order(sizeof(*event)));
+#else
kfree(event);
+#endif
}
static void ring_buffer_put(struct ring_buffer *rb);
@@ -5723,7 +5727,12 @@ perf_event_alloc(struct perf_event_attr *attr,
int cpu,
return ERR_PTR(-EINVAL);
}
+#ifdef CONFIG_KMEMCHECK
+ event = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+ get_order(sizeof(*event)));
+#else
event = kzalloc(sizeof(*event), GFP_KERNEL);
+#endif
if (!event)
return ERR_PTR(-ENOMEM);
@@ -5810,7 +5819,11 @@ done:
if (err) {
if (event->ns)
put_pid_ns(event->ns);
+#ifdef CONFIG_KMEMCHECK
+ free_pages((unsigned long)event, get_order(sizeof(*event)));
+#else
kfree(event);
+#endif
return ERR_PTR(err);
}
--
1.7.5.4
next prev parent reply other threads:[~2012-02-20 6:07 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-20 6:01 [PATCH 0/2 x86] fix some page faults in nmi if kmemcheck is enabled Li Zhong
2012-02-20 6:04 ` [PATCH 1/2 x86] fix page faults by nmi handler " Li Zhong
2012-02-20 6:07 ` Li Zhong [this message]
2012-02-20 11:00 ` [PATCH 0/2 x86] fix some page faults " Peter Zijlstra
2012-02-21 1:42 ` Li Zhong
2012-02-21 10:17 ` Peter Zijlstra
2012-02-23 9:53 ` Li Zhong
2012-02-27 10:58 ` Peter Zijlstra
2012-02-28 2:45 ` Li Zhong
2012-03-02 19:44 ` Don Zickus
2012-03-05 1:49 ` Li Zhong
2012-03-05 10:05 ` [PATCH v2 x86 1/2] fix page faults by nmiaction " Li Zhong
2012-03-05 10:29 ` Wim Van Sebroeck
2012-03-06 1:46 ` Li Zhong
2012-03-05 15:54 ` Don Zickus
2012-03-05 17:55 ` Peter Zijlstra
2012-03-05 17:49 ` Peter Zijlstra
2012-03-05 21:45 ` Don Zickus
2012-03-06 10:09 ` [PATCH v3 " Li Zhong
2012-03-06 10:27 ` Vegard Nossum
2012-03-09 9:52 ` Li Zhong
2012-03-06 15:00 ` Don Zickus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1329718066.3448.33.camel@ThinkPad-T61 \
--to=zhong@linux.vnet.ibm.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mingo@redhat.com \
--cc=paulus@samba.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.