On Tue, Nov 07, 2023 at 06:19:37PM +0300, Dan Carpenter wrote: > Hello Paul E. McKenney, > > The patch 7939f0d7b28c: "rcu: Restrict access to RCU CPU stall > notifiers" from Nov 1, 2023 (linux-next), leads to the following > Smatch static checker warning: > > kernel/rcu/rcutorture.c:2502 rcu_torture_stall() > error: uninitialized symbol 'ret'. > > kernel/rcu/rcutorture.c > 2446 static int rcu_torture_stall(void *args) > 2447 { > 2448 int idx; > 2449 int ret; > 2450 unsigned long stop_at; > 2451 > 2452 VERBOSE_TOROUT_STRING("rcu_torture_stall task started"); > 2453 if (rcu_cpu_stall_notifiers) { > 2454 ret = rcu_stall_chain_notifier_register(&rcu_torture_stall_block); > 2455 if (ret) > 2456 pr_info("%s: rcu_stall_chain_notifier_register() returned %d, %sexpected.\n", > 2457 __func__, ret, !IS_ENABLED(CONFIG_RCU_STALL_COMMON) ? "un" : ""); > > ret is only initialized if rcu_cpu_stall_notifiers is true. > > 2458 } > 2459 if (stall_cpu_holdoff > 0) { > 2460 VERBOSE_TOROUT_STRING("rcu_torture_stall begin holdoff"); > 2461 schedule_timeout_interruptible(stall_cpu_holdoff * HZ); > 2462 VERBOSE_TOROUT_STRING("rcu_torture_stall end holdoff"); > 2463 } > 2464 if (!kthread_should_stop() && stall_gp_kthread > 0) { > 2465 VERBOSE_TOROUT_STRING("rcu_torture_stall begin GP stall"); > 2466 rcu_gp_set_torture_wait(stall_gp_kthread * HZ); > 2467 for (idx = 0; idx < stall_gp_kthread + 2; idx++) { > 2468 if (kthread_should_stop()) > 2469 break; > 2470 schedule_timeout_uninterruptible(HZ); > 2471 } > 2472 } > 2473 if (!kthread_should_stop() && stall_cpu > 0) { > 2474 VERBOSE_TOROUT_STRING("rcu_torture_stall begin CPU stall"); > 2475 stop_at = ktime_get_seconds() + stall_cpu; > 2476 /* RCU CPU stall is expected behavior in following code. */ > 2477 idx = cur_ops->readlock(); > 2478 if (stall_cpu_irqsoff) > 2479 local_irq_disable(); > 2480 else if (!stall_cpu_block) > 2481 preempt_disable(); > 2482 pr_alert("%s start on CPU %d.\n", > 2483 __func__, raw_smp_processor_id()); > 2484 while (ULONG_CMP_LT((unsigned long)ktime_get_seconds(), > 2485 stop_at)) > 2486 if (stall_cpu_block) { > 2487 #ifdef CONFIG_PREEMPTION > 2488 preempt_schedule(); > 2489 #else > 2490 schedule_timeout_uninterruptible(HZ); > 2491 #endif > 2492 } else if (stall_no_softlockup) { > 2493 touch_softlockup_watchdog(); > 2494 } > 2495 if (stall_cpu_irqsoff) > 2496 local_irq_enable(); > 2497 else if (!stall_cpu_block) > 2498 preempt_enable(); > 2499 cur_ops->readunlock(idx); > 2500 } > 2501 pr_alert("%s end.\n", __func__); > --> 2502 if (!ret) { > > Uninitialized here Good catch, thank you!!! > 2503 if (rcu_cpu_stall_notifiers) { > > But maybe we can just reverse the tests or delete one of the conditions? > > 2504 ret = rcu_stall_chain_notifier_unregister(&rcu_torture_stall_block); > 2505 if (ret) > 2506 pr_info("%s: rcu_stall_chain_notifier_unregister() returned %d.\n", __func__, ret); > 2507 } > 2508 } > 2509 torture_shutdown_absorb("rcu_torture_stall"); > 2510 while (!kthread_should_stop()) > 2511 schedule_timeout_interruptible(10 * HZ); > 2512 return 0; > 2513 } How does the following patch look, to be folded into the original with attribution? Thanx, Paul ------------------------------------------------------------------------ diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c index 9f0e6c1cad443..50ac86a348768 100644 --- a/kernel/rcu/rcutorture.c +++ b/kernel/rcu/rcutorture.c @@ -2503,12 +2503,10 @@ static int rcu_torture_stall(void *args) cur_ops->readunlock(idx); } pr_alert("%s end.\n", __func__); - if (!ret) { - if (rcu_cpu_stall_notifiers) { - ret = rcu_stall_chain_notifier_unregister(&rcu_torture_stall_block); - if (ret) - pr_info("%s: rcu_stall_chain_notifier_unregister() returned %d.\n", __func__, ret); - } + if (rcu_cpu_stall_notifiers && !ret) { + ret = rcu_stall_chain_notifier_unregister(&rcu_torture_stall_block); + if (ret) + pr_info("%s: rcu_stall_chain_notifier_unregister() returned %d.\n", __func__, ret); } torture_shutdown_absorb("rcu_torture_stall"); while (!kthread_should_stop())