@@ -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