mirror of https://gitee.com/openkylin/linux.git
nfp: add locking around representor changes
Up until now we never needed to keep a networking locks around representors accesses, we only accessed them when device was reconfigured (under nfp pf->lock) or on fast path (under RCU). Now we want to be able to iterate over all representors during notifications, so make sure representor assignment is done under RTNL lock. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: John Hurley <john.hurley@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fbf60e377d
commit
71844fac1e
|
@ -126,7 +126,9 @@ nfp_abm_spawn_repr(struct nfp_app *app, struct nfp_abm_link *alink,
|
|||
|
||||
reprs = nfp_reprs_get_locked(app, rtype);
|
||||
WARN(nfp_repr_get_locked(app, reprs, alink->id), "duplicate repr");
|
||||
rtnl_lock();
|
||||
rcu_assign_pointer(reprs->reprs[alink->id], netdev);
|
||||
rtnl_unlock();
|
||||
|
||||
nfp_info(app->cpp, "%s Port %d Representor(%s) created\n",
|
||||
ptype == NFP_PORT_PF_PORT ? "PCIe" : "Phys",
|
||||
|
@ -152,7 +154,9 @@ nfp_abm_kill_repr(struct nfp_app *app, struct nfp_abm_link *alink,
|
|||
netdev = nfp_repr_get_locked(app, reprs, alink->id);
|
||||
if (!netdev)
|
||||
return;
|
||||
rtnl_lock();
|
||||
rcu_assign_pointer(reprs->reprs[alink->id], NULL);
|
||||
rtnl_unlock();
|
||||
synchronize_rcu();
|
||||
/* Cast to make sure nfp_repr_clean_and_free() takes a nfp_repr */
|
||||
nfp_repr_clean_and_free((struct nfp_repr *)netdev_priv(netdev));
|
||||
|
|
|
@ -131,7 +131,9 @@ nfp_app_reprs_set(struct nfp_app *app, enum nfp_repr_type type,
|
|||
struct nfp_reprs *old;
|
||||
|
||||
old = nfp_reprs_get_locked(app, type);
|
||||
rtnl_lock();
|
||||
rcu_assign_pointer(app->reprs[type], reprs);
|
||||
rtnl_unlock();
|
||||
|
||||
return old;
|
||||
}
|
||||
|
|
|
@ -445,7 +445,9 @@ int nfp_reprs_resync_phys_ports(struct nfp_app *app)
|
|||
continue;
|
||||
|
||||
nfp_app_repr_preclean(app, netdev);
|
||||
rtnl_lock();
|
||||
rcu_assign_pointer(reprs->reprs[i], NULL);
|
||||
rtnl_unlock();
|
||||
synchronize_rcu();
|
||||
nfp_repr_clean(repr);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue