From patchwork Mon May 7 18:08:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander H Duyck X-Patchwork-Id: 909882 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="ryvhwMNe"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40frGm3wTrz9s37 for ; Tue, 8 May 2018 04:09:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752735AbeEGSJC (ORCPT ); Mon, 7 May 2018 14:09:02 -0400 Received: from mail-pl0-f65.google.com ([209.85.160.65]:36211 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752659AbeEGSIy (ORCPT ); Mon, 7 May 2018 14:08:54 -0400 Received: by mail-pl0-f65.google.com with SMTP id v24-v6so205945plo.3 for ; Mon, 07 May 2018 11:08:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:date:message-id:in-reply-to:references:user-agent :mime-version:content-transfer-encoding; bh=afFTbMtYygYX5/KZuFuiU5UU+mpEBSuDisi2rWu3h0A=; b=ryvhwMNe+mVw/NtfS0cfFV9+AUSSaUfLSfYgdR8TYk3lhI9REqo1WNCMkP1JeaRkmp g10+ZxSMrNPcGWtUuAhm3CelSondTnVyzFG8X7saLfUhtGoEmz2v+linHKO/SkF6UB4Y pkAX2xj/mfnCRIgRVMZDgN+PGNedsNBLeDy+IZu3kXNlSAmMBeaq6+Ira5gJyK0qN46p Qw01RLUU/ge9hPSlw/dDoGCSczKDPoO8U6ZRBp0+RXuUdl/rCpUDIYz9M9wqorQNxxG2 EFMqwKTRcr4tAW8KMpsEbpF3RmhQ0TSfI6nQLeXBTRiQufQuvWTF/3TN/KPnl57WRFji 2M3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:date:message-id:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=afFTbMtYygYX5/KZuFuiU5UU+mpEBSuDisi2rWu3h0A=; b=VQEh6OIz5AqVCzbmygW1U61nkvDjdAKtlaI8RLKca9i2lmHr305eY+h+K2pLCA8MB5 U/MsOMIdKnHKtnUIb3Bq9I1Dv2P9ykEE6zIpAYfMLHD7LyQHjemrmGiOK+1pyriLZWTq 9i82h2nNL2dxj3hpx3JRtnj8YlxKFTwGBf2jQK9mNKrMziijzyJ0nIR3FPgUz84Rpg99 THfYmXpuavPFFYO3XKYAO06gQqXWLtP3xhipWYNn1PGyD9Kb2E+CAwDv+o/rgJ79DYKJ gRgCRtkUyKrj+MTrZSP3YxLs3HKmfOZOce2EGtkKTr5wEZxlmwyKYz+7uw6jd8hAeRpt FZyw== X-Gm-Message-State: ALQs6tBmxENn/D+kPoXr7CXw9ivKSe+Ukl639pXX41XogqwVL2QV6oGY Kwfc+KJGPoBLlO/Ct7HBDdEogKs0 X-Google-Smtp-Source: AB8JxZpUpRxfnsPm4NF6MZ1+tNLGvBOoPJglAb9qmjPmO4BPrZaxqDt8RtWHShZnq6VAynWGd3dAaA== X-Received: by 2002:a65:6414:: with SMTP id a20-v6mr9066863pgv.324.1525716533237; Mon, 07 May 2018 11:08:53 -0700 (PDT) Received: from localhost.localdomain (static-50-53-21-37.bvtn.or.frontiernet.net. [50.53.21.37]) by smtp.gmail.com with ESMTPSA id w134sm41240434pfd.187.2018.05.07.11.08.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 May 2018 11:08:52 -0700 (PDT) Subject: [net-next PATCH v3 6/6] udp: Do not copy destructor if one is not present From: Alexander Duyck To: netdev@vger.kernel.org, willemb@google.com, davem@davemloft.net Date: Mon, 07 May 2018 11:08:52 -0700 Message-ID: <20180507180852.3486.27748.stgit@localhost.localdomain> In-Reply-To: <20180507180310.3486.35994.stgit@localhost.localdomain> References: <20180507180310.3486.35994.stgit@localhost.localdomain> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alexander Duyck This patch makes it so that if a destructor is not present we avoid trying to update the skb socket or any reference counting that would be associated with the NULL socket and/or descriptor. By doing this we can support traffic coming from another namespace without any issues. Acked-by: Willem de Bruijn Signed-off-by: Alexander Duyck Reviewed-by: Eric Dumazet --- net/ipv4/udp_offload.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index d4f2daca0c33..ede2a7305b90 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -195,6 +195,7 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, struct sk_buff *segs, *seg; struct udphdr *uh; unsigned int mss; + bool copy_dtor; __sum16 check; __be16 newlen; @@ -205,12 +206,14 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, skb_pull(gso_skb, sizeof(*uh)); /* clear destructor to avoid skb_segment assigning it to tail */ - WARN_ON_ONCE(gso_skb->destructor != sock_wfree); - gso_skb->destructor = NULL; + copy_dtor = gso_skb->destructor == sock_wfree; + if (copy_dtor) + gso_skb->destructor = NULL; segs = skb_segment(gso_skb, features); if (unlikely(IS_ERR_OR_NULL(segs))) { - gso_skb->destructor = sock_wfree; + if (copy_dtor) + gso_skb->destructor = sock_wfree; return segs; } @@ -229,9 +232,11 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, check = csum16_add(csum16_sub(uh->check, uh->len), newlen); for (;;) { - seg->destructor = sock_wfree; - seg->sk = sk; - sum_truesize += seg->truesize; + if (copy_dtor) { + seg->destructor = sock_wfree; + seg->sk = sk; + sum_truesize += seg->truesize; + } if (!seg->next) break; @@ -263,8 +268,9 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, uh->check = gso_make_checksum(seg, ~check) ? : CSUM_MANGLED_0; /* update refcount for the packet */ - refcount_add(sum_truesize - gso_skb->truesize, &sk->sk_wmem_alloc); - + if (copy_dtor) + refcount_add(sum_truesize - gso_skb->truesize, + &sk->sk_wmem_alloc); return segs; } EXPORT_SYMBOL_GPL(__udp_gso_segment);