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

selftests/bpf: Set the default value of consumer_cnt as 0

Considering that only bench_ringbufs.c supports consumer, just set the
default value of consumer_cnt as 0. After that, update the validity
check of consumer_cnt, remove unused consumer_thread code snippets and
set consumer_cnt as 1 in run_bench_ringbufs.sh accordingly.

Signed-off-by: Hou Tao <houtao1@huawei.com>
Link: https://lore.kernel.org/r/20230613080921.1623219-5-houtao@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Hou Tao and committed by
Alexei Starovoitov
970308a7 da77ae2b

+35 -128
+1 -1
tools/testing/selftests/bpf/bench.c
··· 17 17 .duration_sec = 5, 18 18 .affinity = false, 19 19 .quiet = false, 20 - .consumer_cnt = 1, 20 + .consumer_cnt = 0, 21 21 .producer_cnt = 1, 22 22 }; 23 23
+2 -12
tools/testing/selftests/bpf/benchs/bench_bloom_filter_map.c
··· 107 107 108 108 static void validate(void) 109 109 { 110 - if (env.consumer_cnt != 1) { 110 + if (env.consumer_cnt != 0) { 111 111 fprintf(stderr, 112 - "The bloom filter benchmarks do not support multi-consumer use\n"); 112 + "The bloom filter benchmarks do not support consumer\n"); 113 113 exit(1); 114 114 } 115 115 } ··· 421 421 last_false_hits = total_false_hits; 422 422 } 423 423 424 - static void *consumer(void *input) 425 - { 426 - return NULL; 427 - } 428 - 429 424 const struct bench bench_bloom_lookup = { 430 425 .name = "bloom-lookup", 431 426 .argp = &bench_bloom_map_argp, 432 427 .validate = validate, 433 428 .setup = bloom_lookup_setup, 434 429 .producer_thread = producer, 435 - .consumer_thread = consumer, 436 430 .measure = measure, 437 431 .report_progress = hits_drops_report_progress, 438 432 .report_final = hits_drops_report_final, ··· 438 444 .validate = validate, 439 445 .setup = bloom_update_setup, 440 446 .producer_thread = producer, 441 - .consumer_thread = consumer, 442 447 .measure = measure, 443 448 .report_progress = hits_drops_report_progress, 444 449 .report_final = hits_drops_report_final, ··· 449 456 .validate = validate, 450 457 .setup = false_positive_setup, 451 458 .producer_thread = producer, 452 - .consumer_thread = consumer, 453 459 .measure = measure, 454 460 .report_progress = false_hits_report_progress, 455 461 .report_final = false_hits_report_final, ··· 460 468 .validate = validate, 461 469 .setup = hashmap_no_bloom_setup, 462 470 .producer_thread = producer, 463 - .consumer_thread = consumer, 464 471 .measure = measure, 465 472 .report_progress = hits_drops_report_progress, 466 473 .report_final = hits_drops_report_final, ··· 471 480 .validate = validate, 472 481 .setup = hashmap_with_bloom_setup, 473 482 .producer_thread = producer, 474 - .consumer_thread = consumer, 475 483 .measure = measure, 476 484 .report_progress = hits_drops_report_progress, 477 485 .report_final = hits_drops_report_final,
+2 -8
tools/testing/selftests/bpf/benchs/bench_bpf_hashmap_full_update.c
··· 14 14 15 15 static void validate(void) 16 16 { 17 - if (env.consumer_cnt != 1) { 18 - fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 17 + if (env.consumer_cnt != 0) { 18 + fprintf(stderr, "benchmark doesn't support consumer!\n"); 19 19 exit(1); 20 20 } 21 21 } ··· 27 27 syscall(__NR_getpgid); 28 28 } 29 29 30 - return NULL; 31 - } 32 - 33 - static void *consumer(void *input) 34 - { 35 30 return NULL; 36 31 } 37 32 ··· 83 88 .validate = validate, 84 89 .setup = setup, 85 90 .producer_thread = producer, 86 - .consumer_thread = consumer, 87 91 .measure = measure, 88 92 .report_progress = NULL, 89 93 .report_final = hashmap_report_final,
+2 -8
tools/testing/selftests/bpf/benchs/bench_bpf_hashmap_lookup.c
··· 113 113 114 114 static void validate(void) 115 115 { 116 - if (env.consumer_cnt != 1) { 117 - fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 116 + if (env.consumer_cnt != 0) { 117 + fprintf(stderr, "benchmark doesn't support consumer!\n"); 118 118 exit(1); 119 119 } 120 120 ··· 131 131 /* trigger the bpf program */ 132 132 syscall(__NR_getpgid); 133 133 } 134 - return NULL; 135 - } 136 - 137 - static void *consumer(void *input) 138 - { 139 134 return NULL; 140 135 } 141 136 ··· 271 276 .validate = validate, 272 277 .setup = setup, 273 278 .producer_thread = producer, 274 - .consumer_thread = consumer, 275 279 .measure = measure, 276 280 .report_progress = NULL, 277 281 .report_final = hashmap_report_final,
+2 -8
tools/testing/selftests/bpf/benchs/bench_bpf_loop.c
··· 47 47 48 48 static void validate(void) 49 49 { 50 - if (env.consumer_cnt != 1) { 51 - fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 50 + if (env.consumer_cnt != 0) { 51 + fprintf(stderr, "benchmark doesn't support consumer!\n"); 52 52 exit(1); 53 53 } 54 54 } ··· 59 59 /* trigger the bpf program */ 60 60 syscall(__NR_getpgid); 61 61 62 - return NULL; 63 - } 64 - 65 - static void *consumer(void *input) 66 - { 67 62 return NULL; 68 63 } 69 64 ··· 94 99 .validate = validate, 95 100 .setup = setup, 96 101 .producer_thread = producer, 97 - .consumer_thread = consumer, 98 102 .measure = measure, 99 103 .report_progress = ops_report_progress, 100 104 .report_final = ops_report_final,
-12
tools/testing/selftests/bpf/benchs/bench_count.c
··· 18 18 return NULL; 19 19 } 20 20 21 - static void *count_global_consumer(void *input) 22 - { 23 - return NULL; 24 - } 25 - 26 21 static void count_global_measure(struct bench_res *res) 27 22 { 28 23 struct count_global_ctx *ctx = &count_global_ctx; ··· 51 56 return NULL; 52 57 } 53 58 54 - static void *count_local_consumer(void *input) 55 - { 56 - return NULL; 57 - } 58 - 59 59 static void count_local_measure(struct bench_res *res) 60 60 { 61 61 struct count_local_ctx *ctx = &count_local_ctx; ··· 64 74 const struct bench bench_count_global = { 65 75 .name = "count-global", 66 76 .producer_thread = count_global_producer, 67 - .consumer_thread = count_global_consumer, 68 77 .measure = count_global_measure, 69 78 .report_progress = hits_drops_report_progress, 70 79 .report_final = hits_drops_report_final, ··· 73 84 .name = "count-local", 74 85 .setup = count_local_setup, 75 86 .producer_thread = count_local_producer, 76 - .consumer_thread = count_local_consumer, 77 87 .measure = count_local_measure, 78 88 .report_progress = hits_drops_report_progress, 79 89 .report_final = hits_drops_report_final,
+2 -10
tools/testing/selftests/bpf/benchs/bench_local_storage.c
··· 74 74 fprintf(stderr, "benchmark doesn't support multi-producer!\n"); 75 75 exit(1); 76 76 } 77 - if (env.consumer_cnt != 1) { 78 - fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 77 + if (env.consumer_cnt != 0) { 78 + fprintf(stderr, "benchmark doesn't support consumer!\n"); 79 79 exit(1); 80 80 } 81 81 ··· 230 230 syscall(__NR_getpgid); 231 231 } 232 232 233 - static void *consumer(void *input) 234 - { 235 - return NULL; 236 - } 237 - 238 233 static void *producer(void *input) 239 234 { 240 235 while (true) ··· 254 259 .validate = validate, 255 260 .setup = local_storage_cache_get_setup, 256 261 .producer_thread = producer, 257 - .consumer_thread = consumer, 258 262 .measure = measure, 259 263 .report_progress = local_storage_report_progress, 260 264 .report_final = local_storage_report_final, ··· 265 271 .validate = validate, 266 272 .setup = local_storage_cache_get_interleaved_setup, 267 273 .producer_thread = producer, 268 - .consumer_thread = consumer, 269 274 .measure = measure, 270 275 .report_progress = local_storage_report_progress, 271 276 .report_final = local_storage_report_final, ··· 276 283 .validate = validate, 277 284 .setup = hashmap_setup, 278 285 .producer_thread = producer, 279 - .consumer_thread = consumer, 280 286 .measure = measure, 281 287 .report_progress = local_storage_report_progress, 282 288 .report_final = local_storage_report_final,
+1 -7
tools/testing/selftests/bpf/benchs/bench_local_storage_create.c
··· 71 71 72 72 static void validate(void) 73 73 { 74 - if (env.consumer_cnt > 1) { 74 + if (env.consumer_cnt != 0) { 75 75 fprintf(stderr, 76 76 "local-storage-create benchmark does not need consumer\n"); 77 77 exit(1); ··· 141 141 { 142 142 res->hits = atomic_swap(&skel->bss->create_cnts, 0); 143 143 res->drops = atomic_swap(&skel->bss->kmalloc_cnts, 0); 144 - } 145 - 146 - static void *consumer(void *input) 147 - { 148 - return NULL; 149 144 } 150 145 151 146 static void *sk_producer(void *input) ··· 252 257 .validate = validate, 253 258 .setup = setup, 254 259 .producer_thread = producer, 255 - .consumer_thread = consumer, 256 260 .measure = measure, 257 261 .report_progress = report_progress, 258 262 .report_final = report_final,
+2 -8
tools/testing/selftests/bpf/benchs/bench_local_storage_rcu_tasks_trace.c
··· 72 72 fprintf(stderr, "benchmark doesn't support multi-producer!\n"); 73 73 exit(1); 74 74 } 75 - if (env.consumer_cnt != 1) { 76 - fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 75 + if (env.consumer_cnt != 0) { 76 + fprintf(stderr, "benchmark doesn't support consumer!\n"); 77 77 exit(1); 78 78 } 79 79 ··· 197 197 ctx.prev_kthread_stime = ticks; 198 198 } 199 199 200 - static void *consumer(void *input) 201 - { 202 - return NULL; 203 - } 204 - 205 200 static void *producer(void *input) 206 201 { 207 202 while (true) ··· 257 262 .validate = validate, 258 263 .setup = local_storage_tasks_trace_setup, 259 264 .producer_thread = producer, 260 - .consumer_thread = consumer, 261 265 .measure = measure, 262 266 .report_progress = report_progress, 263 267 .report_final = report_final,
+2 -13
tools/testing/selftests/bpf/benchs/bench_rename.c
··· 17 17 fprintf(stderr, "benchmark doesn't support multi-producer!\n"); 18 18 exit(1); 19 19 } 20 - if (env.consumer_cnt != 1) { 21 - fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 20 + if (env.consumer_cnt != 0) { 21 + fprintf(stderr, "benchmark doesn't support consumer!\n"); 22 22 exit(1); 23 23 } 24 24 } ··· 106 106 attach_bpf(ctx.skel->progs.prog5); 107 107 } 108 108 109 - static void *consumer(void *input) 110 - { 111 - return NULL; 112 - } 113 - 114 109 const struct bench bench_rename_base = { 115 110 .name = "rename-base", 116 111 .validate = validate, 117 112 .setup = setup_base, 118 113 .producer_thread = producer, 119 - .consumer_thread = consumer, 120 114 .measure = measure, 121 115 .report_progress = hits_drops_report_progress, 122 116 .report_final = hits_drops_report_final, ··· 121 127 .validate = validate, 122 128 .setup = setup_kprobe, 123 129 .producer_thread = producer, 124 - .consumer_thread = consumer, 125 130 .measure = measure, 126 131 .report_progress = hits_drops_report_progress, 127 132 .report_final = hits_drops_report_final, ··· 131 138 .validate = validate, 132 139 .setup = setup_kretprobe, 133 140 .producer_thread = producer, 134 - .consumer_thread = consumer, 135 141 .measure = measure, 136 142 .report_progress = hits_drops_report_progress, 137 143 .report_final = hits_drops_report_final, ··· 141 149 .validate = validate, 142 150 .setup = setup_rawtp, 143 151 .producer_thread = producer, 144 - .consumer_thread = consumer, 145 152 .measure = measure, 146 153 .report_progress = hits_drops_report_progress, 147 154 .report_final = hits_drops_report_final, ··· 151 160 .validate = validate, 152 161 .setup = setup_fentry, 153 162 .producer_thread = producer, 154 - .consumer_thread = consumer, 155 163 .measure = measure, 156 164 .report_progress = hits_drops_report_progress, 157 165 .report_final = hits_drops_report_final, ··· 161 171 .validate = validate, 162 172 .setup = setup_fexit, 163 173 .producer_thread = producer, 164 - .consumer_thread = consumer, 165 174 .measure = measure, 166 175 .report_progress = hits_drops_report_progress, 167 176 .report_final = hits_drops_report_final,
+1 -1
tools/testing/selftests/bpf/benchs/bench_ringbufs.c
··· 96 96 static void bufs_validate(void) 97 97 { 98 98 if (env.consumer_cnt != 1) { 99 - fprintf(stderr, "rb-libbpf benchmark doesn't support multi-consumer!\n"); 99 + fprintf(stderr, "rb-libbpf benchmark needs one consumer!\n"); 100 100 exit(1); 101 101 } 102 102
+2 -9
tools/testing/selftests/bpf/benchs/bench_strncmp.c
··· 50 50 51 51 static void strncmp_validate(void) 52 52 { 53 - if (env.consumer_cnt != 1) { 54 - fprintf(stderr, "strncmp benchmark doesn't support multi-consumer!\n"); 53 + if (env.consumer_cnt != 0) { 54 + fprintf(stderr, "strncmp benchmark doesn't support consumer!\n"); 55 55 exit(1); 56 56 } 57 57 } ··· 128 128 return NULL; 129 129 } 130 130 131 - static void *strncmp_consumer(void *ctx) 132 - { 133 - return NULL; 134 - } 135 - 136 131 static void strncmp_measure(struct bench_res *res) 137 132 { 138 133 res->hits = atomic_swap(&ctx.skel->bss->hits, 0); ··· 139 144 .validate = strncmp_validate, 140 145 .setup = strncmp_no_helper_setup, 141 146 .producer_thread = strncmp_producer, 142 - .consumer_thread = strncmp_consumer, 143 147 .measure = strncmp_measure, 144 148 .report_progress = hits_drops_report_progress, 145 149 .report_final = hits_drops_report_final, ··· 150 156 .validate = strncmp_validate, 151 157 .setup = strncmp_helper_setup, 152 158 .producer_thread = strncmp_producer, 153 - .consumer_thread = strncmp_consumer, 154 159 .measure = strncmp_measure, 155 160 .report_progress = hits_drops_report_progress, 156 161 .report_final = hits_drops_report_final,
+2 -19
tools/testing/selftests/bpf/benchs/bench_trigger.c
··· 13 13 14 14 static void trigger_validate(void) 15 15 { 16 - if (env.consumer_cnt != 1) { 17 - fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 16 + if (env.consumer_cnt != 0) { 17 + fprintf(stderr, "benchmark doesn't support consumer!\n"); 18 18 exit(1); 19 19 } 20 20 } ··· 101 101 { 102 102 setup_ctx(); 103 103 attach_bpf(ctx.skel->progs.bench_trigger_fmodret); 104 - } 105 - 106 - static void *trigger_consumer(void *input) 107 - { 108 - return NULL; 109 104 } 110 105 111 106 /* make sure call is not inlined and not avoided by compiler, so __weak and ··· 200 205 .name = "trig-base", 201 206 .validate = trigger_validate, 202 207 .producer_thread = trigger_base_producer, 203 - .consumer_thread = trigger_consumer, 204 208 .measure = trigger_base_measure, 205 209 .report_progress = hits_drops_report_progress, 206 210 .report_final = hits_drops_report_final, ··· 210 216 .validate = trigger_validate, 211 217 .setup = trigger_tp_setup, 212 218 .producer_thread = trigger_producer, 213 - .consumer_thread = trigger_consumer, 214 219 .measure = trigger_measure, 215 220 .report_progress = hits_drops_report_progress, 216 221 .report_final = hits_drops_report_final, ··· 220 227 .validate = trigger_validate, 221 228 .setup = trigger_rawtp_setup, 222 229 .producer_thread = trigger_producer, 223 - .consumer_thread = trigger_consumer, 224 230 .measure = trigger_measure, 225 231 .report_progress = hits_drops_report_progress, 226 232 .report_final = hits_drops_report_final, ··· 230 238 .validate = trigger_validate, 231 239 .setup = trigger_kprobe_setup, 232 240 .producer_thread = trigger_producer, 233 - .consumer_thread = trigger_consumer, 234 241 .measure = trigger_measure, 235 242 .report_progress = hits_drops_report_progress, 236 243 .report_final = hits_drops_report_final, ··· 240 249 .validate = trigger_validate, 241 250 .setup = trigger_fentry_setup, 242 251 .producer_thread = trigger_producer, 243 - .consumer_thread = trigger_consumer, 244 252 .measure = trigger_measure, 245 253 .report_progress = hits_drops_report_progress, 246 254 .report_final = hits_drops_report_final, ··· 250 260 .validate = trigger_validate, 251 261 .setup = trigger_fentry_sleep_setup, 252 262 .producer_thread = trigger_producer, 253 - .consumer_thread = trigger_consumer, 254 263 .measure = trigger_measure, 255 264 .report_progress = hits_drops_report_progress, 256 265 .report_final = hits_drops_report_final, ··· 260 271 .validate = trigger_validate, 261 272 .setup = trigger_fmodret_setup, 262 273 .producer_thread = trigger_producer, 263 - .consumer_thread = trigger_consumer, 264 274 .measure = trigger_measure, 265 275 .report_progress = hits_drops_report_progress, 266 276 .report_final = hits_drops_report_final, ··· 269 281 .name = "trig-uprobe-base", 270 282 .setup = NULL, /* no uprobe/uretprobe is attached */ 271 283 .producer_thread = uprobe_base_producer, 272 - .consumer_thread = trigger_consumer, 273 284 .measure = trigger_base_measure, 274 285 .report_progress = hits_drops_report_progress, 275 286 .report_final = hits_drops_report_final, ··· 278 291 .name = "trig-uprobe-with-nop", 279 292 .setup = uprobe_setup_with_nop, 280 293 .producer_thread = uprobe_producer_with_nop, 281 - .consumer_thread = trigger_consumer, 282 294 .measure = trigger_measure, 283 295 .report_progress = hits_drops_report_progress, 284 296 .report_final = hits_drops_report_final, ··· 287 301 .name = "trig-uretprobe-with-nop", 288 302 .setup = uretprobe_setup_with_nop, 289 303 .producer_thread = uprobe_producer_with_nop, 290 - .consumer_thread = trigger_consumer, 291 304 .measure = trigger_measure, 292 305 .report_progress = hits_drops_report_progress, 293 306 .report_final = hits_drops_report_final, ··· 296 311 .name = "trig-uprobe-without-nop", 297 312 .setup = uprobe_setup_without_nop, 298 313 .producer_thread = uprobe_producer_without_nop, 299 - .consumer_thread = trigger_consumer, 300 314 .measure = trigger_measure, 301 315 .report_progress = hits_drops_report_progress, 302 316 .report_final = hits_drops_report_final, ··· 305 321 .name = "trig-uretprobe-without-nop", 306 322 .setup = uretprobe_setup_without_nop, 307 323 .producer_thread = uprobe_producer_without_nop, 308 - .consumer_thread = trigger_consumer, 309 324 .measure = trigger_measure, 310 325 .report_progress = hits_drops_report_progress, 311 326 .report_final = hits_drops_report_final,
+14 -12
tools/testing/selftests/bpf/benchs/run_bench_ringbufs.sh
··· 4 4 5 5 set -eufo pipefail 6 6 7 + RUN_RB_BENCH="$RUN_BENCH -c1" 8 + 7 9 header "Single-producer, parallel producer" 8 10 for b in rb-libbpf rb-custom pb-libbpf pb-custom; do 9 - summarize $b "$($RUN_BENCH $b)" 11 + summarize $b "$($RUN_RB_BENCH $b)" 10 12 done 11 13 12 14 header "Single-producer, parallel producer, sampled notification" 13 15 for b in rb-libbpf rb-custom pb-libbpf pb-custom; do 14 - summarize $b "$($RUN_BENCH --rb-sampled $b)" 16 + summarize $b "$($RUN_RB_BENCH --rb-sampled $b)" 15 17 done 16 18 17 19 header "Single-producer, back-to-back mode" 18 20 for b in rb-libbpf rb-custom pb-libbpf pb-custom; do 19 - summarize $b "$($RUN_BENCH --rb-b2b $b)" 20 - summarize $b-sampled "$($RUN_BENCH --rb-sampled --rb-b2b $b)" 21 + summarize $b "$($RUN_RB_BENCH --rb-b2b $b)" 22 + summarize $b-sampled "$($RUN_RB_BENCH --rb-sampled --rb-b2b $b)" 21 23 done 22 24 23 25 header "Ringbuf back-to-back, effect of sample rate" 24 26 for b in 1 5 10 25 50 100 250 500 1000 2000 3000; do 25 - summarize "rb-sampled-$b" "$($RUN_BENCH --rb-b2b --rb-batch-cnt $b --rb-sampled --rb-sample-rate $b rb-custom)" 27 + summarize "rb-sampled-$b" "$($RUN_RB_BENCH --rb-b2b --rb-batch-cnt $b --rb-sampled --rb-sample-rate $b rb-custom)" 26 28 done 27 29 header "Perfbuf back-to-back, effect of sample rate" 28 30 for b in 1 5 10 25 50 100 250 500 1000 2000 3000; do 29 - summarize "pb-sampled-$b" "$($RUN_BENCH --rb-b2b --rb-batch-cnt $b --rb-sampled --rb-sample-rate $b pb-custom)" 31 + summarize "pb-sampled-$b" "$($RUN_RB_BENCH --rb-b2b --rb-batch-cnt $b --rb-sampled --rb-sample-rate $b pb-custom)" 30 32 done 31 33 32 34 header "Ringbuf back-to-back, reserve+commit vs output" 33 - summarize "reserve" "$($RUN_BENCH --rb-b2b rb-custom)" 34 - summarize "output" "$($RUN_BENCH --rb-b2b --rb-use-output rb-custom)" 35 + summarize "reserve" "$($RUN_RB_BENCH --rb-b2b rb-custom)" 36 + summarize "output" "$($RUN_RB_BENCH --rb-b2b --rb-use-output rb-custom)" 35 37 36 38 header "Ringbuf sampled, reserve+commit vs output" 37 - summarize "reserve-sampled" "$($RUN_BENCH --rb-sampled rb-custom)" 38 - summarize "output-sampled" "$($RUN_BENCH --rb-sampled --rb-use-output rb-custom)" 39 + summarize "reserve-sampled" "$($RUN_RB_BENCH --rb-sampled rb-custom)" 40 + summarize "output-sampled" "$($RUN_RB_BENCH --rb-sampled --rb-use-output rb-custom)" 39 41 40 42 header "Single-producer, consumer/producer competing on the same CPU, low batch count" 41 43 for b in rb-libbpf rb-custom pb-libbpf pb-custom; do 42 - summarize $b "$($RUN_BENCH --rb-batch-cnt 1 --rb-sample-rate 1 --prod-affinity 0 --cons-affinity 0 $b)" 44 + summarize $b "$($RUN_RB_BENCH --rb-batch-cnt 1 --rb-sample-rate 1 --prod-affinity 0 --cons-affinity 0 $b)" 43 45 done 44 46 45 47 header "Ringbuf, multi-producer contention" 46 48 for b in 1 2 3 4 8 12 16 20 24 28 32 36 40 44 48 52; do 47 - summarize "rb-libbpf nr_prod $b" "$($RUN_BENCH -p$b --rb-batch-cnt 50 rb-libbpf)" 49 + summarize "rb-libbpf nr_prod $b" "$($RUN_RB_BENCH -p$b --rb-batch-cnt 50 rb-libbpf)" 48 50 done 49 51