int nfp_reprs_resync_phys_ports(struct nfp_app *app) { struct net_device *netdev; struct nfp_reprs *reprs; struct nfp_repr *repr; int i; reprs = nfp_reprs_get_locked(app, NFP_REPR_TYPE_PHYS_PORT); if (!reprs) return 0; for (i = 0; i < reprs->num_reprs; i++) { netdev = nfp_repr_get_locked(app, reprs, i); if (!netdev) continue; repr = netdev_priv(netdev); if (repr->port->type != NFP_PORT_INVALID) continue; nfp_app_repr_preclean(app, netdev); rtnl_lock(); rcu_assign_pointer(reprs->reprs[i], NULL); rtnl_unlock(); synchronize_rcu(); nfp_repr_clean(repr); } return 0; }
void nfp_reprs_clean_and_free_by_type(struct nfp_app *app, enum nfp_repr_type type) { struct net_device *netdev; struct nfp_reprs *reprs; int i; reprs = rcu_dereference_protected(app->reprs[type], lockdep_is_held(&app->pf->lock)); if (!reprs) return; /* Preclean must happen before we remove the reprs reference from the * app below. */ for (i = 0; i < reprs->num_reprs; i++) { netdev = nfp_repr_get_locked(app, reprs, i); if (netdev) nfp_app_repr_preclean(app, netdev); } reprs = nfp_app_reprs_set(app, type, NULL); synchronize_rcu(); nfp_reprs_clean_and_free(app, reprs); }
static int nfp_flower_reprs_reify(struct nfp_app *app, enum nfp_repr_type type, bool exists) { struct nfp_reprs *reprs; int i, err, count = 0; reprs = rcu_dereference_protected(app->reprs[type], lockdep_is_held(&app->pf->lock)); if (!reprs) return 0; for (i = 0; i < reprs->num_reprs; i++) { struct net_device *netdev; netdev = nfp_repr_get_locked(app, reprs, i); if (netdev) { struct nfp_repr *repr = netdev_priv(netdev); err = nfp_flower_cmsg_portreify(repr, exists); if (err) return err; count++; } } return count; }
void nfp_reprs_clean_and_free(struct nfp_app *app, struct nfp_reprs *reprs) { struct net_device *netdev; unsigned int i; for (i = 0; i < reprs->num_reprs; i++) { netdev = nfp_repr_get_locked(app, reprs, i); if (netdev) nfp_repr_clean_and_free(netdev_priv(netdev)); } kfree(reprs); }