Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

apparmor: improve get_buffers macro by using get_cpu_ptr

Refactor get_buffers so the cpu_ptr can be obtained in the outer
layer, instead of inside the macro.

This also enables us to cleanup the code and use get_cpu_ptr,
to handle the preempt_disable()

Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Seth Arnold <seth.arnold@canonical.com>

+16 -17
+16 -17
security/apparmor/include/path.h
··· 43 43 44 44 DECLARE_PER_CPU(struct aa_buffers, aa_buffers); 45 45 46 - #define ASSIGN(FN, X, N) ((X) = FN(N)) 47 - #define EVAL1(FN, X) ASSIGN(FN, X, 0) /*X = FN(0)*/ 48 - #define EVAL2(FN, X, Y...) do { ASSIGN(FN, X, 1); EVAL1(FN, Y); } while (0) 49 - #define EVAL(FN, X...) CONCATENATE(EVAL, COUNT_ARGS(X))(FN, X) 46 + #define ASSIGN(FN, A, X, N) ((X) = FN(A, N)) 47 + #define EVAL1(FN, A, X) ASSIGN(FN, A, X, 0) /*X = FN(0)*/ 48 + #define EVAL2(FN, A, X, Y...) \ 49 + do { ASSIGN(FN, A, X, 1); EVAL1(FN, A, Y); } while (0) 50 + #define EVAL(FN, A, X...) CONCATENATE(EVAL, COUNT_ARGS(X))(FN, A, X) 50 51 51 52 #define for_each_cpu_buffer(I) for ((I) = 0; (I) < MAX_PATH_BUFFERS; (I)++) 52 53 ··· 57 56 #define AA_BUG_PREEMPT_ENABLED(X) /* nop */ 58 57 #endif 59 58 60 - #define __get_buffer(N) ({ \ 61 - struct aa_buffers *__cpu_var; \ 59 + #define __get_buffer(C, N) ({ \ 62 60 AA_BUG_PREEMPT_ENABLED("__get_buffer without preempt disabled"); \ 63 - __cpu_var = this_cpu_ptr(&aa_buffers); \ 64 - __cpu_var->buf[(N)]; }) 61 + (C)->buf[(N)]; }) 65 62 66 - #define __get_buffers(X...) EVAL(__get_buffer, X) 63 + #define __get_buffers(C, X...) EVAL(__get_buffer, C, X) 67 64 68 65 #define __put_buffers(X, Y...) ((void)&(X)) 69 66 70 - #define get_buffers(X...) \ 71 - do { \ 72 - preempt_disable(); \ 73 - __get_buffers(X); \ 67 + #define get_buffers(X...) \ 68 + do { \ 69 + struct aa_buffers *__cpu_var = get_cpu_ptr(&aa_buffers); \ 70 + __get_buffers(__cpu_var, X); \ 74 71 } while (0) 75 72 76 - #define put_buffers(X, Y...) \ 77 - do { \ 78 - __put_buffers(X, Y); \ 79 - preempt_enable(); \ 73 + #define put_buffers(X, Y...) \ 74 + do { \ 75 + __put_buffers(X, Y); \ 76 + put_cpu_ptr(&aa_buffers); \ 80 77 } while (0) 81 78 82 79 #endif /* __AA_PATH_H */