forked from luck/tmp_suning_uos_patched
net: openvswitch: silence suspicious RCU usage warning
Silence suspicious RCU usage warning in ovs_flow_tbl_masks_cache_resize()
by replacing rcu_dereference() with rcu_dereference_ovsl().
In addition, when creating a new datapath, make sure it's configured under
the ovs_lock.
Fixes: 9bf24f594c
("net: openvswitch: make masks cache size configurable")
Reported-by: syzbot+9a8f8bfcc56e8578016c@syzkaller.appspotmail.com
Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
Link: https://lore.kernel.org/r/160439190002.56943.1418882726496275961.stgit@ebuild
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
dbfe394dad
commit
fea07a487c
|
@ -1703,13 +1703,13 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
|||
parms.port_no = OVSP_LOCAL;
|
||||
parms.upcall_portids = a[OVS_DP_ATTR_UPCALL_PID];
|
||||
|
||||
err = ovs_dp_change(dp, a);
|
||||
if (err)
|
||||
goto err_destroy_meters;
|
||||
|
||||
/* So far only local changes have been made, now need the lock. */
|
||||
ovs_lock();
|
||||
|
||||
err = ovs_dp_change(dp, a);
|
||||
if (err)
|
||||
goto err_unlock_and_destroy_meters;
|
||||
|
||||
vport = new_vport(&parms);
|
||||
if (IS_ERR(vport)) {
|
||||
err = PTR_ERR(vport);
|
||||
|
@ -1725,8 +1725,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
|||
ovs_dp_reset_user_features(skb, info);
|
||||
}
|
||||
|
||||
ovs_unlock();
|
||||
goto err_destroy_meters;
|
||||
goto err_unlock_and_destroy_meters;
|
||||
}
|
||||
|
||||
err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
|
||||
|
@ -1741,7 +1740,8 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
|||
ovs_notify(&dp_datapath_genl_family, reply, info);
|
||||
return 0;
|
||||
|
||||
err_destroy_meters:
|
||||
err_unlock_and_destroy_meters:
|
||||
ovs_unlock();
|
||||
ovs_meters_exit(dp);
|
||||
err_destroy_ports:
|
||||
kfree(dp->ports);
|
||||
|
|
|
@ -390,7 +390,7 @@ static struct mask_cache *tbl_mask_cache_alloc(u32 size)
|
|||
}
|
||||
int ovs_flow_tbl_masks_cache_resize(struct flow_table *table, u32 size)
|
||||
{
|
||||
struct mask_cache *mc = rcu_dereference(table->mask_cache);
|
||||
struct mask_cache *mc = rcu_dereference_ovsl(table->mask_cache);
|
||||
struct mask_cache *new;
|
||||
|
||||
if (size == mc->cache_size)
|
||||
|
|
Loading…
Reference in New Issue
Block a user