Commit 71844fac authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

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: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarJohn Hurley <john.hurley@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fbf60e37
...@@ -126,7 +126,9 @@ nfp_abm_spawn_repr(struct nfp_app *app, struct nfp_abm_link *alink, ...@@ -126,7 +126,9 @@ nfp_abm_spawn_repr(struct nfp_app *app, struct nfp_abm_link *alink,
reprs = nfp_reprs_get_locked(app, rtype); reprs = nfp_reprs_get_locked(app, rtype);
WARN(nfp_repr_get_locked(app, reprs, alink->id), "duplicate repr"); WARN(nfp_repr_get_locked(app, reprs, alink->id), "duplicate repr");
rtnl_lock();
rcu_assign_pointer(reprs->reprs[alink->id], netdev); rcu_assign_pointer(reprs->reprs[alink->id], netdev);
rtnl_unlock();
nfp_info(app->cpp, "%s Port %d Representor(%s) created\n", nfp_info(app->cpp, "%s Port %d Representor(%s) created\n",
ptype == NFP_PORT_PF_PORT ? "PCIe" : "Phys", ptype == NFP_PORT_PF_PORT ? "PCIe" : "Phys",
...@@ -152,7 +154,9 @@ nfp_abm_kill_repr(struct nfp_app *app, struct nfp_abm_link *alink, ...@@ -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); netdev = nfp_repr_get_locked(app, reprs, alink->id);
if (!netdev) if (!netdev)
return; return;
rtnl_lock();
rcu_assign_pointer(reprs->reprs[alink->id], NULL); rcu_assign_pointer(reprs->reprs[alink->id], NULL);
rtnl_unlock();
synchronize_rcu(); synchronize_rcu();
/* Cast to make sure nfp_repr_clean_and_free() takes a nfp_repr */ /* Cast to make sure nfp_repr_clean_and_free() takes a nfp_repr */
nfp_repr_clean_and_free((struct nfp_repr *)netdev_priv(netdev)); 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, ...@@ -131,7 +131,9 @@ nfp_app_reprs_set(struct nfp_app *app, enum nfp_repr_type type,
struct nfp_reprs *old; struct nfp_reprs *old;
old = nfp_reprs_get_locked(app, type); old = nfp_reprs_get_locked(app, type);
rtnl_lock();
rcu_assign_pointer(app->reprs[type], reprs); rcu_assign_pointer(app->reprs[type], reprs);
rtnl_unlock();
return old; return old;
} }
......
...@@ -445,7 +445,9 @@ int nfp_reprs_resync_phys_ports(struct nfp_app *app) ...@@ -445,7 +445,9 @@ int nfp_reprs_resync_phys_ports(struct nfp_app *app)
continue; continue;
nfp_app_repr_preclean(app, netdev); nfp_app_repr_preclean(app, netdev);
rtnl_lock();
rcu_assign_pointer(reprs->reprs[i], NULL); rcu_assign_pointer(reprs->reprs[i], NULL);
rtnl_unlock();
synchronize_rcu(); synchronize_rcu();
nfp_repr_clean(repr); nfp_repr_clean(repr);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment