From: linux@tjworld.net (TJ)
To: kernelnewbies@lists.kernelnewbies.org
Subject: what's with "get_cpu_ptr" and "put_cpu_ptr"?
Date: Sun, 30 Sep 2012 22:40:34 +0100 [thread overview]
Message-ID: <5068BC52.90402@tjworld.net> (raw)
In-Reply-To: <alpine.DEB.2.02.1209301028250.22066@oneiric>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 30/09/12 15:35, Robert P. J. Day wrote:>
> but toward the end, you can read where i'm a bit puzzled by two macros i ran across just this morning that i had never seen before, and defined in <linux/percpu.h>:
>
> #define get_cpu_ptr(var) ({ \ preempt_disable(); \ this_cpu_ptr(var); })
>
> #define put_cpu_ptr(var) do { \ (void)(var); \ preempt_enable(); \ } while (0)
You may be aware of this already, but if not, it's a very useful technique to find out *why* some code was added. Comments in the kernel are usually kept sparse and the 'why' is often in the commit
history.
$ git blame include/linux/percpu.h | grep get_cpu_ptr
8b8e2ec1e (Peter Zijlstra 2010-09-16 19:21:28 +0200 42) #define get_cpu_ptr(var) ({
$ git show 8b8e2ec1e
commit 8b8e2ec1eeca7f6941bc81cefc9663018d6ceb57
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
Date: Thu Sep 16 19:21:28 2010 +0200
percpu: Add {get,put}_cpu_ptr
These are similar to {get,put}_cpu_var() except for dynamically
allocated per-cpu memory.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Tejun Heo <tj@kernel.org>
LKML-Reference: <20100917093009.252867712@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
LKML (Linux Kernel Mailing List): https://lkml.org/lkml/2010/9/17/74
$ git blame kernel/events/core.c | grep 'cpuctx = get_cpu_ptr'
41945f6cc kernel/perf_event.c (Peter Zijlstra 2010-09-16 19:17:24 +0200 4229) cpuctx = get_cpu_ptr(pmu->pmu_cpu_context);
41945f6cc kernel/perf_event.c (Peter Zijlstra 2010-09-16 19:17:24 +0200 4375) cpuctx = get_cpu_ptr(pmu->pmu_cpu_context);
41945f6cc kernel/perf_event.c (Peter Zijlstra 2010-09-16 19:17:24 +0200 4571) cpuctx = get_cpu_ptr(pmu->pmu_cpu_context);
$ git show 41945f6cc
commit 41945f6ccf1e86f87fddf6b32db9cf431c05fb54
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
Date: Thu Sep 16 19:17:24 2010 +0200
perf: Avoid RCU vs preemption assumptions
The per-pmu per-cpu context patch converted things from
get_cpu_var() to this_cpu_ptr(), but that only works if
rcu_read_lock() actually disables preemption, and since
there is no such guarantee, we need to fix that.
Use the newly introduced {get,put}_cpu_ptr().
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Tejun Heo <tj@kernel.org>
LKML-Reference: <20100917093009.308453028@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Hope that helps.
TJ.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://www.enigmail.net/
iEYEARECAAYFAlBovEUACgkQ7+w3pCnNYID+4ACgi4oUU3n/ac+eUHGevjqgbN85
e24AniE1ASr6nzSHSXoJFNRy0Y85H1ou
=F8AK
-----END PGP SIGNATURE-----
prev parent reply other threads:[~2012-09-30 21:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-30 14:35 what's with "get_cpu_ptr" and "put_cpu_ptr"? Robert P. J. Day
2012-09-30 21:40 ` TJ [this message]
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=5068BC52.90402@tjworld.net \
--to=linux@tjworld.net \
--cc=kernelnewbies@lists.kernelnewbies.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.