Re: [PATCH v2 -mm 9/9] netconsole: Support dynamic reconfiguration using configfs
Hi Satyam, From: Satyam Sharma [EMAIL PROTECTED] [9/9] netconsole: Support dynamic reconfiguration using configfs This patch introduces support for dynamic reconfiguration (adding, removing and/or modifying parameters of netconsole targets at runtime) using a userspace interface exported via configfs. Documentation is also updated accordingly. Issues and brief design overview: (1) Kernel-initiated creation / destruction of kernel objects is not possible with configfs -- the lifetimes of the config items is managed exclusively from userspace. But netconsole must support boot/module params too, and these are parsed in kernel and hence netpolls must be setup from the kernel. Joel Becker suggested to separately manage the lifetimes of the two kinds of netconsole_target objects -- those created via configfs mkdir(2) from userspace and those specified from the boot/module option string. This adds complexity and some redundancy here and also means that boot/module param-created targets are not exposed through the configfs namespace (and hence cannot be updated / destroyed dynamically). However, this saves us from locking / refcounting complexities that would need to be introduced in configfs to support kernel-initiated item creation / destroy there. Also, this is similar to present behaviour in any case so not really a problem. (2) In configfs, item creation takes place in the call chain of the mkdir(2) syscall in the driver subsystem. If we used an ioctl(2) to create / destroy objects from userspace, the special userspace program is able to fill out the structure to be passed into the ioctl and hence specify attributes such as local interface that are required at the time we set up the netpoll. For configfs, this information is not available at the time of mkdir(2). So, we keep all newly-created targets (via configfs) disabled by default. The user is expected to set various attributes appropriately (including the local network interface if required) and then write(2) 1 to the enabled attribute. Thus, netpoll_setup() is then called on the set parameters in the context of _this_ write(2) on the enabled attribute itself. This design enables the user to reconfigure existing netconsole targets at runtime to be attached to newly-come-up interfaces that may not have existed when netconsole was loaded or when the targets were actually created. This all enables us to get rid of custom ioctls. (3) Ultra-paranoid configfs attribute show() and store() operations, with sanity and input range checking, using only safe string primitives, and compliant with the recommendations in Documentation/filesystems/sysfs.txt. (4) A new function netpoll_print_options() is created in the netpoll API, that just prints out the configured parameters for a netpoll structure. netpoll_parse_options() is modified to use that and it is also exported to be used from netconsole. Signed-off-by: Satyam Sharma [EMAIL PROTECTED] Cc: Keiichi Kii [EMAIL PROTECTED] Acked-by: Keiichi Kii [EMAIL PROTECTED] Thanks -- Keiichi KII NEC Corporation OSS Platform Development Division E-mail: [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 -mm 9/9] netconsole: Support dynamic reconfiguration using configfs
Hi Satyam, struct netconsole_target { struct list_headlist; +#ifdef CONFIG_NETCONSOLE_DYNAMIC + struct config_item item; + int enabled; +#endif struct netpoll np; }; If CONFIG_NETCONSOLE_DYNAMIC is unset, we can't access to the enabled member. So, the compile errors occur because the following functions make use of the above one. +/* Allocate new target (from boot/module param) and setup netpoll for it */ +static struct netconsole_target *alloc_param_target(char *target_config) { int err = -ENOMEM; struct netconsole_target *nt; - /* Allocate and initialize with defaults */ + /* + * Allocate and initialize with defaults. + * Note that these targets get their config_item fields zeroed-out. + */ nt = kzalloc(sizeof(*nt), GFP_KERNEL); if (!nt) { printk(KERN_ERR netconsole: failed to allocate memory\n); @@ -106,6 +188,8 @@ static struct netconsole_target *alloc_t if (err) goto fail; + nt-enabled = 1; + return nt; fail: @@ -113,13 +197,469 @@ fail: return ERR_PTR(err); } @@ -169,7 +711,8 @@ static void write_msg(struct console *co spin_lock_irqsave(target_list_lock, flags); list_for_each_entry(nt, target_list, list) { - if (netif_running(nt-np.dev)) { + netconsole_target_get(nt); + if (nt-enabled netif_running(nt-np.dev)) { /* * We nest this inside the for-each-target loop above * so that we're able to get as much logging out to @@ -184,6 +727,7 @@ static void write_msg(struct console *co left -= frag; } } + netconsole_target_put(nt); } spin_unlock_irqrestore(target_list_lock, flags); } I created the following patch for performing some tests. If there is nothing wrong with the patch, I'm going to continue to test. Signed-off-by: Keiichi Kii [EMAIL PROTECTED] Index: mm/drivers/net/netconsole.c === --- mm.orig/drivers/net/netconsole.c +++ mm/drivers/net/netconsole.c @@ -94,8 +94,8 @@ struct netconsole_target { struct list_headlist; #ifdef CONFIG_NETCONSOLE_DYNAMIC struct config_item item; - int enabled; #endif + int enabled; struct netpoll np; }; Thanks -- Keiichi KII NEC Corporation OSS Platform Development Division E-mail: [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 -mm 9/9] netconsole: Support dynamic reconfiguration using configfs
Hi, On Thu, 12 Jul 2007, Keiichi KII wrote: Hi Satyam, struct netconsole_target { struct list_headlist; +#ifdef CONFIG_NETCONSOLE_DYNAMIC + struct config_item item; + int enabled; +#endif struct netpoll np; }; If CONFIG_NETCONSOLE_DYNAMIC is unset, we can't access to the enabled member. So, the compile errors occur because the following functions make use of the above one. Gargh, yes. Signed-off-by: Keiichi Kii [EMAIL PROTECTED] Index: mm/drivers/net/netconsole.c === --- mm.orig/drivers/net/netconsole.c +++ mm/drivers/net/netconsole.c @@ -94,8 +94,8 @@ struct netconsole_target { struct list_headlist; #ifdef CONFIG_NETCONSOLE_DYNAMIC struct config_item item; - int enabled; #endif + int enabled; struct netpoll np; }; Yup, enabled should be out of CONFIG_NETCONSOLE_DYNAMIC. I'll include this change in the next version as well. Thanks, Satyam - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v2 -mm 9/9] netconsole: Support dynamic reconfiguration using configfs
From: Satyam Sharma [EMAIL PROTECTED] [9/9] netconsole: Support dynamic reconfiguration using configfs This patch introduces support for dynamic reconfiguration (adding, removing and/or modifying parameters of netconsole targets at runtime) using a userspace interface exported via configfs. Documentation is also updated accordingly. Issues and brief design overview: (1) Kernel-initiated creation / destruction of kernel objects is not possible with configfs -- the lifetimes of the config items is managed exclusively from userspace. But netconsole must support boot/module params too, and these are parsed in kernel and hence netpolls must be setup from the kernel. Joel Becker suggested to separately manage the lifetimes of the two kinds of netconsole_target objects -- those created via configfs mkdir(2) from userspace and those specified from the boot/module option string. This adds complexity and some redundancy here and also means that boot/module param-created targets are not exposed through the configfs namespace (and hence cannot be updated / destroyed dynamically). However, this saves us from locking / refcounting complexities that would need to be introduced in configfs to support kernel-initiated item creation / destroy there. Also, this is similar to present behaviour in any case so not really a problem. (2) In configfs, item creation takes place in the call chain of the mkdir(2) syscall in the driver subsystem. If we used an ioctl(2) to create / destroy objects from userspace, the special userspace program is able to fill out the structure to be passed into the ioctl and hence specify attributes such as local interface that are required at the time we set up the netpoll. For configfs, this information is not available at the time of mkdir(2). So, we keep all newly-created targets (via configfs) disabled by default. The user is expected to set various attributes appropriately (including the local network interface if required) and then write(2) 1 to the enabled attribute. Thus, netpoll_setup() is then called on the set parameters in the context of _this_ write(2) on the enabled attribute itself. This design enables the user to reconfigure existing netconsole targets at runtime to be attached to newly-come-up interfaces that may not have existed when netconsole was loaded or when the targets were actually created. This all enables us to get rid of custom ioctls. (3) Ultra-paranoid configfs attribute show() and store() operations, with sanity and input range checking, using only safe string primitives, and compliant with the recommendations in Documentation/filesystems/sysfs.txt. (4) A new function netpoll_print_options() is created in the netpoll API, that just prints out the configured parameters for a netpoll structure. netpoll_parse_options() is modified to use that and it is also exported to be used from netconsole. Signed-off-by: Satyam Sharma [EMAIL PROTECTED] Cc: Keiichi Kii [EMAIL PROTECTED] --- Documentation/networking/netconsole.txt | 68 +++ drivers/net/Kconfig | 10 drivers/net/netconsole.c| 607 ++-- include/linux/netpoll.h |1 net/core/netpoll.c | 44 +- 5 files changed, 686 insertions(+), 44 deletions(-) --- diff -ruNp a/Documentation/networking/netconsole.txt b/Documentation/networking/netconsole.txt --- a/Documentation/networking/netconsole.txt 2007-07-10 08:56:16.0 +0530 +++ b/Documentation/networking/netconsole.txt 2007-07-10 11:07:48.0 +0530 @@ -3,6 +3,10 @@ started by Ingo Molnar [EMAIL PROTECTED] 2.6 port and netpoll api by Matt Mackall [EMAIL PROTECTED], Sep 9 2003 Please send bug reports to Matt Mackall [EMAIL PROTECTED] +and Satyam Sharma [EMAIL PROTECTED] + +Introduction: += This module logs kernel printk messages over UDP allowing debugging of problem where disk logging fails and serial consoles are impractical. @@ -13,6 +17,9 @@ the specified interface as soon as possi capture of early kernel panics, it does capture most of the boot process. +Sender and receiver configuration: +== + It takes a string configuration parameter netconsole in the following format: @@ -46,6 +53,67 @@ address. The remote host can run either 'netcat -u -l -p port' or syslogd. +Dynamic reconfiguration: + + +Dynamic reconfigurability is a useful addition to netconsole that enables +remote logging targets to be dynamically added, removed, or have their +parameters reconfigured at runtime from a configfs-based userspace interface. +[ Note that the parameters of netconsole targets that were specified/created +from the boot/module option are not exposed via this interface, and hence +cannot be modified dynamically. ] + +To include this feature, select CONFIG_NETCONSOLE_DYNAMIC when building the +netconsole module (or kernel, if netconsole is built-in). + +Some examples