18568c3ceSMartin KaFai Lau // SPDX-License-Identifier: GPL-2.0 28568c3ceSMartin KaFai Lau /* Copyright (c) 2020 Facebook */ 38568c3ceSMartin KaFai Lau 48568c3ceSMartin KaFai Lau #include "vmlinux.h" 58568c3ceSMartin KaFai Lau 68568c3ceSMartin KaFai Lau #include <bpf/bpf_helpers.h> 78568c3ceSMartin KaFai Lau 88568c3ceSMartin KaFai Lau extern const struct rq runqueues __ksym; /* struct type global var. */ 98568c3ceSMartin KaFai Lau extern const int bpf_prog_active __ksym; /* int type global var. */ 108568c3ceSMartin KaFai Lau 118568c3ceSMartin KaFai Lau SEC("raw_tp/sys_enter") handler(const void * ctx)128568c3ceSMartin KaFai Lauint handler(const void *ctx) 138568c3ceSMartin KaFai Lau { 148568c3ceSMartin KaFai Lau struct rq *rq; 158568c3ceSMartin KaFai Lau int *active; 168568c3ceSMartin KaFai Lau __u32 cpu; 178568c3ceSMartin KaFai Lau 188568c3ceSMartin KaFai Lau cpu = bpf_get_smp_processor_id(); 198568c3ceSMartin KaFai Lau rq = (struct rq *)bpf_per_cpu_ptr(&runqueues, cpu); 208568c3ceSMartin KaFai Lau active = (int *)bpf_per_cpu_ptr(&bpf_prog_active, cpu); 218568c3ceSMartin KaFai Lau if (active) { 228568c3ceSMartin KaFai Lau /* READ_ONCE */ 238568c3ceSMartin KaFai Lau *(volatile int *)active; 248568c3ceSMartin KaFai Lau /* !rq has not been tested, so verifier should reject. */ 258568c3ceSMartin KaFai Lau *(volatile int *)(&rq->cpu); 268568c3ceSMartin KaFai Lau } 278568c3ceSMartin KaFai Lau 288568c3ceSMartin KaFai Lau return 0; 298568c3ceSMartin KaFai Lau } 308568c3ceSMartin KaFai Lau 318568c3ceSMartin KaFai Lau char _license[] SEC("license") = "GPL"; 32