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

net: core: devlink.c: Use built-in RCU list checking

list_for_each_entry_rcu() has built-in RCU and lock checking.

Pass cond argument to list_for_each_entry_rcu() to silence
false lockdep warning when CONFIG_PROVE_RCU_LIST is enabled.

The devlink->lock is held when devlink_dpipe_table_find()
is called in non RCU read side section. Therefore, pass struct devlink
to devlink_dpipe_table_find() for lockdep checking.

Signed-off-by: Madhuparna Bhowmik <madhuparnabhowmik10@gmail.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Madhuparna Bhowmik and committed by
David S. Miller
2eb51c75 98c5f7d4

+10 -9
+10 -9
net/core/devlink.c
··· 2103 2103 2104 2104 static struct devlink_dpipe_table * 2105 2105 devlink_dpipe_table_find(struct list_head *dpipe_tables, 2106 - const char *table_name) 2106 + const char *table_name, struct devlink *devlink) 2107 2107 { 2108 2108 struct devlink_dpipe_table *table; 2109 - 2110 - list_for_each_entry_rcu(table, dpipe_tables, list) { 2109 + list_for_each_entry_rcu(table, dpipe_tables, list, 2110 + lockdep_is_held(&devlink->lock)) { 2111 2111 if (!strcmp(table->name, table_name)) 2112 2112 return table; 2113 2113 } ··· 2226 2226 2227 2227 table_name = nla_data(info->attrs[DEVLINK_ATTR_DPIPE_TABLE_NAME]); 2228 2228 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 2229 - table_name); 2229 + table_name, devlink); 2230 2230 if (!table) 2231 2231 return -EINVAL; 2232 2232 ··· 2382 2382 struct devlink_dpipe_table *table; 2383 2383 2384 2384 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 2385 - table_name); 2385 + table_name, devlink); 2386 2386 if (!table) 2387 2387 return -EINVAL; 2388 2388 ··· 6854 6854 6855 6855 rcu_read_lock(); 6856 6856 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 6857 - table_name); 6857 + table_name, devlink); 6858 6858 enabled = false; 6859 6859 if (table) 6860 6860 enabled = table->counters_enabled; ··· 6885 6885 6886 6886 mutex_lock(&devlink->lock); 6887 6887 6888 - if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name)) { 6888 + if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name, 6889 + devlink)) { 6889 6890 err = -EEXIST; 6890 6891 goto unlock; 6891 6892 } ··· 6922 6921 6923 6922 mutex_lock(&devlink->lock); 6924 6923 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 6925 - table_name); 6924 + table_name, devlink); 6926 6925 if (!table) 6927 6926 goto unlock; 6928 6927 list_del_rcu(&table->list); ··· 7079 7078 7080 7079 mutex_lock(&devlink->lock); 7081 7080 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 7082 - table_name); 7081 + table_name, devlink); 7083 7082 if (!table) { 7084 7083 err = -EINVAL; 7085 7084 goto out;