mirror of https://gitee.com/openkylin/linux.git
mlxsw: spectrum: Extract work-scheduling into a new function
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>
This commit is contained in:
parent
d18c5d1995
commit
1f65a33fc7
|
@ -2436,17 +2436,36 @@ static void mlxsw_sp_router_mp_hash_event_work(struct work_struct *work)
|
||||||
kfree(net_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,
|
static int mlxsw_sp_router_netevent_event(struct notifier_block *nb,
|
||||||
unsigned long event, void *ptr)
|
unsigned long event, void *ptr)
|
||||||
{
|
{
|
||||||
struct mlxsw_sp_netevent_work *net_work;
|
struct mlxsw_sp_netevent_work *net_work;
|
||||||
struct mlxsw_sp_port *mlxsw_sp_port;
|
struct mlxsw_sp_port *mlxsw_sp_port;
|
||||||
struct mlxsw_sp_router *router;
|
|
||||||
struct mlxsw_sp *mlxsw_sp;
|
struct mlxsw_sp *mlxsw_sp;
|
||||||
unsigned long interval;
|
unsigned long interval;
|
||||||
struct neigh_parms *p;
|
struct neigh_parms *p;
|
||||||
struct neighbour *n;
|
struct neighbour *n;
|
||||||
struct net *net;
|
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case NETEVENT_DELAY_PROBE_TIME_UPDATE:
|
case NETEVENT_DELAY_PROBE_TIME_UPDATE:
|
||||||
|
@ -2500,20 +2519,9 @@ static int mlxsw_sp_router_netevent_event(struct notifier_block *nb,
|
||||||
break;
|
break;
|
||||||
case NETEVENT_IPV4_MPATH_HASH_UPDATE:
|
case NETEVENT_IPV4_MPATH_HASH_UPDATE:
|
||||||
case NETEVENT_IPV6_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;
|
return NOTIFY_DONE;
|
||||||
|
|
Loading…
Reference in New Issue