Commit 7c550daf authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

net: fib_notifier: make FIB notifier per-netns



Currently all users of FIB notifier only cares about events in init_net.
Later in this patchset, users get interested in other namespaces too.
However, for every registered block user is interested only about one
namespace. Make the FIB notifier registration per-netns and avoid
unnecessary calls of notifier block for other namespaces.

Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a5facc4c
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -248,9 +248,6 @@ static int mlx5_lag_fib_event(struct notifier_block *nb,
	struct net_device *fib_dev;
	struct fib_info *fi;

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

	if (info->family != AF_INET)
		return NOTIFY_DONE;

@@ -311,7 +308,7 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev)
		return 0;

	mp->fib_nb.notifier_call = mlx5_lag_fib_event;
	err = register_fib_notifier(&mp->fib_nb,
	err = register_fib_notifier(&init_net, &mp->fib_nb,
				    mlx5_lag_fib_event_flush);
	if (err)
		mp->fib_nb.notifier_call = NULL;
@@ -326,6 +323,6 @@ void mlx5_lag_mp_cleanup(struct mlx5_lag *ldev)
	if (!mp->fib_nb.notifier_call)
		return;

	unregister_fib_notifier(&mp->fib_nb);
	unregister_fib_notifier(&init_net, &mp->fib_nb);
	mp->fib_nb.notifier_call = NULL;
}
+4 −5
Original line number Diff line number Diff line
@@ -6213,7 +6213,7 @@ static int mlxsw_sp_router_fib_rule_event(unsigned long event,
	rule = fr_info->rule;

	/* Rule only affects locally generated traffic */
	if (rule->iifindex == info->net->loopback_dev->ifindex)
	if (rule->iifindex == init_net.loopback_dev->ifindex)
		return 0;

	switch (info->family) {
@@ -6250,8 +6250,7 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb,
	struct mlxsw_sp_router *router;
	int err;

	if (!net_eq(info->net, &init_net) ||
	    (info->family != AF_INET && info->family != AF_INET6 &&
	if ((info->family != AF_INET && info->family != AF_INET6 &&
	     info->family != RTNL_FAMILY_IPMR &&
	     info->family != RTNL_FAMILY_IP6MR))
		return NOTIFY_DONE;
@@ -8155,7 +8154,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
		goto err_dscp_init;

	mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event;
	err = register_fib_notifier(&mlxsw_sp->router->fib_nb,
	err = register_fib_notifier(&init_net, &mlxsw_sp->router->fib_nb,
				    mlxsw_sp_router_fib_dump_flush);
	if (err)
		goto err_register_fib_notifier;
@@ -8195,7 +8194,7 @@ err_register_inetaddr_notifier:

void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
{
	unregister_fib_notifier(&mlxsw_sp->router->fib_nb);
	unregister_fib_notifier(&init_net, &mlxsw_sp->router->fib_nb);
	unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
	mlxsw_sp_neigh_fini(mlxsw_sp);
	mlxsw_sp_vrs_fini(mlxsw_sp);
+3 −6
Original line number Diff line number Diff line
@@ -2189,9 +2189,6 @@ static int rocker_router_fib_event(struct notifier_block *nb,
	struct rocker_fib_event_work *fib_work;
	struct fib_notifier_info *info = ptr;

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

	if (info->family != AF_INET)
		return NOTIFY_DONE;

@@ -2994,7 +2991,7 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	 * the device, so no need to pass a callback.
	 */
	rocker->fib_nb.notifier_call = rocker_router_fib_event;
	err = register_fib_notifier(&rocker->fib_nb, NULL);
	err = register_fib_notifier(&init_net, &rocker->fib_nb, NULL);
	if (err)
		goto err_register_fib_notifier;

@@ -3021,7 +3018,7 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id)
err_register_switchdev_blocking_notifier:
	unregister_switchdev_notifier(&rocker_switchdev_notifier);
err_register_switchdev_notifier:
	unregister_fib_notifier(&rocker->fib_nb);
	unregister_fib_notifier(&init_net, &rocker->fib_nb);
err_register_fib_notifier:
	rocker_remove_ports(rocker);
err_probe_ports:
@@ -3057,7 +3054,7 @@ static void rocker_remove(struct pci_dev *pdev)
	unregister_switchdev_blocking_notifier(nb);

	unregister_switchdev_notifier(&rocker_switchdev_notifier);
	unregister_fib_notifier(&rocker->fib_nb);
	unregister_fib_notifier(&init_net, &rocker->fib_nb);
	rocker_remove_ports(rocker);
	rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET);
	destroy_workqueue(rocker->rocker_owq);
+3 −5
Original line number Diff line number Diff line
@@ -182,9 +182,6 @@ static int nsim_fib_event_nb(struct notifier_block *nb, unsigned long event,
	struct fib_notifier_info *info = ptr;
	int err = 0;

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

	switch (event) {
	case FIB_EVENT_RULE_ADD: /* fall through */
	case FIB_EVENT_RULE_DEL:
@@ -258,7 +255,8 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink)
	data->ipv6.rules.max = (u64)-1;

	data->fib_nb.notifier_call = nsim_fib_event_nb;
	err = register_fib_notifier(&data->fib_nb, nsim_fib_dump_inconsistent);
	err = register_fib_notifier(&init_net, &data->fib_nb,
				    nsim_fib_dump_inconsistent);
	if (err) {
		pr_err("Failed to register fib notifier\n");
		goto err_out;
@@ -297,6 +295,6 @@ void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *data)
					    NSIM_RESOURCE_IPV4_FIB_RULES);
	devlink_resource_occ_get_unregister(devlink,
					    NSIM_RESOURCE_IPV4_FIB);
	unregister_fib_notifier(&data->fib_nb);
	unregister_fib_notifier(&init_net, &data->fib_nb);
	kfree(data);
}
+2 −8
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ struct vif_entry_notifier_info {
};

static inline int mr_call_vif_notifier(struct notifier_block *nb,
				       struct net *net,
				       unsigned short family,
				       enum fib_event_type event_type,
				       struct vif_device *vif,
@@ -56,7 +55,6 @@ static inline int mr_call_vif_notifier(struct notifier_block *nb,
	struct vif_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.dev = vif->dev,
		.vif_index = vif_index,
@@ -64,7 +62,7 @@ static inline int mr_call_vif_notifier(struct notifier_block *nb,
		.tb_id = tb_id,
	};

	return call_fib_notifier(nb, net, event_type, &info.info);
	return call_fib_notifier(nb, event_type, &info.info);
}

static inline int mr_call_vif_notifiers(struct net *net,
@@ -77,7 +75,6 @@ static inline int mr_call_vif_notifiers(struct net *net,
	struct vif_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.dev = vif->dev,
		.vif_index = vif_index,
@@ -173,7 +170,6 @@ struct mfc_entry_notifier_info {
};

static inline int mr_call_mfc_notifier(struct notifier_block *nb,
				       struct net *net,
				       unsigned short family,
				       enum fib_event_type event_type,
				       struct mr_mfc *mfc, u32 tb_id)
@@ -181,13 +177,12 @@ static inline int mr_call_mfc_notifier(struct notifier_block *nb,
	struct mfc_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.mfc = mfc,
		.tb_id = tb_id
	};

	return call_fib_notifier(nb, net, event_type, &info.info);
	return call_fib_notifier(nb, event_type, &info.info);
}

static inline int mr_call_mfc_notifiers(struct net *net,
@@ -199,7 +194,6 @@ static inline int mr_call_mfc_notifiers(struct net *net,
	struct mfc_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.mfc = mfc,
		.tb_id = tb_id
Loading