|
@@ -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;
|