diff options
author | Dave Airlie <airlied@redhat.com> | 2010-09-24 15:37:33 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-09-24 15:37:33 +1000 |
commit | 4a445f291ac3faa08f56eaeb6e44856b6b72b74c (patch) | |
tree | b66cc93311dc4c623113a87aa9b40730a21ac18e /net/unix/af_unix.c | |
parent | cbc60ca04b342a4e1f2a1086a7277c077f07dbed (diff) | |
parent | a850ea30374ebed32a0724742601861853fde869 (diff) | |
download | talos-op-linux-4a445f291ac3faa08f56eaeb6e44856b6b72b74c.tar.gz talos-op-linux-4a445f291ac3faa08f56eaeb6e44856b6b72b74c.zip |
Merge remote branch 'origin/master' of /home/airlied/kernel//linux-2.6 into drm-core-next
Diffstat (limited to 'net/unix/af_unix.c')
-rw-r--r-- | net/unix/af_unix.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 4414a18c63b4..0b39b2451ea5 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -692,6 +692,7 @@ static int unix_autobind(struct socket *sock) static u32 ordernum = 1; struct unix_address *addr; int err; + unsigned int retries = 0; mutex_lock(&u->readlock); @@ -717,9 +718,17 @@ retry: if (__unix_find_socket_byname(net, addr->name, addr->len, sock->type, addr->hash)) { spin_unlock(&unix_table_lock); - /* Sanity yield. It is unusual case, but yet... */ - if (!(ordernum&0xFF)) - yield(); + /* + * __unix_find_socket_byname() may take long time if many names + * are already in use. + */ + cond_resched(); + /* Give up if all names seems to be in use. */ + if (retries++ == 0xFFFFF) { + err = -ENOSPC; + kfree(addr); + goto out; + } goto retry; } addr->hash ^= sk->sk_type; |