1*221b5e76SChangwoo Min // SPDX-License-Identifier: GPL-2.0 2*221b5e76SChangwoo Min /* 3*221b5e76SChangwoo Min * Copyright (c) 2026 Valve Corporation. 4*221b5e76SChangwoo Min * Author: Changwoo Min <changwoo@igalia.com> 5*221b5e76SChangwoo Min */ 6*221b5e76SChangwoo Min 7*221b5e76SChangwoo Min #include <test_progs.h> 8*221b5e76SChangwoo Min #include <sys/syscall.h> 9*221b5e76SChangwoo Min #include "test_ctx.skel.h" 10*221b5e76SChangwoo Min 11*221b5e76SChangwoo Min void test_exe_ctx(void) 12*221b5e76SChangwoo Min { 13*221b5e76SChangwoo Min LIBBPF_OPTS(bpf_test_run_opts, opts); 14*221b5e76SChangwoo Min cpu_set_t old_cpuset, target_cpuset; 15*221b5e76SChangwoo Min struct test_ctx *skel; 16*221b5e76SChangwoo Min int err, prog_fd; 17*221b5e76SChangwoo Min 18*221b5e76SChangwoo Min /* 1. Pin the current process to CPU 0. */ 19*221b5e76SChangwoo Min if (sched_getaffinity(0, sizeof(old_cpuset), &old_cpuset) == 0) { 20*221b5e76SChangwoo Min CPU_ZERO(&target_cpuset); 21*221b5e76SChangwoo Min CPU_SET(0, &target_cpuset); 22*221b5e76SChangwoo Min ASSERT_OK(sched_setaffinity(0, sizeof(target_cpuset), 23*221b5e76SChangwoo Min &target_cpuset), "setaffinity"); 24*221b5e76SChangwoo Min } 25*221b5e76SChangwoo Min 26*221b5e76SChangwoo Min skel = test_ctx__open_and_load(); 27*221b5e76SChangwoo Min if (!ASSERT_OK_PTR(skel, "skel_load")) 28*221b5e76SChangwoo Min goto restore_affinity; 29*221b5e76SChangwoo Min 30*221b5e76SChangwoo Min err = test_ctx__attach(skel); 31*221b5e76SChangwoo Min if (!ASSERT_OK(err, "skel_attach")) 32*221b5e76SChangwoo Min goto cleanup; 33*221b5e76SChangwoo Min 34*221b5e76SChangwoo Min /* 2. When we run this, the kernel will execute the BPF prog on CPU 0. */ 35*221b5e76SChangwoo Min prog_fd = bpf_program__fd(skel->progs.trigger_all_contexts); 36*221b5e76SChangwoo Min err = bpf_prog_test_run_opts(prog_fd, &opts); 37*221b5e76SChangwoo Min ASSERT_OK(err, "test_run_trigger"); 38*221b5e76SChangwoo Min 39*221b5e76SChangwoo Min /* 3. Wait for the local CPU's softirq/tasklet to finish. */ 40*221b5e76SChangwoo Min for (int i = 0; i < 1000; i++) { 41*221b5e76SChangwoo Min if (skel->bss->count_task > 0 && 42*221b5e76SChangwoo Min skel->bss->count_hardirq > 0 && 43*221b5e76SChangwoo Min skel->bss->count_softirq > 0) 44*221b5e76SChangwoo Min break; 45*221b5e76SChangwoo Min usleep(1000); /* Wait 1ms per iteration, up to 1 sec total */ 46*221b5e76SChangwoo Min } 47*221b5e76SChangwoo Min 48*221b5e76SChangwoo Min /* On CPU 0, these should now all be non-zero. */ 49*221b5e76SChangwoo Min ASSERT_GT(skel->bss->count_task, 0, "task_ok"); 50*221b5e76SChangwoo Min ASSERT_GT(skel->bss->count_hardirq, 0, "hardirq_ok"); 51*221b5e76SChangwoo Min ASSERT_GT(skel->bss->count_softirq, 0, "softirq_ok"); 52*221b5e76SChangwoo Min 53*221b5e76SChangwoo Min cleanup: 54*221b5e76SChangwoo Min test_ctx__destroy(skel); 55*221b5e76SChangwoo Min 56*221b5e76SChangwoo Min restore_affinity: 57*221b5e76SChangwoo Min ASSERT_OK(sched_setaffinity(0, sizeof(old_cpuset), &old_cpuset), 58*221b5e76SChangwoo Min "restore_affinity"); 59*221b5e76SChangwoo Min } 60