|
|
@@ -120,7 +120,6 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
|
|
|
int err = 0;
|
|
|
long vm_wait = 0;
|
|
|
long current_timeo = *timeo_p;
|
|
|
- bool noblock = (*timeo_p ? false : true);
|
|
|
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
|
|
|
|
if (sk_stream_memory_free(sk))
|
|
|
@@ -133,11 +132,8 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
|
|
|
|
|
|
if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
|
|
|
goto do_error;
|
|
|
- if (!*timeo_p) {
|
|
|
- if (noblock)
|
|
|
- set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
|
|
|
- goto do_nonblock;
|
|
|
- }
|
|
|
+ if (!*timeo_p)
|
|
|
+ goto do_eagain;
|
|
|
if (signal_pending(current))
|
|
|
goto do_interrupted;
|
|
|
sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
|
|
|
@@ -169,7 +165,13 @@ out:
|
|
|
do_error:
|
|
|
err = -EPIPE;
|
|
|
goto out;
|
|
|
-do_nonblock:
|
|
|
+do_eagain:
|
|
|
+ /* Make sure that whenever EAGAIN is returned, EPOLLOUT event can
|
|
|
+ * be generated later.
|
|
|
+ * When TCP receives ACK packets that make room, tcp_check_space()
|
|
|
+ * only calls tcp_new_space() if SOCK_NOSPACE is set.
|
|
|
+ */
|
|
|
+ set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
|
|
|
err = -EAGAIN;
|
|
|
goto out;
|
|
|
do_interrupted:
|