| From foo@baz Mon Jan 18 21:18:36 PST 2016 |
| From: Rainer Weikusat <rweikusat@mobileactivedefense.com> |
| Date: Wed, 16 Dec 2015 20:09:25 +0000 |
| Subject: af_unix: Revert 'lock_interruptible' in stream receive code |
| Status: RO |
| Content-Length: 2049 |
| Lines: 58 |
| |
| From: Rainer Weikusat <rweikusat@mobileactivedefense.com> |
| |
| [ Upstream commit 3822b5c2fc62e3de8a0f33806ff279fb7df92432 ] |
| |
| With b3ca9b02b00704053a38bfe4c31dbbb9c13595d0, the AF_UNIX SOCK_STREAM |
| receive code was changed from using mutex_lock(&u->readlock) to |
| mutex_lock_interruptible(&u->readlock) to prevent signals from being |
| delayed for an indefinite time if a thread sleeping on the mutex |
| happened to be selected for handling the signal. But this was never a |
| problem with the stream receive code (as opposed to its datagram |
| counterpart) as that never went to sleep waiting for new messages with the |
| mutex held and thus, wouldn't cause secondary readers to block on the |
| mutex waiting for the sleeping primary reader. As the interruptible |
| locking makes the code more complicated in exchange for no benefit, |
| change it back to using mutex_lock. |
| |
| Signed-off-by: Rainer Weikusat <rweikusat@mobileactivedefense.com> |
| Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/unix/af_unix.c | 13 +++---------- |
| 1 file changed, 3 insertions(+), 10 deletions(-) |
| |
| --- a/net/unix/af_unix.c |
| +++ b/net/unix/af_unix.c |
| @@ -1934,14 +1934,7 @@ static int unix_dgram_recvmsg(struct kio |
| if (flags&MSG_OOB) |
| goto out; |
| |
| - err = mutex_lock_interruptible(&u->readlock); |
| - if (unlikely(err)) { |
| - /* recvmsg() in non blocking mode is supposed to return -EAGAIN |
| - * sk_rcvtimeo is not honored by mutex_lock_interruptible() |
| - */ |
| - err = noblock ? -EAGAIN : -ERESTARTSYS; |
| - goto out; |
| - } |
| + mutex_lock(&u->readlock); |
| |
| skip = sk_peek_offset(sk, flags); |
| |
| @@ -2133,12 +2126,12 @@ again: |
| |
| timeo = unix_stream_data_wait(sk, timeo, last); |
| |
| - if (signal_pending(current) |
| - || mutex_lock_interruptible(&u->readlock)) { |
| + if (signal_pending(current)) { |
| err = sock_intr_errno(timeo); |
| goto out; |
| } |
| |
| + mutex_lock(&u->readlock); |
| continue; |
| unlock: |
| unix_state_unlock(sk); |