[问题描述] kernel-selftests.samples-bpf sampleip&spintest测试用例执行报错ERROR: loading /proc/kallsyms 执行日志如下: # selftests: samples-bpf: sampleip ======================================== ERROR: loading /proc/kallsyms not ok 1..1 selftests: samples-bpf: sampleip [FAIL] [重现环境]: cat /proc/kallsyms |wc -l 2961365 [root@localhost netfilter]# uname -r 6.6.102-5.2.1_rc1.an23.riscv64 [root@localhost netfilter]# cat /boot/config-6.6.102-5.2.1_rc1.an23.riscv64 |grep -i dma|grep -i heap # CONFIG_DMABUF_HEAPS is not set [root@localhost netfilter]# lscpu Architecture: riscv64 Byte Order: Little Endian CPU(s): 64 On-line CPU(s) list: 0-63 NUMA: NUMA node(s): 4 NUMA node0 CPU(s): 0-7,16-23 NUMA node1 CPU(s): 8-15,24-31 NUMA node2 CPU(s): 32-39,48-55 NUMA node3 CPU(s): 40-47,56-63 [root@localhost netfilter]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 953.9G 0 disk ├─nvme0n1p1 259:1 0 121.9M 0 part /boot/efi ├─nvme0n1p2 259:2 0 488M 0 part /boot ├─nvme0n1p3 259:3 0 143.1G 0 part / ├─nvme0n1p4 259:4 0 1K 0 part ├─nvme0n1p5 259:5 0 286.1G 0 part /fs/nvme0n1p5 └─nvme0n1p6 259:6 0 286.1G 0 part [root@localhost netfilter]# free -g total used free shared buff/cache available Mem: 61 2 0 0 59 59 Swap: 0 0 0 [root@localhost netfilter]# cat /proc/cmdline root=UUID=e297bfa3-2c55-44f8-90cb-ae8eb642d188 ro console=ttyS0,115200 root=LABEL=ROOT rootfstype=ext4 rootwait rw earlycon selinux=0 LANG=en_US.UTF-8 nvme.use_threaded_interrupts=1 nvme_core.io_timeout=3000 audit=0 per_numa_node_futex=disable gcc版本 gcc (GCC) 12.3.0 20230508 (Anolis OS 12.3.0-13) [重现步骤] 1.获取内核对应src.rpm包 (KERNEL_SRC_RPM=http://8.131.87.1/kojifiles/repos/dist-an23.3-riscv64-gcc14-build/latest/riscv64/toplink/work/tasks/5939/1035939/kernel-6.6.102-5.2.1_rc1.an23.src.rpm) rpm -ivh xxx.src.rpm 默认安装到/root下 yum install yum-utils yum-builddep -y /root/rpmbuild/SPECS/kernel.spec 自动安装前置依赖包 需要yum-utils rpmbuild -bp /root/rpmbuild/SPECS/kernel.spec # 这个步骤会打相关的patch, 解压缩tar包,生成BUILD目录 cd /root/rpmbuild/BUILD/kernel-*/linux-*/ make defconfig make headers_install make modules_prepare export VMLINUX_BTF=/usr/src/kernels/6.6.102-5.2.1_rc1.an23.riscv64/vmlinux make M=samples/bpf cd samples/bpf ./sampleip ./spintest [实际结果] 测试fail [期望结果] 测试pass [原因分析] 初步分析是 /proc/kallsyms的数量过大导致 cat /proc/kallsyms |wc -l 2961365 在/root/rpmbuild/BUILD/kernel-6.6.102-5.2.1_rc1.an23/linux-6.6.102-5.2.1_rc1.an23.riscv64/tools/testing/selftests/bpf/trace_helpers.c 文件中的定义的load_kallsyms的方法返回异常 函数的方法片段如下 #define MAX_SYMS 400000 static struct ksym syms[MAX_SYMS]; static int sym_cnt; static int ksym_cmp(const void *p1, const void *p2) { return ((struct ksym *)p1)->addr - ((struct ksym *)p2)->addr; } int load_kallsyms_refresh(void) { FILE *f; char func[256], buf[256]; char symbol; void *addr; int i = 0; sym_cnt = 0; f = fopen("/proc/kallsyms", "r"); if (!f) return -ENOENT; while (fgets(buf, sizeof(buf), f)) { if (sscanf(buf, "%p %c %s", &addr, &symbol, func) != 3) break; if (!addr) continue; if (i >= MAX_SYMS) return -EFBIG; syms[i].addr = (long) addr; syms[i].name = strdup(func); i++; } fclose(f); sym_cnt = i; qsort(syms, sym_cnt, sizeof(struct ksym), ksym_cmp); return 0; } int load_kallsyms(void) { /* * This is called/used from multiplace places, * load symbols just once. */ if (sym_cnt) return 0; return load_kallsyms_refresh(); }
根据6.6.102-5_rc1.1的结果,该测试case skip,不影响稳定性即可