tcp: set SOCK_NOSPACE under memory pressure
[firefly-linux-kernel-4.4.55.git] / net / core / stream.c
index 301c05f260600caaed94a9f63ecd3ed0adc5c233..d70f77a0c8898582e0adabd24c6165675d12dce7 100644 (file)
@@ -119,6 +119,7 @@ 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(wait);
 
        if (sk_stream_memory_free(sk))
@@ -131,8 +132,11 @@ 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 (!*timeo_p) {
+                       if (noblock)
+                               set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
                        goto do_nonblock;
+               }
                if (signal_pending(current))
                        goto do_interrupted;
                clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);