Skip to content

Commit

Permalink
nfp: resync repr state when port table sync
Browse files Browse the repository at this point in the history
If the NSP port table has been refreshed, resync the representor state
with the new port information. At the moment, this only entails looking
for invalid ports and killing off representors associated with them.

The repr instance becomes NULL which is safe since the app accessor
function for reprs returns NULL when it cannot access a repr.

Signed-off-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dirk van der Merwe authored and davem330 committed Nov 5, 2017
1 parent 51ccc37 commit 5fa27d5
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
6 changes: 6 additions & 0 deletions drivers/net/ethernet/netronome/nfp/nfp_net_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,7 @@ int nfp_net_refresh_port_table_sync(struct nfp_pf *pf)
struct nfp_eth_table *eth_table;
struct nfp_net *nn, *next;
struct nfp_port *port;
int err;

lockdep_assert_held(&pf->lock);

Expand Down Expand Up @@ -640,6 +641,11 @@ int nfp_net_refresh_port_table_sync(struct nfp_pf *pf)

kfree(eth_table);

/* Resync repr state. This may cause reprs to be removed. */
err = nfp_reprs_resync_phys_ports(pf->app);
if (err)
return err;

/* Shoot off the ports which became invalid */
list_for_each_entry_safe(nn, next, &pf->vnics, vnic_list) {
if (!nn->port || nn->port->type != NFP_PORT_INVALID)
Expand Down
47 changes: 47 additions & 0 deletions drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,3 +390,50 @@ struct nfp_reprs *nfp_reprs_alloc(unsigned int num_reprs)

return reprs;
}

int nfp_reprs_resync_phys_ports(struct nfp_app *app)
{
struct nfp_reprs *reprs, *old_reprs;
struct nfp_repr *repr;
int i;

old_reprs =
rcu_dereference_protected(app->reprs[NFP_REPR_TYPE_PHYS_PORT],
lockdep_is_held(&app->pf->lock));
if (!old_reprs)
return 0;

reprs = nfp_reprs_alloc(old_reprs->num_reprs);
if (!reprs)
return -ENOMEM;

for (i = 0; i < old_reprs->num_reprs; i++) {
if (!old_reprs->reprs[i])
continue;

repr = netdev_priv(old_reprs->reprs[i]);
if (repr->port->type == NFP_PORT_INVALID)
continue;

reprs->reprs[i] = old_reprs->reprs[i];
}

old_reprs = nfp_app_reprs_set(app, NFP_REPR_TYPE_PHYS_PORT, reprs);
synchronize_rcu();

/* Now we free up removed representors */
for (i = 0; i < old_reprs->num_reprs; i++) {
if (!old_reprs->reprs[i])
continue;

repr = netdev_priv(old_reprs->reprs[i]);
if (repr->port->type != NFP_PORT_INVALID)
continue;

nfp_app_repr_stop(app, repr);
nfp_repr_clean(repr);
}

kfree(old_reprs);
return 0;
}
1 change: 1 addition & 0 deletions drivers/net/ethernet/netronome/nfp/nfp_net_repr.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,5 +124,6 @@ void
nfp_reprs_clean_and_free_by_type(struct nfp_app *app,
enum nfp_repr_type type);
struct nfp_reprs *nfp_reprs_alloc(unsigned int num_reprs);
int nfp_reprs_resync_phys_ports(struct nfp_app *app);

#endif /* NFP_NET_REPR_H */

0 comments on commit 5fa27d5

Please sign in to comment.