Re: [PATCH] ipmi: fix suspicious RCU usage warning
From: Paul E. McKenney
Date: Wed Mar 12 2025 - 13:31:08 EST
On Wed, Mar 12, 2025 at 01:19:32PM -0400, Rik van Riel wrote:
> On recent kernels this warning fires:
>
> drivers/char/ipmi/ipmi_msghandler.c:1238 RCU-list traversed in non-reader section!!
>
> This looks like a fairly simple lockdep trigger, where
> list_for_each_entry_rcu and list_for_each_entry_srcu are
> functionally identical, but the lockdep annotation in
> the former has an extra check.
>
> That extra check is whether the RCU read lock is held,
> which is not true when the code uses srcu_read_lock.
>
> Get rid of the warning by using the properly annotated
> list traversal macro.
>
> Signed-off-by: Rik van Riel <riel@xxxxxxxxxxx>
> ---
> drivers/char/ipmi/ipmi_msghandler.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
> index 1e5313748f8b..a2823763fd37 100644
> --- a/drivers/char/ipmi/ipmi_msghandler.c
> +++ b/drivers/char/ipmi/ipmi_msghandler.c
> @@ -1235,7 +1235,7 @@ int ipmi_create_user(unsigned int if_num,
> return -ENOMEM;
>
> index = srcu_read_lock(&ipmi_interfaces_srcu);
> - list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
> + list_for_each_entry_srcu(intf, &ipmi_interfaces, link) {
Doesn't the above line want to be something like this?
+ list_for_each_entry_srcu(intf, &ipmi_interfaces, link,
srcu_read_lock_held(&ipmi_interfaces_srcu)) {
> if (intf->intf_num == if_num)
> goto found;
> }
> --
> 2.48.1
>