Commit 4a6f4fe8 authored by Christoph Lameter's avatar Christoph Lameter Committed by Tejun Heo
Browse files

drivers: Replace __get_cpu_var with __this_cpu_read if not used for an address.



__get_cpu_var() can be replaced with this_cpu_read and will then use a single
read instruction with implied address calculation to access the correct per cpu
instance.

However, the address of a per cpu variable passed to __this_cpu_read() cannot be
determed (since its an implied address conversion through segment prefixes).
Therefore apply this only to uses of __get_cpu_var where the addres of the
variable is not used.

V3->V4:
	- Move one instance of this_cpu_inc_return to a later patch
	  so that this one can go in without percpu infrastructrure
	  changes.

Sedat: fixed compile failure caused by an extra ')'.

Cc: Neil Horman <nhorman@tuxdriver.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Sedat Dilek <sedat.dilek@gmail.com>
Acked-by: default avatarH. Peter Anvin <hpa@zytor.com>
Signed-off-by: default avatarChristoph Lameter <cl@linux.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent 12938a92
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -746,7 +746,7 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
	struct acpi_processor *pr;
	struct acpi_processor_cx *cx = cpuidle_get_statedata(state);

	pr = __get_cpu_var(processors);
	pr = __this_cpu_read(processors);

	if (unlikely(!pr))
		return 0;
@@ -787,7 +787,7 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
	s64 idle_time_ns;
	s64 idle_time;

	pr = __get_cpu_var(processors);
	pr = __this_cpu_read(processors);

	if (unlikely(!pr))
		return 0;
@@ -864,7 +864,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
	s64 idle_time;


	pr = __get_cpu_var(processors);
	pr = __this_cpu_read(processors);

	if (unlikely(!pr))
		return 0;
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ static int __cpuidle_register_device(struct cpuidle_device *dev);
 */
static void cpuidle_idle_call(void)
{
	struct cpuidle_device *dev = __get_cpu_var(cpuidle_devices);
	struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
	struct cpuidle_state *target_state;
	int next_state;

+1 −1
Original line number Diff line number Diff line
@@ -619,7 +619,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
	s390_idle_check(regs, S390_lowcore.int_clock,
			S390_lowcore.async_enter_timer);
	irq_enter();
	__get_cpu_var(s390_idle).nohz_delay = 1;
	__this_cpu_write(s390_idle.nohz_delay, 1);
	if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator)
		/* Serve timer interrupts first. */
		clock_comparator_work();
+2 −2
Original line number Diff line number Diff line
@@ -78,10 +78,10 @@ void speakup_fake_down_arrow(void)
	/* don't change CPU */
	preempt_disable();

	__get_cpu_var(reporting_keystroke) = true;
	__this_cpu_write(reporting_keystroke, true);
	input_report_key(virt_keyboard, KEY_DOWN, PRESSED);
	input_report_key(virt_keyboard, KEY_DOWN, RELEASED);
	__get_cpu_var(reporting_keystroke) = false;
	__this_cpu_write(reporting_keystroke, false);

	/* reenable preemption */
	preempt_enable();