From patchwork Fri Jun 16 17:47:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Wang X-Patchwork-Id: 776902 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 3wq7Bw4sVwz9s8N for ; Sat, 17 Jun 2017 03:48:24 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="NF8vHo+9"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752353AbdFPRsW (ORCPT ); Fri, 16 Jun 2017 13:48:22 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:34474 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752133AbdFPRsV (ORCPT ); Fri, 16 Jun 2017 13:48:21 -0400 Received: by mail-pf0-f194.google.com with SMTP id d5so7559481pfe.1 for ; Fri, 16 Jun 2017 10:48:21 -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:in-reply-to:references; bh=5K1XCRzgPGpIF1XmCVbkAoaf0vjRxaeXVRks7D3tIyI=; b=NF8vHo+9oVsBebMhFtHYFJEkyU/qkeghi/N6z8HlXuisEpnGIV6l/IjYJU1GAXnTya llnYuh2yKc2LK51GtoHcC5qPBnROwsEIZlMXcLZj12ZkdJNa8do7wPCrpKZ1c3OYsT/I +wCdJH9v62HAy1Ub9qflNljegUjWYncL2b3seNYMKQrxA7jHPqhEjHndu2ZvLHH8gMrI JL4oY8tbtEhn2Brx1bWKA+xrUjzccpil9AA7nyq2OMxd9vgSlgLn1ZQXFhl2P4ZfiBE7 3+6G9HsJHDLwYhp+uASa3wAcpJFQytE1Mv0VMir8H6pv6/MQE9fwqzSGibk3xC6/2eOX WnWg== 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:in-reply-to :references; bh=5K1XCRzgPGpIF1XmCVbkAoaf0vjRxaeXVRks7D3tIyI=; b=ppc1f8q2ucuG20f+Ux5pfvKqeaPCxp7FHXSXApEWu+sfZluxG496Hu/8SjAe7kV7ae ajWA2eL+/zFkwuBjXlgOraGIzSa/55R/CU4Z+f0V49NuekgFoJvk/kaT7U8eH8xy8NO7 QNJX74jkk8iWHTyA4HW8eAxcic4rxh3fheEnHj3u7PriHxVQ2iHT9oaxfDOXjffX+h0f eVWvZ3zWjeJNlkZM11fvjDM65NwC0iwtxU8AsMXcKqsubFxJqwknujCIXqbMXmSRDvpB 0y9M3fvCcAgONT2ZpAVs2TwJFuZL66KxZxb9R6OzLcKQ9gFZqfHt/Lyy5oXAXK5JU86X KHjQ== X-Gm-Message-State: AKS2vOyDEf5NJwp69nE7VHClzeOZICm7JOqRDAhH4sBecYIe5CilZvOP Y7TqaJtZUvWdOg== X-Received: by 10.99.188.18 with SMTP id q18mr12616096pge.79.1497635300813; Fri, 16 Jun 2017 10:48:20 -0700 (PDT) Received: from weiwan0.mtv.corp.google.com ([100.123.230.66]) by smtp.gmail.com with ESMTPSA id v62sm5292290pfb.124.2017.06.16.10.48.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 16 Jun 2017 10:48:20 -0700 (PDT) From: Wei Wang To: David Miller , netdev@vger.kernel.org Cc: Eric Dumazet , Martin KaFai Lau , Wei Wang Subject: [PATCH net-next 02/21] udp: call dst_hold_safe() in udp_sk_rx_set_dst() Date: Fri, 16 Jun 2017 10:47:25 -0700 Message-Id: <20170616174744.139688-3-tracywwnj@gmail.com> X-Mailer: git-send-email 2.13.1.518.g3df882009-goog In-Reply-To: <20170616174744.139688-1-tracywwnj@gmail.com> References: <20170616174744.139688-1-tracywwnj@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Wei Wang In udp_v4/6_early_demux() code, we try to hold dst->__refcnt for dst with DST_NOCACHE flag. This is because later in udp_sk_rx_dst_set() function, we will try to cache this dst in sk for connected case. However, a better way to achieve this is to not try to hold dst in early_demux(), but in udp_sk_rx_dst_set(), call dst_hold_safe(). This approach is also more consistant with how tcp is handling it. And it will make later changes simpler. Signed-off-by: Wei Wang Acked-by: Martin KaFai Lau --- net/ipv4/udp.c | 22 ++++++++++------------ net/ipv6/udp.c | 14 ++++++-------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 2bc638c48b86..99fb1fb90ad3 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1977,9 +1977,10 @@ static void udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst) { struct dst_entry *old; - dst_hold(dst); - old = xchg(&sk->sk_rx_dst, dst); - dst_release(old); + if (dst_hold_safe(dst)) { + old = xchg(&sk->sk_rx_dst, dst); + dst_release(old); + } } /* @@ -2302,15 +2303,12 @@ void udp_v4_early_demux(struct sk_buff *skb) if (dst) dst = dst_check(dst, 0); - if (dst) { - /* DST_NOCACHE can not be used without taking a reference */ - if (dst->flags & DST_NOCACHE) { - if (likely(atomic_inc_not_zero(&dst->__refcnt))) - skb_dst_set(skb, dst); - } else { - skb_dst_set_noref(skb, dst); - } - } + if (dst) + /* set noref for now. + * any place which wants to hold dst has to call + * dst_hold_safe() + */ + skb_dst_set_noref(skb, dst); } int udp_rcv(struct sk_buff *skb) diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 2e9b52bded2d..a2152e2138ff 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -919,14 +919,12 @@ static void udp_v6_early_demux(struct sk_buff *skb) if (dst) dst = dst_check(dst, inet6_sk(sk)->rx_dst_cookie); - if (dst) { - if (dst->flags & DST_NOCACHE) { - if (likely(atomic_inc_not_zero(&dst->__refcnt))) - skb_dst_set(skb, dst); - } else { - skb_dst_set_noref(skb, dst); - } - } + if (dst) + /* set noref for now. + * any place which wants to hold dst has to call + * dst_hold_safe() + */ + skb_dst_set_noref(skb, dst); } static __inline__ int udpv6_rcv(struct sk_buff *skb)