Patchwork [Bugme-new,Bug,12201] New: long wait in call_usermodehelper() / queue_work() / wait_for_completion()

login
register
mail settings
Submitter Evgeniy Polyakov
Date Dec. 11, 2008, 11:05 p.m.
Message ID <20081211230521.GA2392@ioremap.net>
Download mbox | patch
Permalink /patch/13632/
State RFC
Delegated to: David Miller
Headers show

Comments

Evgeniy Polyakov - Dec. 11, 2008, 11:05 p.m.
On Fri, Dec 12, 2008 at 01:51:58AM +0300, Evgeniy Polyakov (zbr@ioremap.net) wrote:
> > > If I write a small pilot program that calls socket(PF_NETLINK, SOCK_RAW,
> > > NETLINK_AUDIT), it will delay by 1-2 seconds 100% of the time (assuming server
> > > has been online for a while).  Certain protocol types given to socket() have
> > > zero delay (because no module needs to be loaded).
> > > 
> > > Steps to reproduce:
> > > Once server has been online for a while, a simple call to socket(PF_NETLINK,
> > > SOCK_RAW, NETLINK_AUDIT) shows the problem.
> > 
> > OK, weird.
> > 
> > Please get sysrq working then get us a task trace, so we can see who is
> > sleeping where.  Do this:
> > 
> > 
> > - run your "small pilot program"
> 
> Or send it to us and we will quickly fix the bug :)
> 
> Thank you!

Btw, does this ugly hack fix the problem?
According to your description it may be the case.
Michael Spiegle - Dec. 12, 2008, 7:51 p.m.
> Btw, does this ugly hack fix the problem?
> According to your description it may be the case.
> 
> diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
> index 480184a..2b64eb5 100644
> --- a/net/netlink/af_netlink.c
> +++ b/net/netlink/af_netlink.c
> @@ -434,6 +434,10 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol)
>  	if (protocol < 0 || protocol >= MAX_LINKS)
>  		return -EPROTONOSUPPORT;
>  
> +#ifndef CONFIG_AUDIT
> +	if (protocol == NETLINK_AUDIT)
> +		return -EPROTONOSUPPORT;
> +#endif
>  	netlink_lock_table();
>  #ifdef CONFIG_MODULES
>  	if (!nl_table[protocol].registered) {
> 
> 

Yes, that would take care of it.  My original workaround was to disable 
CONFIG_KMOD.  I only have a few modules compiled (for servers that 
require those modules), but most of my servers don't need any modules. 
This would allow me to manually load modules myself and never have to 
worry about the kernel forking stuff in userspace.  Unfortunately, it 
appears that CONFIG_KMOD is being deprecated soon and I didn't want to 
rely on it.

What is the core reason for removing CONFIG_KMOD?  I personally would 
rather have the choice as to whether my kernel tries to find its own 
modules or not.

Michael Spiegle
mike@nauticaltech.com
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 480184a..2b64eb5 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -434,6 +434,10 @@  static int netlink_create(struct net *net, struct socket *sock, int protocol)
 	if (protocol < 0 || protocol >= MAX_LINKS)
 		return -EPROTONOSUPPORT;
 
+#ifndef CONFIG_AUDIT
+	if (protocol == NETLINK_AUDIT)
+		return -EPROTONOSUPPORT;
+#endif
 	netlink_lock_table();
 #ifdef CONFIG_MODULES
 	if (!nl_table[protocol].registered) {