From patchwork Sat Jun 9 02:47:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soheil Hassas Yeganeh X-Patchwork-Id: 927092 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BDYnPndU"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 412kHv2ylyz9s0W for ; Sat, 9 Jun 2018 12:48:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752610AbeFICrQ (ORCPT ); Fri, 8 Jun 2018 22:47:16 -0400 Received: from mail-yb0-f194.google.com ([209.85.213.194]:34073 "EHLO mail-yb0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751476AbeFICrP (ORCPT ); Fri, 8 Jun 2018 22:47:15 -0400 Received: by mail-yb0-f194.google.com with SMTP id n23-v6so3753891ybg.1 for ; Fri, 08 Jun 2018 19:47:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=R87AL3QXsmUi2gyg1UU+iCG3uH/pADNQnmExoJs2RDI=; b=BDYnPndUojc6RMRELfrE9OLHtCiodYSnO3mgVPzuJF2lCU2r7P9ZWDJ2vR9Lm1PqZh uFvTJJm3rCk3Czl5MQ7bBGA5jxpO3Kl//i01Kw0dmH+97O2fd9T8j7hDeatq17Xe56vI 9CbohXcxEj4VGXdfUEGXi+9c8q9Pj6Gikw0rujh0HnrMz92F99hSt2j0ONEzc/k3fvKm v/kAg0XHBDF8OvPsIEaejB2TL41Dkp8Rg0IU6rRx3erudbyoxcMM0jpcCHhlCC3gQklU AGpGNWJsECOOXQ2nkARvxZas+nS+yp2sbg0gfRrIkrYU872D/k4ro1UCyOF4eW9ujku3 lv8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=R87AL3QXsmUi2gyg1UU+iCG3uH/pADNQnmExoJs2RDI=; b=FbVo73943ZwUkcBfy67v5gQkDJFjrijaCkYd8FIWoiPHfa3hBKX+UUGacZUANhf0J0 2XnVUKAUjmXCyZUeNTH6JA3mjARfRYKduaLBOuTOAhVYNXZ5LEWHYPvOYfK16e3jpyG5 SIApqiFOe0qHCpHf2OBypFTQMmUW8EcWT4zxOO0Oc6EXQVNDgzyoR42XkPgBW3+hhwmP iba4jPYa8I2xVyPLwafE5V7ptcf/aonsgNGUZ0eIL/3YgjlA7wxUW+z5xR7Mw573KWOE 43lXLCaMa9Yd94cUk8PvHCuPGvX2Ca7jEsPHyZlCdQWc/4GcR3G9lDAoU3vhPmblpC8G x9Qg== X-Gm-Message-State: APt69E3WI22F+2rMvagdRS5tt2Blli7y7eGMlYTakB3TyhcvUpqaNi4y kHTYo3VuFGAaGKnw2rqRiGc= X-Google-Smtp-Source: ADUXVKLA1VU0xV1F3y7otyVY53CQvAAyFwN8yp2obIUBqjogkL6TRL/wHbXdWeV3l691jRkmc6haeg== X-Received: by 2002:a25:848e:: with SMTP id v14-v6mr5089048ybk.358.1528512434427; Fri, 08 Jun 2018 19:47:14 -0700 (PDT) Received: from z.nyc.corp.google.com ([2620:0:1003:315:9c67:ffa0:44c0:d273]) by smtp.gmail.com with ESMTPSA id z10-v6sm8468410ywg.84.2018.06.08.19.47.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 08 Jun 2018 19:47:13 -0700 (PDT) From: Soheil Hassas Yeganeh To: davem@davemloft.net, netdev@vger.kernel.org Cc: ycheng@google.com, ncardwell@google.com, edumazet@google.com, willemb@google.com, Soheil Hassas Yeganeh Subject: [PATCH net] tcp: limit sk_rcvlowat by the maximum receive buffer Date: Fri, 8 Jun 2018 22:47:10 -0400 Message-Id: <20180609024710.206554-1-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.18.0.rc1.242.g61856ae69a-goog Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Soheil Hassas Yeganeh The user-provided value to setsockopt(SO_RCVLOWAT) can be larger than the maximum possible receive buffer. Such values mute POLLIN signals on the socket which can stall progress on the socket. Limit the user-provided value to half of the maximum receive buffer, i.e., half of sk_rcvbuf when the receive buffer size is set by the user, or otherwise half of sysctl_tcp_rmem[2]. Fixes: d1361840f8c5 ("tcp: fix SO_RCVLOWAT and RCVBUF autotuning") Signed-off-by: Soheil Hassas Yeganeh Signed-off-by: Eric Dumazet Reviewed-by: Neal Cardwell Acked-by: Willem de Bruijn --- net/ipv4/tcp.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 2741953adaba2..141acd92e58ae 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -1694,6 +1694,13 @@ EXPORT_SYMBOL(tcp_peek_len); /* Make sure sk_rcvbuf is big enough to satisfy SO_RCVLOWAT hint */ int tcp_set_rcvlowat(struct sock *sk, int val) { + int cap; + + if (sk->sk_userlocks & SOCK_RCVBUF_LOCK) + cap = sk->sk_rcvbuf >> 1; + else + cap = sock_net(sk)->ipv4.sysctl_tcp_rmem[2] >> 1; + val = min(val, cap); sk->sk_rcvlowat = val ? : 1; /* Check if we need to signal EPOLLIN right now */ @@ -1702,12 +1709,7 @@ int tcp_set_rcvlowat(struct sock *sk, int val) if (sk->sk_userlocks & SOCK_RCVBUF_LOCK) return 0; - /* val comes from user space and might be close to INT_MAX */ val <<= 1; - if (val < 0) - val = INT_MAX; - - val = min(val, sock_net(sk)->ipv4.sysctl_tcp_rmem[2]); if (val > sk->sk_rcvbuf) { sk->sk_rcvbuf = val; tcp_sk(sk)->window_clamp = tcp_win_from_space(sk, val);