Commit 53bac833 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'rtnetlink-use-rtnl_register_many'

Kuniyuki Iwashima says:

====================
rtnetlink: Use rtnl_register_many().

This series converts all rtnl_register() and rtnl_register_module()
to rtnl_register_many() and finally removes them.

Once this series is applied, I'll start converting doit() to per-netns
RTNL.

v1: https://lore.kernel.org/20241011220550.46040-1-kuniyu@amazon.com/
====================

Link: https://patch.msgid.link/20241014201828.91221-1-kuniyu@amazon.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents df241295 e1c6c383
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -29,6 +29,16 @@ static inline enum rtnl_kinds rtnl_msgtype_kind(int msgtype)
	return msgtype & RTNL_KIND_MASK;
}

/**
 *	struct rtnl_msg_handler - rtnetlink message type and handlers
 *
 *	@owner: NULL for built-in, THIS_MODULE for module
 *	@protocol: Protocol family or PF_UNSPEC
 *	@msgtype: rtnetlink message type
 *	@doit: Function pointer called for each request message
 *	@dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
 *	@flags: rtnl_link_flags to modify behaviour of doit/dumpit functions
 */
struct rtnl_msg_handler {
	struct module *owner;
	int protocol;
@@ -38,11 +48,6 @@ struct rtnl_msg_handler {
	int flags;
};

void rtnl_register(int protocol, int msgtype,
		   rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
int rtnl_register_module(struct module *owner, int protocol, int msgtype,
			 rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
int rtnl_unregister(int protocol, int msgtype);
void rtnl_unregister_all(int protocol);

int __rtnl_register_many(const struct rtnl_msg_handler *handlers, int n);
+12 −17
Original line number Diff line number Diff line
@@ -1265,6 +1265,15 @@ static struct pernet_operations cangw_pernet_ops = {
	.exit_batch = cangw_pernet_exit_batch,
};

static const struct rtnl_msg_handler cgw_rtnl_msg_handlers[] __initconst_or_module = {
	{.owner = THIS_MODULE, .protocol = PF_CAN, .msgtype = RTM_NEWROUTE,
	 .doit = cgw_create_job},
	{.owner = THIS_MODULE, .protocol = PF_CAN, .msgtype = RTM_DELROUTE,
	 .doit = cgw_remove_job},
	{.owner = THIS_MODULE, .protocol = PF_CAN, .msgtype = RTM_GETROUTE,
	 .dumpit = cgw_dump_jobs},
};

static __init int cgw_module_init(void)
{
	int ret;
@@ -1290,27 +1299,13 @@ static __init int cgw_module_init(void)
	if (ret)
		goto out_register_notifier;

	ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_GETROUTE,
				   NULL, cgw_dump_jobs, 0);
	if (ret)
		goto out_rtnl_register1;

	ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
				   cgw_create_job, NULL, 0);
	if (ret)
		goto out_rtnl_register2;
	ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE,
				   cgw_remove_job, NULL, 0);
	ret = rtnl_register_many(cgw_rtnl_msg_handlers);
	if (ret)
		goto out_rtnl_register3;
		goto out_rtnl_register;

	return 0;

out_rtnl_register3:
	rtnl_unregister(PF_CAN, RTM_NEWROUTE);
out_rtnl_register2:
	rtnl_unregister(PF_CAN, RTM_GETROUTE);
out_rtnl_register1:
out_rtnl_register:
	unregister_netdevice_notifier(&notifier);
out_register_notifier:
	kmem_cache_destroy(cgw_cache);
+10 −7
Original line number Diff line number Diff line
@@ -1291,13 +1291,18 @@ static struct pernet_operations fib_rules_net_ops = {
	.exit = fib_rules_net_exit,
};

static const struct rtnl_msg_handler fib_rules_rtnl_msg_handlers[] __initconst = {
	{.msgtype = RTM_NEWRULE, .doit = fib_nl_newrule},
	{.msgtype = RTM_DELRULE, .doit = fib_nl_delrule},
	{.msgtype = RTM_GETRULE, .dumpit = fib_nl_dumprule,
	 .flags = RTNL_FLAG_DUMP_UNLOCKED},
};

static int __init fib_rules_init(void)
{
	int err;
	rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL, 0);
	rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL, 0);
	rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule,
		      RTNL_FLAG_DUMP_UNLOCKED);

	rtnl_register_many(fib_rules_rtnl_msg_handlers);

	err = register_pernet_subsys(&fib_rules_net_ops);
	if (err < 0)
@@ -1312,9 +1317,7 @@ static int __init fib_rules_init(void)
fail_unregister:
	unregister_pernet_subsys(&fib_rules_net_ops);
fail:
	rtnl_unregister(PF_UNSPEC, RTM_NEWRULE);
	rtnl_unregister(PF_UNSPEC, RTM_DELRULE);
	rtnl_unregister(PF_UNSPEC, RTM_GETRULE);
	rtnl_unregister_many(fib_rules_rtnl_msg_handlers);
	return err;
}

+10 −9
Original line number Diff line number Diff line
@@ -3886,17 +3886,18 @@ EXPORT_SYMBOL(neigh_sysctl_unregister);

#endif	/* CONFIG_SYSCTL */

static const struct rtnl_msg_handler neigh_rtnl_msg_handlers[] __initconst = {
	{.msgtype = RTM_NEWNEIGH, .doit = neigh_add},
	{.msgtype = RTM_DELNEIGH, .doit = neigh_delete},
	{.msgtype = RTM_GETNEIGH, .doit = neigh_get, .dumpit = neigh_dump_info,
	 .flags = RTNL_FLAG_DUMP_UNLOCKED},
	{.msgtype = RTM_GETNEIGHTBL, .dumpit = neightbl_dump_info},
	{.msgtype = RTM_SETNEIGHTBL, .doit = neightbl_set},
};

static int __init neigh_init(void)
{
	rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, 0);
	rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, 0);
	rtnl_register(PF_UNSPEC, RTM_GETNEIGH, neigh_get, neigh_dump_info,
		      RTNL_FLAG_DUMP_UNLOCKED);

	rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info,
		      0);
	rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, 0);

	rtnl_register_many(neigh_rtnl_msg_handlers);
	return 0;
}

+9 −5
Original line number Diff line number Diff line
@@ -1169,6 +1169,14 @@ static void __init netns_ipv4_struct_check(void)
}
#endif

static const struct rtnl_msg_handler net_ns_rtnl_msg_handlers[] __initconst = {
	{.msgtype = RTM_NEWNSID, .doit = rtnl_net_newid,
	 .flags = RTNL_FLAG_DOIT_UNLOCKED},
	{.msgtype = RTM_GETNSID, .doit = rtnl_net_getid,
	 .dumpit = rtnl_net_dumpid,
	 .flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},
};

void __init net_ns_init(void)
{
	struct net_generic *ng;
@@ -1206,11 +1214,7 @@ void __init net_ns_init(void)
	if (register_pernet_subsys(&net_ns_ops))
		panic("Could not register network namespace subsystems");

	rtnl_register(PF_UNSPEC, RTM_NEWNSID, rtnl_net_newid, NULL,
		      RTNL_FLAG_DOIT_UNLOCKED);
	rtnl_register(PF_UNSPEC, RTM_GETNSID, rtnl_net_getid, rtnl_net_dumpid,
		      RTNL_FLAG_DOIT_UNLOCKED |
		      RTNL_FLAG_DUMP_UNLOCKED);
	rtnl_register_many(net_ns_rtnl_msg_handlers);
}

static void free_exit_list(struct pernet_operations *ops, struct list_head *net_exit_list)
Loading