From patchwork Sat Jun 17 17:42: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: 777343 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 3wql3D61j5z9s76 for ; Sun, 18 Jun 2017 03:43:52 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="COxDYgi6"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752563AbdFQRng (ORCPT ); Sat, 17 Jun 2017 13:43:36 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:36170 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752502AbdFQRne (ORCPT ); Sat, 17 Jun 2017 13:43:34 -0400 Received: by mail-pf0-f195.google.com with SMTP id y7so11096806pfd.3 for ; Sat, 17 Jun 2017 10:43:34 -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=b19pxt0nrDIRD8g6JNpkI5J+BLHil04DZBRt6PhCmW4=; b=COxDYgi6e4SmoI36O1n1t1K3FEIXhKWGSNDJbykaOCcdzmIIUSiG0O3BwZ0jB7c4jX 8zfZOi8Sce11HI5MvZrE9Fm1zdiDmJrBSKAqp86bGdYPcBsjBisiBRAN5Paz/5Xscthy 4B1ltw+HuNZp5ovGVt62/XnI80uAb4u+5suODmB6MbG+6pLNI4wuasjWAzVkUA0mYN61 /Ml9Vpl2nOaUjaVY1GI3nwJ000ZQR0//5/6+5GpijLsycuFnJXRhi6eA2bF+YMA08cFL io0TMqjNT7ArxksghBT34dUqnL9SwiHyVnIvFqijg591h96qSm42x/MkvHdDEbu0IHW4 kziw== 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=b19pxt0nrDIRD8g6JNpkI5J+BLHil04DZBRt6PhCmW4=; b=U3UQYhYVv/O4G2ElaBZBVKr/NXz/d3Y86z04ZmXnAkC8ckFp9VXrmIe0RcQWMfWBmH YQ9DZ2rNXdmBo3/wuRTcW5yMErArp0fWGdzeVn4zhva+aSR1UJt/Q6k//PXSZ1yqOJQN VySzg5KFrwHr1meoUwndMrKhQUQV/xa6/vsmxS3SyTrlJXYHPpNwqk4TNNzMg4Fb0t6O vJceDDxRo7SYmDAEvQl6nP2ROdX3aGdZLYahpqfdn/11utR3Y92IPa638mjjd01TK1Mo 7dsdUD3qqKYDAHuDkIy6fkohKgod//0+6nINm61EWkJlnS3GHPZreIfT6MvQst7Txgws 67Hw== X-Gm-Message-State: AKS2vOyU6VCwMOBETKYBLjVApMX7nCtbmEDBC14jRE0JvhoDeCQAHN9C 5cTXSAP7uIsX/Gitl8w= X-Received: by 10.84.232.71 with SMTP id f7mr397584pln.18.1497721413676; Sat, 17 Jun 2017 10:43:33 -0700 (PDT) Received: from weiwan0.mtv.corp.google.com ([100.123.230.66]) by smtp.gmail.com with ESMTPSA id h7sm11352777pfc.97.2017.06.17.10.43.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 17 Jun 2017 10:43:33 -0700 (PDT) From: Wei Wang To: David Miller , netdev@vger.kernel.org Cc: Eric Dumazet , Martin KaFai Lau , Wei Wang Subject: [PATCH v2 net-next 02/21] udp: call dst_hold_safe() in udp_sk_rx_set_dst() Date: Sat, 17 Jun 2017 10:42:25 -0700 Message-Id: <20170617174244.132862-3-tracywwnj@gmail.com> X-Mailer: git-send-email 2.13.1.518.g3df882009-goog In-Reply-To: <20170617174244.132862-1-tracywwnj@gmail.com> References: <20170617174244.132862-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 | 19 +++++++++---------- net/ipv6/udp.c | 11 +++++------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 2bc638c48b86..f3450f092d71 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); + } } /* @@ -2303,13 +2304,11 @@ 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); - } + /* set noref for now. + * any place which wants to hold dst has to call + * dst_hold_safe() + */ + skb_dst_set_noref(skb, dst); } } diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 2e9b52bded2d..2b33847bf931 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -920,12 +920,11 @@ 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); - } + /* set noref for now. + * any place which wants to hold dst has to call + * dst_hold_safe() + */ + skb_dst_set_noref(skb, dst); } }