From patchwork Fri May 4 00:33:39 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: 908390 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="YbddSzl5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cY0T1R5pz9s08 for ; Fri, 4 May 2018 10:33:45 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751239AbeEDAdn (ORCPT ); Thu, 3 May 2018 20:33:43 -0400 Received: from mail-pg0-f67.google.com ([74.125.83.67]:33684 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751116AbeEDAdm (ORCPT ); Thu, 3 May 2018 20:33:42 -0400 Received: by mail-pg0-f67.google.com with SMTP id i194-v6so14286480pgd.0 for ; Thu, 03 May 2018 17:33:41 -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=XWEBt427y3eS0/Lt+GWgXoNCALkLsKQbGw2pcqBbXfA=; b=YbddSzl5omDZayqdSvQD+QZfwTQcZgE0xuxWAd/qsjvgrbwvIYGbw//70tpPD9ddw3 OBgXJFvPUmkWQNJHnaq/OKo7KP3LMeuNwtMVpMCUYaVEEpia58FMyb7UTA/vDaBNXt0t fpigyilrC6PhZQ85EPshYsiF9JyudQ4Su4ejdWaNRXql5o1O/B6HcEz9vZgXJqjwC5B5 QyYbzEFtEZ0WYUuINi1t07rxReQSW8q4YjgnQgjS6mX2D7iP7PFJeGh45PdtlTA1lIpR vdlraG/2n4LAx0GcT8wl8qEFSfI+OUY4GQoMI8z4/ppr6uGWxWe9Gjk9ISK6wXrOkKdU 4L7g== 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=XWEBt427y3eS0/Lt+GWgXoNCALkLsKQbGw2pcqBbXfA=; b=EA2mSNyUWKQNTH6tcF9aomq1CwMcwufCYGbQDTRiu2P6jhIIgqzU1FeGmKHPfMsgID nojLn9N/b1NTmzZa2J6/I7W1iDCxNYPyEYQiQNSyXUc3YTMGCb+pBnbXwzS8getd5VcT JHr4W1C+Cp3J6TNAzQyIfVi5BSEJN2Sl+upWciyGmd7d/jO4hZwBIVMGpKqh3Pz406qh xF8pWS0cmbO+PPOHEE9Tks3r/SXwzmZWvuo6BTJZEZAdS3aYI3RvJH8m3yE2zBPn65+H LHCAhr7+6zmCEE1g/k0XJTOmMhVt69a6vPA5w7GyB8qKuRClqGpdy4E1yw9tcw1NrjPM teqw== X-Gm-Message-State: ALQs6tAi3fhV1j2vOueKay0/x6MMHY3jFhTXHwWzRBsuXXw3G3GbDAwa YXeeWrJ4OUUVTvb3aW53L4bAHYhu X-Google-Smtp-Source: AB8JxZoTd1LT9YvibVgTJ3oAXEUAQgjEub/oLNMGe3yP7YQHnKFWocQSCfa+CdRWHBj3rdBqjvE41A== X-Received: by 2002:a17:902:3343:: with SMTP id a61-v6mr15561028plc.241.1525394021380; Thu, 03 May 2018 17:33:41 -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 k83sm42240581pfg.153.2018.05.03.17.33.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 May 2018 17:33:40 -0700 (PDT) Subject: [net-next PATCH 4/5] 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: Thu, 03 May 2018 17:33:39 -0700 Message-ID: <20180504003339.4496.26712.stgit@localhost.localdomain> In-Reply-To: <20180504002817.4496.64616.stgit@localhost.localdomain> References: <20180504002817.4496.64616.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. Signed-off-by: Alexander Duyck --- net/ipv4/udp_offload.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index fd94bbb369b2..52760660d674 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, unsigned int sum_truesize = 0; struct udphdr *uh; unsigned int mss; + bool copy_dtor; __sum16 check; __be16 newlen; @@ -208,12 +209,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); + copy_dtor = gso_skb->destructor == sock_wfree; + WARN_ON_ONCE(gso_skb->destructor && !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; } @@ -234,9 +237,11 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, (__force u32)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; @@ -268,7 +273,9 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, uh->check = gso_make_checksum(seg, ~check); /* 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); out: return segs; }