From: Arjun Roy <arjun...@google.com>

Sometimes, we may call tcp receive zerocopy when inq is 0,
or inq < PAGE_SIZE, in which case we cannot remap pages. In this case,
simply return the appropriate hint for regular copying without taking
mmap_sem.
---
 net/ipv4/tcp.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 4bdd4a358588..b2f24a5ec230 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1889,6 +1889,14 @@ static int tcp_zerocopy_receive(struct sock *sk,
 
        sock_rps_record_flow(sk);
 
+       if (inq < PAGE_SIZE) {
+               zc->length = 0;
+               zc->recv_skip_hint = inq;
+               if (!inq && sock_flag(sk, SOCK_DONE))
+                       return -EIO;
+               return 0;
+       }
+
        mmap_read_lock(current->mm);
 
        vma = find_vma(current->mm, address);
-- 
2.29.2.576.ga3fc446d84-goog

Reply via email to