diff options
Diffstat (limited to 'net/core/stream.c')
-rw-r--r-- | net/core/stream.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/net/core/stream.c b/net/core/stream.c index e94bb02a5629..4f1d4aa5fb38 100644 --- a/net/core/stream.c +++ b/net/core/stream.c | |||
@@ -120,7 +120,6 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p) | |||
120 | int err = 0; | 120 | int err = 0; |
121 | long vm_wait = 0; | 121 | long vm_wait = 0; |
122 | long current_timeo = *timeo_p; | 122 | long current_timeo = *timeo_p; |
123 | bool noblock = (*timeo_p ? false : true); | ||
124 | DEFINE_WAIT_FUNC(wait, woken_wake_function); | 123 | DEFINE_WAIT_FUNC(wait, woken_wake_function); |
125 | 124 | ||
126 | if (sk_stream_memory_free(sk)) | 125 | if (sk_stream_memory_free(sk)) |
@@ -133,11 +132,8 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p) | |||
133 | 132 | ||
134 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) | 133 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) |
135 | goto do_error; | 134 | goto do_error; |
136 | if (!*timeo_p) { | 135 | if (!*timeo_p) |
137 | if (noblock) | 136 | goto do_eagain; |
138 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); | ||
139 | goto do_nonblock; | ||
140 | } | ||
141 | if (signal_pending(current)) | 137 | if (signal_pending(current)) |
142 | goto do_interrupted; | 138 | goto do_interrupted; |
143 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); | 139 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
@@ -169,7 +165,13 @@ out: | |||
169 | do_error: | 165 | do_error: |
170 | err = -EPIPE; | 166 | err = -EPIPE; |
171 | goto out; | 167 | goto out; |
172 | do_nonblock: | 168 | do_eagain: |
169 | /* Make sure that whenever EAGAIN is returned, EPOLLOUT event can | ||
170 | * be generated later. | ||
171 | * When TCP receives ACK packets that make room, tcp_check_space() | ||
172 | * only calls tcp_new_space() if SOCK_NOSPACE is set. | ||
173 | */ | ||
174 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); | ||
173 | err = -EAGAIN; | 175 | err = -EAGAIN; |
174 | goto out; | 176 | goto out; |
175 | do_interrupted: | 177 | do_interrupted: |