netconsole: Create a allocation helper
authorBreno Leitao <leitao@debian.org>
Fri, 11 Aug 2023 09:31:57 +0000 (02:31 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 18 Aug 2023 02:25:42 +0000 (19:25 -0700)
De-duplicate the initialization and allocation code for struct
netconsole_target.

The same allocation and initialization code is duplicated in two
different places in the netconsole subsystem, when the netconsole target
is initialized by command line parameters (alloc_param_target()), and
dynamically by sysfs (make_netconsole_target()).

Create a helper function, and call it from the two different functions.

Suggested-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Breno Leitao <leitao@debian.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20230811093158.1678322-2-leitao@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/netconsole.c

index 87f18ae..670b6f0 100644 (file)
@@ -167,19 +167,16 @@ static void netconsole_target_put(struct netconsole_target *nt)
 
 #endif /* CONFIG_NETCONSOLE_DYNAMIC */
 
-/* Allocate new target (from boot/module param) and setup netpoll for it */
-static struct netconsole_target *alloc_param_target(char *target_config)
+/* Allocate and initialize with defaults.
+ * Note that these targets get their config_item fields zeroed-out.
+ */
+static struct netconsole_target *alloc_and_init(void)
 {
-       int err = -ENOMEM;
        struct netconsole_target *nt;
 
-       /*
-        * Allocate and initialize with defaults.
-        * Note that these targets get their config_item fields zeroed-out.
-        */
        nt = kzalloc(sizeof(*nt), GFP_KERNEL);
        if (!nt)
-               goto fail;
+               return nt;
 
        nt->np.name = "netconsole";
        strscpy(nt->np.dev_name, "eth0", IFNAMSIZ);
@@ -187,6 +184,21 @@ static struct netconsole_target *alloc_param_target(char *target_config)
        nt->np.remote_port = 6666;
        eth_broadcast_addr(nt->np.remote_mac);
 
+       return nt;
+}
+
+/* Allocate new target (from boot/module param) and setup netpoll for it */
+static struct netconsole_target *alloc_param_target(char *target_config)
+{
+       struct netconsole_target *nt;
+       int err;
+
+       nt = alloc_and_init();
+       if (!nt) {
+               err = -ENOMEM;
+               goto fail;
+       }
+
        if (*target_config == '+') {
                nt->extended = true;
                target_config++;
@@ -195,6 +207,7 @@ static struct netconsole_target *alloc_param_target(char *target_config)
        if (*target_config == 'r') {
                if (!nt->extended) {
                        pr_err("Netconsole configuration error. Release feature requires extended log message");
+                       err = -EINVAL;
                        goto fail;
                }
                nt->release = true;
@@ -664,23 +677,13 @@ static const struct config_item_type netconsole_target_type = {
 static struct config_item *make_netconsole_target(struct config_group *group,
                                                  const char *name)
 {
-       unsigned long flags;
        struct netconsole_target *nt;
+       unsigned long flags;
 
-       /*
-        * Allocate and initialize with defaults.
-        * Target is disabled at creation (!enabled).
-        */
-       nt = kzalloc(sizeof(*nt), GFP_KERNEL);
+       nt = alloc_and_init();
        if (!nt)
                return ERR_PTR(-ENOMEM);
 
-       nt->np.name = "netconsole";
-       strscpy(nt->np.dev_name, "eth0", IFNAMSIZ);
-       nt->np.local_port = 6665;
-       nt->np.remote_port = 6666;
-       eth_broadcast_addr(nt->np.remote_mac);
-
        /* Initialize the config_item member */
        config_item_init_type_name(&nt->item, name, &netconsole_target_type);