net/sched: Load modules via their alias
authorMichal Koutný <mkoutny@suse.com>
Thu, 1 Feb 2024 13:09:42 +0000 (14:09 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 2 Feb 2024 18:57:55 +0000 (10:57 -0800)
The cls_,sch_,act_ modules may be loaded lazily during network
configuration but without user's awareness and control.

Switch the lazy loading from canonical module names to a module alias.
This allows finer control over lazy loading, the precedent from
commit 7f78e0351394 ("fs: Limit sys_mount to only request filesystem
modules.") explains it already:

Using aliases means user space can control the policy of which
filesystem^W net/sched modules are auto-loaded by editing
/etc/modprobe.d/*.conf with blacklist and alias directives.
Allowing simple, safe, well understood work-arounds to known
problematic software.

By default, nothing changes. However, if a specific module is
blacklisted (its canonical name), it won't be modprobe'd when requested
under its alias (i.e. kernel auto-loading). It would appear as if the
given module was unknown.

The module can still be loaded under its canonical name, which is an
explicit (privileged) user action.

Signed-off-by: Michal Koutný <mkoutny@suse.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Link: https://lore.kernel.org/r/20240201130943.19536-4-mkoutny@suse.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/act_api.c
net/sched/cls_api.c
net/sched/sch_api.c

index 3e30d72..9ee622f 100644 (file)
@@ -1363,7 +1363,7 @@ struct tc_action_ops *tc_action_load_ops(struct nlattr *nla, u32 flags,
 
                if (rtnl_held)
                        rtnl_unlock();
-               request_module("act_%s", act_name);
+               request_module(NET_ACT_ALIAS_PREFIX "%s", act_name);
                if (rtnl_held)
                        rtnl_lock();
 
index ff3d396..ca5676b 100644 (file)
@@ -257,7 +257,7 @@ tcf_proto_lookup_ops(const char *kind, bool rtnl_held,
 #ifdef CONFIG_MODULES
        if (rtnl_held)
                rtnl_unlock();
-       request_module("cls_%s", kind);
+       request_module(NET_CLS_ALIAS_PREFIX "%s", kind);
        if (rtnl_held)
                rtnl_lock();
        ops = __tcf_proto_lookup_ops(kind);
index 36b025c..9d928f6 100644 (file)
@@ -228,7 +228,7 @@ int qdisc_set_default(const char *name)
        if (!ops) {
                /* Not found, drop lock and try to load module */
                write_unlock(&qdisc_mod_lock);
-               request_module("sch_%s", name);
+               request_module(NET_SCH_ALIAS_PREFIX "%s", name);
                write_lock(&qdisc_mod_lock);
 
                ops = qdisc_lookup_default(name);
@@ -1275,7 +1275,7 @@ static struct Qdisc *qdisc_create(struct net_device *dev,
                         * go away in the mean time.
                         */
                        rtnl_unlock();
-                       request_module("sch_%s", name);
+                       request_module(NET_SCH_ALIAS_PREFIX "%s", name);
                        rtnl_lock();
                        ops = qdisc_lookup_ops(kind);
                        if (ops != NULL) {