ipmr: Fix RCU list debugging warning
Subsystems (3)
PATCH v2 1/2 ipmr: Fix RCU list debugging warning
ipmr_for_each_table() macro uses list_for_each_entry_rcu() for traversing outside of an RCU read side critical section but under the protection of rtnl_mutex. Hence, add the corresponding lockdep expression to silence the following false-positive warning at boot:
[ 4.319347] ============================= [ 4.319349] WARNING: suspicious RCU usage [ 4.319351] 5.5.4-stable #17 Tainted: G E [ 4.319352] ----------------------------- [ 4.319354] net/ipv4/ipmr.c:1757 RCU-list traversed in non-reader section!!
---
v2:
- Add appropriate Fixes tag
net/ipv4/ipmr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/ipmr.c +2 -1
@@ -110,7 +110,8 @@ static void ipmr_expire_process(struct timer_list *t);#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES #define ipmr_for_each_table (mrt, net) \ - list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list) + list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list, \ + lockdep_rtnl_is_held())static struct mr_table *ipmr_mr_table_iter (struct net *net,struct mr_table *mrt)
Signature · 1 line
2.24.1
PATCH v2 2/2 ipmr: Add lockdep expression to ipmr_for_each_table macro
During the initialization process, ipmr_new_table() is called to create new tables which in turn calls ipmr_get_table() which traverses net->ipv4.mr_tables without holding the writer lock. However, this is safe to do so as no tables exist at this time. Hence add a suitable lockdep expression to silence the following false-positive warning:
=============================
WARNING: suspicious RCU usage 5.7.0-rc3-next-20200428-syzkaller #0 Not tainted
-----------------------------net/ipv4/ipmr.c:136 RCU-list traversed in non-reader section!!
ipmr_get_table+0x130/0x160 net/ipv4/ipmr.c:136 ipmr_new_table net/ipv4/ipmr.c:403 [inline] ipmr_rules_init net/ipv4/ipmr.c:248 [inline] ipmr_net_init+0x133/0x430 net/ipv4/ipmr.c:3089
---
v2:
- Change the lockdep expression to check for list emptiness at init
- Add Fixes tag
- Add Reported-by tag for syzbot report
net/ipv4/ipmr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/ipmr.c +4 -3
@@ -109,9 +109,10 @@ static void mroute_clean_tables(struct mr_table *mrt, int flags);static void ipmr_expire_process (struct timer_list *t);#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES -#define ipmr_for_each_table (mrt, net) \ - list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list, \ - lockdep_rtnl_is_held()) +#define ipmr_for_each_table (mrt, net) \ + list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list, \ + lockdep_rtnl_is_held() || \ + list_empty(&net->ipv4.mr_tables))static struct mr_table *ipmr_mr_table_iter (struct net *net,struct mr_table *mrt)
Signature · 1 line
2.24.1
Re: [PATCH net v2 2/2] ipmr: Add lockdep expression to ipmr_for_each_table macro
From: Amol Grover <[email protected]>
Date: Thu, 14 May 2020 23:31:03 +0530
Quoted 18 lines
During the initialization process,
ipmr_new_table()is called to create new tables which in turn callsipmr_get_table()which traversesnet->ipv4.mr_tableswithout holding the writer lock. However, this is safe to do so as no tables exist at this time. Hence add a suitable lockdep expression to silence the following false-positive warning:=============================
WARNING: suspicious RCU usage 5.7.0-rc3-next-20200428-syzkaller #0 Not tainted
-----------------------------net/ipv4/ipmr.c:136RCU-list traversed in non-reader section!!ipmr_get_table+0x130/0x160 net/ipv4/ipmr.c:136 ipmr_new_table net/ipv4/ipmr.c:403 [inline] ipmr_rules_init net/ipv4/ipmr.c:248 [inline] ipmr_net_init+0x133/0x430 net/ipv4/ipmr.c:3089
Quoted 4 lines
Fixes f0ad0860d01e ("ipv4: ipmr: support multiple tables")Reported-by [email protected]Suggested-by Jakub Kicinski <[email protected]>Signed-off-by Amol Grover <[email protected]>
Applied.
From: Amol Grover <[email protected]>
Date: Thu, 14 May 2020 23:31:02 +0530
Quoted 6 lines
ipmr_for_each_table()macro useslist_for_each_entry_rcu()for traversing outside of an RCU read side critical section but under the protection ofrtnl_mutex. Hence, add the corresponding lockdep expression to silence the following false-positive warning at boot:
Quoted 8 lines
[ 4.319347] ============================= [ 4.319349] WARNING: suspicious RCU usage [ 4.319351] 5.5.4-stable #17 Tainted: G E [ 4.319352] ----------------------------- [ 4.319354] net/ipv4/ipmr.c:1757 RCU-list traversed in non-reader section!!Fixes f0ad0860d01e ("ipv4: ipmr: support multiple tables")Signed-off-by Amol Grover <[email protected]>
Applied.