]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
nfp: add locking around representor changes
authorJakub Kicinski <jakub.kicinski@netronome.com>
Wed, 28 Nov 2018 06:24:55 +0000 (22:24 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 30 Nov 2018 21:30:44 +0000 (13:30 -0800)
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>
drivers/net/ethernet/netronome/nfp/abm/main.c
drivers/net/ethernet/netronome/nfp/nfp_app.c
drivers/net/ethernet/netronome/nfp/nfp_net_repr.c

index 7a4d55f794c23cc946766bd802cac188ae9172f9..80e79447b644afe8eb6b1312553224f74df8be20 100644 (file)
@@ -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));
index 4a1b8f79e7313d2b2cac0cabdce283ea01a63c2d..1175539143421a40608755037d4f0bc6453b6f00 100644 (file)
@@ -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;
 }
index b9904f6b41f80717b4923cba4e413f1c8ad56617..0a1d761c6692f982c413de6f022102d4e7b394d6 100644 (file)
@@ -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);
        }