netconsole: Attach cmdline target to dynamic target
authorBreno Leitao <leitao@debian.org>
Thu, 12 Oct 2023 11:14:00 +0000 (04:14 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 14 Oct 2023 00:26:38 +0000 (17:26 -0700)
Enable the attachment of a dynamic target to the target created during
boot time. The boot-time targets are named as "cmdline\d", where "\d" is
a number starting at 0.

If the user creates a dynamic target named "cmdline0", it will attach to
the first target created at boot time (as defined in the
`netconsole=...` command line argument). `cmdline1` will attach to the
second target and so forth.

If there is no netconsole target created at boot time, then, the target
name could be reused.

Relevant design discussion:
https://lore.kernel.org/all/ZRWRal5bW93px4km@gmail.com/

Suggested-by: Joel Becker <jlbec@evilplan.org>
Signed-off-by: Breno Leitao <leitao@debian.org>
Link: https://lore.kernel.org/r/20231012111401.333798-4-leitao@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/netconsole.c

index e153bce4dee4a32239e41a770440d0d428bd3e6b..6e14ba5e06c8b80ab13c90eac6cb6db24929e7d7 100644 (file)
@@ -629,6 +629,23 @@ static const struct config_item_type netconsole_target_type = {
        .ct_owner               = THIS_MODULE,
 };
 
+static struct netconsole_target *find_cmdline_target(const char *name)
+{
+       struct netconsole_target *nt, *ret = NULL;
+       unsigned long flags;
+
+       spin_lock_irqsave(&target_list_lock, flags);
+       list_for_each_entry(nt, &target_list, list) {
+               if (!strcmp(nt->item.ci_name, name)) {
+                       ret = nt;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&target_list_lock, flags);
+
+       return ret;
+}
+
 /*
  * Group operations and type for netconsole_subsys.
  */
@@ -639,6 +656,17 @@ static struct config_item *make_netconsole_target(struct config_group *group,
        struct netconsole_target *nt;
        unsigned long flags;
 
+       /* Checking if a target by this name was created at boot time.  If so,
+        * attach a configfs entry to that target.  This enables dynamic
+        * control.
+        */
+       if (!strncmp(name, NETCONSOLE_PARAM_TARGET_PREFIX,
+                    strlen(NETCONSOLE_PARAM_TARGET_PREFIX))) {
+               nt = find_cmdline_target(name);
+               if (nt)
+                       return &nt->item;
+       }
+
        nt = alloc_and_init();
        if (!nt)
                return ERR_PTR(-ENOMEM);