linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Richard Henderson <rth@twiddle.net>
To: Christoph Lameter <cl@linux.com>, Tejun Heo <tj@kernel.org>
Cc: akpm@linuxfoundation.org, rostedt@goodmis.org,
	linux-kernel@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ivan Kokshaysky <ink@jurassic.park.msu.ru>,
	Matt Turner <mattst88@gmail.com>
Subject: Re: [PATCH 37/40] alpha: Replace __get_cpu_var
Date: Thu, 19 Dec 2013 13:18:58 -0800	[thread overview]
Message-ID: <52B362C2.8000407@twiddle.net> (raw)
In-Reply-To: <20131219155034.661090897@linux.com>

On 12/19/2013 07:50 AM, Christoph Lameter wrote:
> __get_cpu_var() is used for multiple purposes in the kernel source. One of
> them is address calculation via the form &__get_cpu_var(x).  This calculates
> the address for the instance of the percpu variable of the current processor
> based on an offset.
> 
> Other use cases are for storing and retrieving data from the current
> processors percpu area.  __get_cpu_var() can be used as an lvalue when
> writing data or on the right side of an assignment.
> 
> __get_cpu_var() is defined as :
> 
> 
> #define __get_cpu_var(var) (*this_cpu_ptr(&(var)))
> 
> 
> 
> __get_cpu_var() always only does an address determination. However, store
> and retrieve operations could use a segment prefix (or global register on
> other platforms) to avoid the address calculation.
> 
> this_cpu_write() and this_cpu_read() can directly take an offset into a
> percpu area and use optimized assembly code to read and write per cpu
> variables.
> 
> 
> This patch converts __get_cpu_var into either an explicit address
> calculation using this_cpu_ptr() or into a use of this_cpu operations that
> use the offset.  Thereby address calculations are avoided and less registers
> are used when code is generated.
> 
> At the end of the patch set all uses of __get_cpu_var have been removed so
> the macro is removed too.
> 
> The patch set includes passes over all arches as well. Once these operations
> are used throughout then specialized macros can be defined in non -x86
> arches as well in order to optimize per cpu access by f.e.  using a global
> register that may be set to the per cpu base.
> 
> 
> 
> 
> Transformations done to __get_cpu_var()
> 
> 
> 1. Determine the address of the percpu instance of the current processor.
> 
> 	DEFINE_PER_CPU(int, y);
> 	int *x = &__get_cpu_var(y);
> 
>     Converts to
> 
> 	int *x = this_cpu_ptr(&y);
> 
> 
> 2. Same as #1 but this time an array structure is involved.
> 
> 	DEFINE_PER_CPU(int, y[20]);
> 	int *x = __get_cpu_var(y);
> 
>     Converts to
> 
> 	int *x = this_cpu_ptr(y);
> 
> 
> 3. Retrieve the content of the current processors instance of a per cpu
> variable.
> 
> 	DEFINE_PER_CPU(int, y);
> 	int x = __get_cpu_var(y)
> 
>    Converts to
> 
> 	int x = __this_cpu_read(y);
> 
> 
> 4. Retrieve the content of a percpu struct
> 
> 	DEFINE_PER_CPU(struct mystruct, y);
> 	struct mystruct x = __get_cpu_var(y);
> 
>    Converts to
> 
> 	memcpy(&x, this_cpu_ptr(&y), sizeof(x));
> 
> 
> 5. Assignment to a per cpu variable
> 
> 	DEFINE_PER_CPU(int, y)
> 	__get_cpu_var(y) = x;
> 
>    Converts to
> 
> 	this_cpu_write(y, x);
> 
> 
> 6. Increment/Decrement etc of a per cpu variable
> 
> 	DEFINE_PER_CPU(int, y);
> 	__get_cpu_var(y)++
> 
>    Converts to
> 
> 	this_cpu_inc(y)
> 
> Cc: Richard Henderson <rth@twiddle.net>
> CC: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
> Cc: Matt Turner <mattst88@gmail.com>
> Signed-off-by: Christoph Lameter <cl@linux.com>

Acked-by: Richard Henderson <rth@twiddle.net>


r~

  reply	other threads:[~2013-12-19 21:19 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-19 15:50 [PATCH 00/40] percpu: Consistent per cpu operations V2 Christoph Lameter
2013-12-19 15:50 ` [PATCH 01/40] mm: Replace __get_cpu_var uses with this_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 02/40] tracing: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 03/40] percpu: Replace __get_cpu_var " Christoph Lameter
2013-12-19 15:50 ` [PATCH 04/40] kernel misc: Replace __get_cpu_var uses Christoph Lameter
2013-12-19 15:50 ` [PATCH 05/40] drivers/char/random: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 06/40] drivers/cpuidle: Replace __get_cpu_var uses for address calculation Christoph Lameter
2013-12-19 15:50 ` [PATCH 07/40] drivers/oprofile: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 08/40] drivers/leds: Replace __get_cpu_var use through this_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 09/40] drivers/clocksource: Replace __get_cpu_var used for address calculation Christoph Lameter
2013-12-19 15:50 ` [PATCH 10/40] staging/zsmalloc: Replace instances of using __get_cpu_var " Christoph Lameter
2013-12-19 15:50 ` [PATCH 11/40] parisc: Replace __get_cpu_var uses " Christoph Lameter
2013-12-19 15:50 ` [PATCH 12/40] metag: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 13/40] drivers/net/ethernet/tile: " Christoph Lameter
2013-12-19 15:59   ` Chris Metcalf
2013-12-19 15:50 ` [PATCH 14/40] percpu: Add raw_cpu_ops Christoph Lameter
2013-12-19 15:50 ` [PATCH 15/40] mm: Use raw_cpu ops for determining current NUMA node Christoph Lameter
2013-12-19 15:50 ` [PATCH 16/40] modules: Use raw_cpu_write for initialization of per cpu refcount Christoph Lameter
2013-12-19 15:50 ` [PATCH 17/40] net: Replace __this_cpu_inc in route.c with raw_cpu_inc Christoph Lameter
2013-12-19 15:50 ` [PATCH 18/40] percpu: Add preemption checks to __this_cpu ops Christoph Lameter
2013-12-19 17:16   ` David Daney
2013-12-19 17:37     ` Christoph Lameter
2013-12-19 15:50 ` [PATCH 19/40] time: Replace __get_cpu_var uses Christoph Lameter
2013-12-19 15:50 ` [PATCH 20/40] scheduler: Replace __get_cpu_var with this_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 21/40] block: Replace __this_cpu_ptr with raw_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 22/40] rcu: Replace __this_cpu_ptr uses " Christoph Lameter
2013-12-19 15:50 ` [PATCH 23/40] watchdog: Replace __raw_get_cpu_var uses Christoph Lameter
2013-12-19 15:50 ` [PATCH 24/40] net: Replace get_cpu_var through this_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 25/40] md: Replace __this_cpu_ptr with raw_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 26/40] irqchips: Replace __this_cpu_ptr uses Christoph Lameter
2013-12-19 15:50 ` [PATCH 27/40] x86: Replace __get_cpu_var uses Christoph Lameter
2013-12-19 15:50 ` [PATCH 28/40] arm: Replace __this_cpu_ptr with raw_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 29/40] mips: Replace __get_cpu_var uses Christoph Lameter
2013-12-19 17:46   ` David Daney
2013-12-19 21:10     ` Christoph Lameter
2013-12-19 23:08       ` David Daney
2013-12-20 17:43         ` Christoph Lameter
2013-12-20 17:49         ` Christoph Lameter
2013-12-19 21:31     ` Christoph Lameter
2013-12-19 15:50 ` [PATCH 30/40] s390: rename __this_cpu_ptr to raw_cpu_ptr Christoph Lameter
2013-12-19 15:50 ` [PATCH 31/40] ia64: Replace __get_cpu_var uses Christoph Lameter
2013-12-19 15:50 ` [PATCH 32/40] powerpc: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 33/40] sparc: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 34/40] tile: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 35/40] blackfin: " Christoph Lameter
2013-12-19 15:50 ` [PATCH 36/40] avr32: Replace __get_cpu_var with __this_cpu_write Christoph Lameter
2013-12-19 15:50 ` [PATCH 37/40] alpha: Replace __get_cpu_var Christoph Lameter
2013-12-19 21:18   ` Richard Henderson [this message]
2013-12-19 21:47   ` Max Filippov
2013-12-20 17:59     ` Christoph Lameter
2013-12-19 15:50 ` [PATCH 38/40] sh: Replace __get_cpu_var uses Christoph Lameter
2013-12-19 15:50 ` [PATCH 39/40] Remove __get_cpu_var and __raw_get_cpu_var macros [only in 3.15] Christoph Lameter
2013-12-19 15:50 ` [PATCH 40/40] percpu: Remove __this_cpu_ptr Christoph Lameter

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=52B362C2.8000407@twiddle.net \
    --to=rth@twiddle.net \
    --cc=akpm@linuxfoundation.org \
    --cc=cl@linux.com \
    --cc=ink@jurassic.park.msu.ru \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mattst88@gmail.com \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=tj@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).