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

ppc: bpf: Add SKF_AD_CPU for ppc32

Signed-off-by: Denis Kirjanov <kda@linux-powerpc.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Denis Kirjanov and committed by
David S. Miller
02290948 2ddadeab

+18 -13
+17
arch/powerpc/net/bpf_jit.h
··· 154 154 #define PPC_LL_OFFS(r, base, i) do { PPC_LWZ_OFFS(r, base, i); } while(0) 155 155 #endif 156 156 157 + #ifdef CONFIG_SMP 158 + #ifdef CONFIG_PPC64 159 + #define PPC_BPF_LOAD_CPU(r) \ 160 + do { BUILD_BUG_ON(FIELD_SIZEOF(struct paca_struct, paca_index) != 2); \ 161 + PPC_LHZ_OFFS(r, 13, offsetof(struct paca_struct, paca_index)); \ 162 + } while (0) 163 + #else 164 + #define PPC_BPF_LOAD_CPU(r) \ 165 + do { BUILD_BUG_ON(FIELD_SIZEOF(struct thread_info, cpu) != 4); \ 166 + PPC_LHZ_OFFS(r, (1 & ~(THREAD_SIZE - 1)), \ 167 + offsetof(struct thread_info, cpu)); \ 168 + } while(0) 169 + #endif 170 + #else 171 + #define PPC_BPF_LOAD_CPU(r) do { PPC_LI(r, 0); } while(0) 172 + #endif 173 + 157 174 #define PPC_CMPWI(a, i) EMIT(PPC_INST_CMPWI | ___PPC_RA(a) | IMM_L(i)) 158 175 #define PPC_CMPDI(a, i) EMIT(PPC_INST_CMPDI | ___PPC_RA(a) | IMM_L(i)) 159 176 #define PPC_CMPLWI(a, i) EMIT(PPC_INST_CMPLWI | ___PPC_RA(a) | IMM_L(i))
+1 -13
arch/powerpc/net/bpf_jit_comp.c
··· 411 411 PPC_SRWI(r_A, r_A, 5); 412 412 break; 413 413 case BPF_ANC | SKF_AD_CPU: 414 - #ifdef CONFIG_SMP 415 - /* 416 - * PACA ptr is r13: 417 - * raw_smp_processor_id() = local_paca->paca_index 418 - */ 419 - BUILD_BUG_ON(FIELD_SIZEOF(struct paca_struct, 420 - paca_index) != 2); 421 - PPC_LHZ_OFFS(r_A, 13, 422 - offsetof(struct paca_struct, paca_index)); 423 - #else 424 - PPC_LI(r_A, 0); 425 - #endif 414 + PPC_BPF_LOAD_CPU(r_A); 426 415 break; 427 - 428 416 /*** Absolute loads from packet header/data ***/ 429 417 case BPF_LD | BPF_W | BPF_ABS: 430 418 func = CHOOSE_LOAD_FUNC(K, sk_load_word);