From patchwork Fri Apr 1 15:52:19 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 604910 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qc5WC4fmDz9s9Y for ; Sat, 2 Apr 2016 02:52:55 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b=ApTq1tV2; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759106AbcDAPws (ORCPT ); Fri, 1 Apr 2016 11:52:48 -0400 Received: from mail-pa0-f51.google.com ([209.85.220.51]:34708 "EHLO mail-pa0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758966AbcDAPwp (ORCPT ); Fri, 1 Apr 2016 11:52:45 -0400 Received: by mail-pa0-f51.google.com with SMTP id fe3so93955782pab.1 for ; Fri, 01 Apr 2016 08:52:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dd9Gr1X66w8KbtjNE6kulenDDvkUoISUO6EVcSbe4WE=; b=ApTq1tV2mOERnmG/xySUhFh0YanEcdaI1efWBm2gQg2MNxzvNaW31RUv+FIUDfBaKF vUwfHuD5hyjsTxD7bFQa7a5v4hfIN4Xlzancg2AV+Vh6h/KnVrCvlis5MVzISeNmXmJy JZJ4ojptDtmOO3YrcVDAopNK63YHypH2aCRGDdxdcgADvut7xdEzYSaVaOJEDyYYYNYF RVU3uePVS7vfCajS+m5bHJY+ioxjcPrykCeobt5kYv/vER5R8Y8Wh+0pQLae44/mDcSe bU3PbUAA6hc5SJ9qNRavZeg/k7s6+zIszzoUQMEkaHTFyruyL59O5rhJmGKvLEABW0jI 4nfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dd9Gr1X66w8KbtjNE6kulenDDvkUoISUO6EVcSbe4WE=; b=X5V3fXFSQYb/h0g4sBCDj47c4Jrrc9Pvo7q7GrtTNZer7s+TnMw67vi1wG3hdMU8Pl EWHioSMTho0lVr6YSIoQjcNh6DcWwab/YTT51dBrJu9cnR/RczlVWhTUZmkYEiTlNH1a +QmMkwTZesmXFEi4521Y9sjB8zkkVYl9WyWMzIjcnb0vXauOf2uAspH0/4ipsfH8YdUL byl4/Ywv9d75+NUJxRyT7FPykduzLe25Zvd01MJPFlC5Vjei2U2nhLLXPGsZWr+jo3fo rEk7RLNcMCdPhSPjEhmzxDNIXbZWaOCxuBbYT6XC/SRZm0PDyiiLyUX0yfYO5Od0HBQe 2NEQ== X-Gm-Message-State: AD7BkJLN5R6YJxgzo60s3H3+ZFGTWob1SP2todSFOUutnQpdlJUxsW+NrdeMvsaWBw7stSHH X-Received: by 10.66.119.202 with SMTP id kw10mr31903748pab.110.1459525964609; Fri, 01 Apr 2016 08:52:44 -0700 (PDT) Received: from localhost ([2620:0:1000:3002:3822:8858:c2b2:7455]) by smtp.gmail.com with ESMTPSA id ch2sm22576963pad.28.2016.04.01.08.52.43 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Fri, 01 Apr 2016 08:52:43 -0700 (PDT) From: Eric Dumazet To: "David S . Miller" Cc: netdev , Eric Dumazet , Eric Dumazet , Tom Herbert , Willem de Bruijn , Neal Cardwell , =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Subject: [PATCH v2 net-next 08/11] tcp: increment sk_drops for dropped rx packets Date: Fri, 1 Apr 2016 08:52:19 -0700 Message-Id: <1459525942-30399-9-git-send-email-edumazet@google.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459525942-30399-1-git-send-email-edumazet@google.com> References: <1459525942-30399-1-git-send-email-edumazet@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now ss can report sk_drops, we can instruct TCP to increment this per socket counter when it drops an incoming frame, to refine monitoring and debugging. Following patch takes care of listeners drops. Signed-off-by: Eric Dumazet --- include/net/sock.h | 7 +++++++ net/ipv4/tcp_input.c | 33 ++++++++++++++++++++------------- net/ipv4/tcp_ipv4.c | 1 + net/ipv6/tcp_ipv6.c | 1 + 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index c3a707d1cee8..0d49b92ca59c 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -2009,6 +2009,13 @@ sock_skb_set_dropcount(const struct sock *sk, struct sk_buff *skb) SOCK_SKB_CB(skb)->dropcount = atomic_read(&sk->sk_drops); } +static inline void sk_drops_add(struct sock *sk, const struct sk_buff *skb) +{ + int segs = max_t(u16, 1, skb_shinfo(skb)->gso_segs); + + atomic_add(segs, &sk->sk_drops); +} + void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb); void __sock_recv_wifi_status(struct msghdr *msg, struct sock *sk, diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index e6e65f79ade8..d994d358ccbe 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -4318,6 +4318,12 @@ static bool tcp_try_coalesce(struct sock *sk, return true; } +static void tcp_drop(struct sock *sk, struct sk_buff *skb) +{ + sk_drops_add(sk, skb); + __kfree_skb(skb); +} + /* This one checks to see if we can put data from the * out_of_order queue into the receive_queue. */ @@ -4342,7 +4348,7 @@ static void tcp_ofo_queue(struct sock *sk) __skb_unlink(skb, &tp->out_of_order_queue); if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { SOCK_DEBUG(sk, "ofo packet was already received\n"); - __kfree_skb(skb); + tcp_drop(sk, skb); continue; } SOCK_DEBUG(sk, "ofo requeuing : rcv_next %X seq %X - %X\n", @@ -4394,7 +4400,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) if (unlikely(tcp_try_rmem_schedule(sk, skb, skb->truesize))) { NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPOFODROP); - __kfree_skb(skb); + tcp_drop(sk, skb); return; } @@ -4458,7 +4464,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) if (!after(end_seq, TCP_SKB_CB(skb1)->end_seq)) { /* All the bits are present. Drop. */ NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPOFOMERGE); - __kfree_skb(skb); + tcp_drop(sk, skb); skb = NULL; tcp_dsack_set(sk, seq, end_seq); goto add_sack; @@ -4497,7 +4503,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, TCP_SKB_CB(skb1)->end_seq); NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPOFOMERGE); - __kfree_skb(skb1); + tcp_drop(sk, skb1); } add_sack: @@ -4580,12 +4586,13 @@ err: static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) { struct tcp_sock *tp = tcp_sk(sk); - int eaten = -1; bool fragstolen = false; + int eaten = -1; - if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) - goto drop; - + if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) { + __kfree_skb(skb); + return; + } skb_dst_drop(skb); __skb_pull(skb, tcp_hdr(skb)->doff * 4); @@ -4667,7 +4674,7 @@ out_of_window: tcp_enter_quickack_mode(sk); inet_csk_schedule_ack(sk); drop: - __kfree_skb(skb); + tcp_drop(sk, skb); return; } @@ -5244,7 +5251,7 @@ syn_challenge: return true; discard: - __kfree_skb(skb); + tcp_drop(sk, skb); return false; } @@ -5462,7 +5469,7 @@ csum_error: TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS); discard: - __kfree_skb(skb); + tcp_drop(sk, skb); } EXPORT_SYMBOL(tcp_rcv_established); @@ -5693,7 +5700,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, TCP_DELACK_MAX, TCP_RTO_MAX); discard: - __kfree_skb(skb); + tcp_drop(sk, skb); return 0; } else { tcp_send_ack(sk); @@ -6054,7 +6061,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) if (!queued) { discard: - __kfree_skb(skb); + tcp_drop(sk, skb); } return 0; } diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index e5f924b29946..059a98f5e7e1 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1694,6 +1694,7 @@ discard_it: return 0; discard_and_relse: + sk_drops_add(sk, skb); if (refcounted) sock_put(sk); goto discard_it; diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index f0422e782731..5fa8fea394c9 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1484,6 +1484,7 @@ discard_it: return 0; discard_and_relse: + sk_drops_add(sk, skb); if (refcounted) sock_put(sk); goto discard_it;