On Thu, Jul 24, 2014 at 10:41:35PM +0200, Eric Dumazet wrote: > From: Eric Dumazet <edumazet@xxxxxxxxxx> > > getsockopt() or setsockopt() sometimes returns -EINTR instead of > -ENOPROTOOPT, causing headaches to application developers. > > This is because unsupported commands might go through nf_sockopt_find() > and this function returns -EINTR if a signal is pending. > > Just use non interruptible mutex functions, as there is no reason > we should sleep for a long time here. On top of this patch, I think that at least we can also ged rid of these interruptible mutex from the netfilter/core code too (see preliminary patch attached). I can also adapt the callers so they don't check anymore the return value as they will always succeed. Comments? Thanks.
diff --git a/net/netfilter/core.c b/net/netfilter/core.c index 1fbab0c..a93c97f 100644 --- a/net/netfilter/core.c +++ b/net/netfilter/core.c @@ -35,11 +35,7 @@ EXPORT_SYMBOL_GPL(nf_ipv6_ops); int nf_register_afinfo(const struct nf_afinfo *afinfo) { - int err; - - err = mutex_lock_interruptible(&afinfo_mutex); - if (err < 0) - return err; + mutex_lock(&afinfo_mutex); RCU_INIT_POINTER(nf_afinfo[afinfo->family], afinfo); mutex_unlock(&afinfo_mutex); return 0; @@ -68,11 +64,8 @@ static DEFINE_MUTEX(nf_hook_mutex); int nf_register_hook(struct nf_hook_ops *reg) { struct nf_hook_ops *elem; - int err; - err = mutex_lock_interruptible(&nf_hook_mutex); - if (err < 0) - return err; + mutex_lock(&nf_hook_mutex); list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) { if (reg->priority < elem->priority) break;