Skip to content

Commit 455ca13

Browse files
ubizjakIngo Molnar
authored andcommitted
x86/percpu: Introduce the pcpu_binary_op() macro
Introduce the pcpu_binary_op() macro, a copy of the percpu_to_op() macro. Update percpu binary operators to use the new macro, since percpu_to_op() will be re-purposed as a raw percpu write accessor in a follow-up patch. No functional change intended. Signed-off-by: Uros Bizjak <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Josh Poimboeuf <[email protected]> Cc: Linus Torvalds <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 9776dd3 commit 455ca13

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

arch/x86/include/asm/percpu.h

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,19 @@ do { \
163163
: [var] "+m" (__my_cpu_var(_var))); \
164164
})
165165

166+
#define percpu_binary_op(size, qual, op, _var, _val) \
167+
do { \
168+
__pcpu_type_##size pto_val__ = __pcpu_cast_##size(_val); \
169+
if (0) { \
170+
typeof(_var) pto_tmp__; \
171+
pto_tmp__ = (_val); \
172+
(void)pto_tmp__; \
173+
} \
174+
asm qual(__pcpu_op2_##size(op, "%[val]", __percpu_arg([var])) \
175+
: [var] "+m" (__my_cpu_var(_var)) \
176+
: [val] __pcpu_reg_imm_##size(pto_val__)); \
177+
} while (0)
178+
166179
/*
167180
* Generate a percpu add to memory instruction and optimize code
168181
* if one is added or subtracted.
@@ -182,7 +195,7 @@ do { \
182195
else if (pao_ID__ == -1) \
183196
percpu_unary_op(size, qual, "dec", var); \
184197
else \
185-
percpu_to_op(size, qual, "add", var, val); \
198+
percpu_binary_op(size, qual, "add", var, val); \
186199
} while (0)
187200

188201
#define percpu_from_op(size, qual, op, _var) \
@@ -492,25 +505,25 @@ do { \
492505
#define raw_cpu_add_1(pcp, val) percpu_add_op(1, , (pcp), val)
493506
#define raw_cpu_add_2(pcp, val) percpu_add_op(2, , (pcp), val)
494507
#define raw_cpu_add_4(pcp, val) percpu_add_op(4, , (pcp), val)
495-
#define raw_cpu_and_1(pcp, val) percpu_to_op(1, , "and", (pcp), val)
496-
#define raw_cpu_and_2(pcp, val) percpu_to_op(2, , "and", (pcp), val)
497-
#define raw_cpu_and_4(pcp, val) percpu_to_op(4, , "and", (pcp), val)
498-
#define raw_cpu_or_1(pcp, val) percpu_to_op(1, , "or", (pcp), val)
499-
#define raw_cpu_or_2(pcp, val) percpu_to_op(2, , "or", (pcp), val)
500-
#define raw_cpu_or_4(pcp, val) percpu_to_op(4, , "or", (pcp), val)
508+
#define raw_cpu_and_1(pcp, val) percpu_binary_op(1, , "and", (pcp), val)
509+
#define raw_cpu_and_2(pcp, val) percpu_binary_op(2, , "and", (pcp), val)
510+
#define raw_cpu_and_4(pcp, val) percpu_binary_op(4, , "and", (pcp), val)
511+
#define raw_cpu_or_1(pcp, val) percpu_binary_op(1, , "or", (pcp), val)
512+
#define raw_cpu_or_2(pcp, val) percpu_binary_op(2, , "or", (pcp), val)
513+
#define raw_cpu_or_4(pcp, val) percpu_binary_op(4, , "or", (pcp), val)
501514
#define raw_cpu_xchg_1(pcp, val) raw_percpu_xchg_op(pcp, val)
502515
#define raw_cpu_xchg_2(pcp, val) raw_percpu_xchg_op(pcp, val)
503516
#define raw_cpu_xchg_4(pcp, val) raw_percpu_xchg_op(pcp, val)
504517

505518
#define this_cpu_add_1(pcp, val) percpu_add_op(1, volatile, (pcp), val)
506519
#define this_cpu_add_2(pcp, val) percpu_add_op(2, volatile, (pcp), val)
507520
#define this_cpu_add_4(pcp, val) percpu_add_op(4, volatile, (pcp), val)
508-
#define this_cpu_and_1(pcp, val) percpu_to_op(1, volatile, "and", (pcp), val)
509-
#define this_cpu_and_2(pcp, val) percpu_to_op(2, volatile, "and", (pcp), val)
510-
#define this_cpu_and_4(pcp, val) percpu_to_op(4, volatile, "and", (pcp), val)
511-
#define this_cpu_or_1(pcp, val) percpu_to_op(1, volatile, "or", (pcp), val)
512-
#define this_cpu_or_2(pcp, val) percpu_to_op(2, volatile, "or", (pcp), val)
513-
#define this_cpu_or_4(pcp, val) percpu_to_op(4, volatile, "or", (pcp), val)
521+
#define this_cpu_and_1(pcp, val) percpu_binary_op(1, volatile, "and", (pcp), val)
522+
#define this_cpu_and_2(pcp, val) percpu_binary_op(2, volatile, "and", (pcp), val)
523+
#define this_cpu_and_4(pcp, val) percpu_binary_op(4, volatile, "and", (pcp), val)
524+
#define this_cpu_or_1(pcp, val) percpu_binary_op(1, volatile, "or", (pcp), val)
525+
#define this_cpu_or_2(pcp, val) percpu_binary_op(2, volatile, "or", (pcp), val)
526+
#define this_cpu_or_4(pcp, val) percpu_binary_op(4, volatile, "or", (pcp), val)
514527
#define this_cpu_xchg_1(pcp, nval) this_percpu_xchg_op(pcp, nval)
515528
#define this_cpu_xchg_2(pcp, nval) this_percpu_xchg_op(pcp, nval)
516529
#define this_cpu_xchg_4(pcp, nval) this_percpu_xchg_op(pcp, nval)
@@ -543,16 +556,16 @@ do { \
543556
#define this_cpu_read_stable_8(pcp) percpu_stable_op(8, "mov", pcp)
544557

545558
#define raw_cpu_add_8(pcp, val) percpu_add_op(8, , (pcp), val)
546-
#define raw_cpu_and_8(pcp, val) percpu_to_op(8, , "and", (pcp), val)
547-
#define raw_cpu_or_8(pcp, val) percpu_to_op(8, , "or", (pcp), val)
559+
#define raw_cpu_and_8(pcp, val) percpu_binary_op(8, , "and", (pcp), val)
560+
#define raw_cpu_or_8(pcp, val) percpu_binary_op(8, , "or", (pcp), val)
548561
#define raw_cpu_add_return_8(pcp, val) percpu_add_return_op(8, , pcp, val)
549562
#define raw_cpu_xchg_8(pcp, nval) raw_percpu_xchg_op(pcp, nval)
550563
#define raw_cpu_cmpxchg_8(pcp, oval, nval) percpu_cmpxchg_op(8, , pcp, oval, nval)
551564
#define raw_cpu_try_cmpxchg_8(pcp, ovalp, nval) percpu_try_cmpxchg_op(8, , pcp, ovalp, nval)
552565

553566
#define this_cpu_add_8(pcp, val) percpu_add_op(8, volatile, (pcp), val)
554-
#define this_cpu_and_8(pcp, val) percpu_to_op(8, volatile, "and", (pcp), val)
555-
#define this_cpu_or_8(pcp, val) percpu_to_op(8, volatile, "or", (pcp), val)
567+
#define this_cpu_and_8(pcp, val) percpu_binary_op(8, volatile, "and", (pcp), val)
568+
#define this_cpu_or_8(pcp, val) percpu_binary_op(8, volatile, "or", (pcp), val)
556569
#define this_cpu_add_return_8(pcp, val) percpu_add_return_op(8, volatile, pcp, val)
557570
#define this_cpu_xchg_8(pcp, nval) this_percpu_xchg_op(pcp, nval)
558571
#define this_cpu_cmpxchg_8(pcp, oval, nval) percpu_cmpxchg_op(8, volatile, pcp, oval, nval)

0 commit comments

Comments
 (0)