]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
mlxsw: spectrum: Extract work-scheduling into a new function
authorPetr Machata <petrm@mellanox.com>
Tue, 31 Jul 2018 22:37:36 +0000 (00:37 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 Aug 2018 16:52:30 +0000 (09:52 -0700)
The boilerplate to schedule NETEVENT_IPV4_MPATH_HASH_UPDATE and
NETEVENT_IPV6_MPATH_HASH_UPDATE handling is almost equivalent to that of
NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE that's coming in the next
patch. The only difference is which actual worker function should be
called. Extract this boilerplate into a named function in order to allow
reuse.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 8d67f0123699992d2b6437ae80917bc326133eaf..5ee92762656749129e90e3ec2cac527999163c18 100644 (file)
@@ -2436,17 +2436,36 @@ static void mlxsw_sp_router_mp_hash_event_work(struct work_struct *work)
        kfree(net_work);
 }
 
+static int mlxsw_sp_router_schedule_work(struct net *net,
+                                        struct notifier_block *nb,
+                                        void (*cb)(struct work_struct *))
+{
+       struct mlxsw_sp_netevent_work *net_work;
+       struct mlxsw_sp_router *router;
+
+       if (!net_eq(net, &init_net))
+               return NOTIFY_DONE;
+
+       net_work = kzalloc(sizeof(*net_work), GFP_ATOMIC);
+       if (!net_work)
+               return NOTIFY_BAD;
+
+       router = container_of(nb, struct mlxsw_sp_router, netevent_nb);
+       INIT_WORK(&net_work->work, cb);
+       net_work->mlxsw_sp = router->mlxsw_sp;
+       mlxsw_core_schedule_work(&net_work->work);
+       return NOTIFY_DONE;
+}
+
 static int mlxsw_sp_router_netevent_event(struct notifier_block *nb,
                                          unsigned long event, void *ptr)
 {
        struct mlxsw_sp_netevent_work *net_work;
        struct mlxsw_sp_port *mlxsw_sp_port;
-       struct mlxsw_sp_router *router;
        struct mlxsw_sp *mlxsw_sp;
        unsigned long interval;
        struct neigh_parms *p;
        struct neighbour *n;
-       struct net *net;
 
        switch (event) {
        case NETEVENT_DELAY_PROBE_TIME_UPDATE:
@@ -2500,20 +2519,9 @@ static int mlxsw_sp_router_netevent_event(struct notifier_block *nb,
                break;
        case NETEVENT_IPV4_MPATH_HASH_UPDATE:
        case NETEVENT_IPV6_MPATH_HASH_UPDATE:
-               net = ptr;
+               return mlxsw_sp_router_schedule_work(ptr, nb,
+                               mlxsw_sp_router_mp_hash_event_work);
 
-               if (!net_eq(net, &init_net))
-                       return NOTIFY_DONE;
-
-               net_work = kzalloc(sizeof(*net_work), GFP_ATOMIC);
-               if (!net_work)
-                       return NOTIFY_BAD;
-
-               router = container_of(nb, struct mlxsw_sp_router, netevent_nb);
-               INIT_WORK(&net_work->work, mlxsw_sp_router_mp_hash_event_work);
-               net_work->mlxsw_sp = router->mlxsw_sp;
-               mlxsw_core_schedule_work(&net_work->work);
-               break;
        }
 
        return NOTIFY_DONE;