]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
mlxsw: spectrum_router: Introduce router lock
authorIdo Schimmel <idosch@mellanox.com>
Fri, 21 Feb 2020 17:54:09 +0000 (19:54 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 23 Feb 2020 05:24:51 +0000 (21:24 -0800)
Introduce a mutex to protect the internal structure of the routing code.
A single lock is added instead of a more fine-grained and complicated
locking scheme because there is not a lot of concurrency in the routing
code.

The main motivation is remove the dependence on RTNL lock, which is
currently used by both the process pushing routes to the kernel and the
workqueue pushing the routes to the underlying device.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h

index fe8c1f3866517f89cd241fa7df9401d5132d00bb..e2ddb6164f6c15a4d432a05ec2155e0808b3406b 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/refcount.h>
 #include <linux/jhash.h>
 #include <linux/net_namespace.h>
+#include <linux/mutex.h>
 #include <net/netevent.h>
 #include <net/neighbour.h>
 #include <net/arp.h>
@@ -8065,6 +8066,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
        router = kzalloc(sizeof(*mlxsw_sp->router), GFP_KERNEL);
        if (!router)
                return -ENOMEM;
+       mutex_init(&router->lock);
        mlxsw_sp->router = router;
        router->mlxsw_sp = mlxsw_sp;
 
@@ -8168,6 +8170,7 @@ err_router_init:
 err_register_inet6addr_notifier:
        unregister_inetaddr_notifier(&router->inetaddr_nb);
 err_register_inetaddr_notifier:
+       mutex_destroy(&mlxsw_sp->router->lock);
        kfree(mlxsw_sp->router);
        return err;
 }
@@ -8188,5 +8191,6 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
        __mlxsw_sp_router_fini(mlxsw_sp);
        unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb);
        unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb);
+       mutex_destroy(&mlxsw_sp->router->lock);
        kfree(mlxsw_sp->router);
 }
index 3c99db1f434b22674709323c50dab66207d89c7e..8418dc3ae967b2d3335c46ada0cea6c489eb1979 100644 (file)
@@ -47,6 +47,7 @@ struct mlxsw_sp_router {
        u32 adj_discard_index;
        bool adj_discard_index_valid;
        struct mlxsw_sp_router_nve_decap nve_decap_config;
+       struct mutex lock; /* Protects shared router resources */
 };
 
 struct mlxsw_sp_rif_ipip_lb;