@@ -163,6 +163,19 @@ do { \
163
163
: [var] "+m" (__my_cpu_var(_var))); \
164
164
})
165
165
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
+
166
179
/*
167
180
* Generate a percpu add to memory instruction and optimize code
168
181
* if one is added or subtracted.
@@ -182,7 +195,7 @@ do { \
182
195
else if (pao_ID__ == -1) \
183
196
percpu_unary_op(size, qual, "dec", var); \
184
197
else \
185
- percpu_to_op (size, qual, "add", var, val); \
198
+ percpu_binary_op (size, qual, "add", var, val); \
186
199
} while (0)
187
200
188
201
#define percpu_from_op (size , qual , op , _var ) \
@@ -492,25 +505,25 @@ do { \
492
505
#define raw_cpu_add_1 (pcp , val ) percpu_add_op(1, , (pcp), val)
493
506
#define raw_cpu_add_2 (pcp , val ) percpu_add_op(2, , (pcp), val)
494
507
#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)
501
514
#define raw_cpu_xchg_1 (pcp , val ) raw_percpu_xchg_op(pcp, val)
502
515
#define raw_cpu_xchg_2 (pcp , val ) raw_percpu_xchg_op(pcp, val)
503
516
#define raw_cpu_xchg_4 (pcp , val ) raw_percpu_xchg_op(pcp, val)
504
517
505
518
#define this_cpu_add_1 (pcp , val ) percpu_add_op(1, volatile, (pcp), val)
506
519
#define this_cpu_add_2 (pcp , val ) percpu_add_op(2, volatile, (pcp), val)
507
520
#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)
514
527
#define this_cpu_xchg_1 (pcp , nval ) this_percpu_xchg_op(pcp, nval)
515
528
#define this_cpu_xchg_2 (pcp , nval ) this_percpu_xchg_op(pcp, nval)
516
529
#define this_cpu_xchg_4 (pcp , nval ) this_percpu_xchg_op(pcp, nval)
@@ -543,16 +556,16 @@ do { \
543
556
#define this_cpu_read_stable_8 (pcp ) percpu_stable_op(8, "mov", pcp)
544
557
545
558
#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)
548
561
#define raw_cpu_add_return_8 (pcp , val ) percpu_add_return_op(8, , pcp, val)
549
562
#define raw_cpu_xchg_8 (pcp , nval ) raw_percpu_xchg_op(pcp, nval)
550
563
#define raw_cpu_cmpxchg_8 (pcp , oval , nval ) percpu_cmpxchg_op(8, , pcp, oval, nval)
551
564
#define raw_cpu_try_cmpxchg_8 (pcp , ovalp , nval ) percpu_try_cmpxchg_op(8, , pcp, ovalp, nval)
552
565
553
566
#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)
556
569
#define this_cpu_add_return_8 (pcp , val ) percpu_add_return_op(8, volatile, pcp, val)
557
570
#define this_cpu_xchg_8 (pcp , nval ) this_percpu_xchg_op(pcp, nval)
558
571
#define this_cpu_cmpxchg_8 (pcp , oval , nval ) percpu_cmpxchg_op(8, volatile, pcp, oval, nval)
0 commit comments