Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f65a33f authored by Petr Machata's avatar Petr Machata Committed by David S. Miller
Browse files

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: default avatarPetr Machata <petrm@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d18c5d19
Loading
Loading
Loading
Loading
+23 −15
Original line number Diff line number Diff line
@@ -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;

		if (!net_eq(net, &init_net))
			return NOTIFY_DONE;

		net_work = kzalloc(sizeof(*net_work), GFP_ATOMIC);
		if (!net_work)
			return NOTIFY_BAD;
		return mlxsw_sp_router_schedule_work(ptr, nb,
				mlxsw_sp_router_mp_hash_event_work);

		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;