From patchwork Tue Feb 27 09:24:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13573427 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94D11136658 for ; Tue, 27 Feb 2024 09:24:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709025858; cv=none; b=qQCC1K/rjzKcwh09ap9pM68hHlMUcjZYq9+thYCmDH0Fi83wmxb1j0WlyHoEFJwtzB9JoDnzE2dKeo+AGphM9sUERUYCgL1EUW642uCifd87qieEb/ZsoHMG4TRu9eorTxT0c1p/u8bcZxEpjUtDTk6dY3JKQQqQ2bgXePxpTlM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709025858; c=relaxed/simple; bh=G/hCjOLpwCsOcquNOmdRxxnwO/bAtF9QZxgE7t70IKo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=muZCyvp9eEaTAhPlpI/kC7mAnFKSvN61AEbj5s1T4bwXUa/Ye8ED1kUcBcUVKw5uZ0Dt8M2i22s7ugoJJ9XEa6ZGBLXRE10khjj2gDLAIwOPT2n8Vik1ctTTjT1GEYMhfRa2avc9zGLEyxw+6WetZQtSTHSx3MGdEmAMw6MXEz4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vL14ahDj; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vL14ahDj" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dcf22e5b70bso7327265276.1 for ; Tue, 27 Feb 2024 01:24:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1709025855; x=1709630655; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=DI0UVEg7zNzdHrk8WzabcgMsTGyAMfdYDtEWLQl+iRU=; b=vL14ahDjsI0kvLchkmVAjLHo0I98uh/k0GR+syLxiV/Sa1AHMNV6E1pWe2JzqxVKvG z+2I+WFZUHnsd+foqW84QxLGcpi3xO+pNrl2kLb9wrENMOrfsYyfSxbjM2672HeaCfav QSiAqP5ltoTGCpYmJ3LPfO1kEpx/xLBm4U9b1vnQntnpvknmEmN5qnbD4Nt897KS+Soo gJmwpZG9ta2igY6D8Oty/phkYWKQI7zS5IS6f0A0Of3ammQQyyLULW2G6hxFcGTLpo9K ZdcXfpK5vkOt/2JwiQDO/29y+cCOBRXYmuJtNHvRfWaDASF6/0ddPOPIDvk8XliUa3Cf mFAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709025855; x=1709630655; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=DI0UVEg7zNzdHrk8WzabcgMsTGyAMfdYDtEWLQl+iRU=; b=IpEBlsj5gBLVcelD5029OI8736umtcy2G7lZvyUfFRgc7qyeT2Aff09HPx+AhjLMlo zq/Oxf4w1SdBDqRwLU/v1PK13i5sXiNQDj18sOqtg460JVTrg0rxdE1MP82Nc6Bj5dVh Uyyymdu5T/XLU+DDv+/RM1RFxxYF757bVBl2LpipEoq7eL04r6s7qzxhKFgRpQlfUTUk KNilGH9y9Po5daDRfB1Mn/7KYK7uOkQrxtNV4WJjYWKAhKnaZdR6F0BB6yWThrOV/L8M rOdTO9xT+k7mW+2ivM7ijFq5XzQ+7lh+Z6AQZ1MfW9goUDcNgP+HGobAoOBumcSYxbbs ZuEg== X-Forwarded-Encrypted: i=1; AJvYcCVcUM+9ggrID5/XvTuOs4aEn6cQAFybrADLGj/Iion26DkA0LHCH8ZqckIPbNVldwPXddulxCG7d9rp7oQqqs3QUXFvm9v5 X-Gm-Message-State: AOJu0YwzQ4Es8iAcWvSwhea45zEXh29ffX3A53IU7jOJ+vaPTs4BXv8F +TEAGX/gDsIoYjxcOhYYKqpcYoXqYKlVvZhpxFmDlR3k794ApzdHmSdBCzK7aRIARf+pUQJgG59 ev/q/dFqdcA== X-Google-Smtp-Source: AGHT+IHdtn/W3GTccoGRIFuInknwg/kPDmcBHMfL/4IZwRS9Em6fn0nXM3qHuZBDnxjE7j5buE4p6ouaH3mOGA== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a25:102:0:b0:dcc:9f24:692b with SMTP id 2-20020a250102000000b00dcc9f24692bmr64925ybb.13.1709025855631; Tue, 27 Feb 2024 01:24:15 -0800 (PST) Date: Tue, 27 Feb 2024 09:24:09 +0000 In-Reply-To: <20240227092411.2315725-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240227092411.2315725-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240227092411.2315725-2-edumazet@google.com> Subject: [PATCH net-next 1/3] inet: annotate devconf data-races From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: David Ahern , Jiri Pirko , netdev@vger.kernel.org, eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org Add READ_ONCE() in ipv4_devconf_get() and corresponding WRITE_ONCE() in ipv4_devconf_set() Add IPV4_DEVCONF_RO() and IPV4_DEVCONF_ALL_RO() macros, and use them when reading devconf fields. Signed-off-by: Eric Dumazet Reviewed-by: Jiri Pirko --- include/linux/inetdevice.h | 14 ++++++++------ net/ipv4/devinet.c | 21 +++++++++++---------- net/ipv4/igmp.c | 4 ++-- net/ipv4/proc.c | 2 +- net/ipv4/route.c | 4 ++-- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index ddb27fc0ee8c8862d62f8c6243c4239ea53374f2..cb5280e6cc219106bcc55972dac850edf34988ff 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h @@ -53,13 +53,15 @@ struct in_device { }; #define IPV4_DEVCONF(cnf, attr) ((cnf).data[IPV4_DEVCONF_ ## attr - 1]) +#define IPV4_DEVCONF_RO(cnf, attr) READ_ONCE(IPV4_DEVCONF(cnf, attr)) #define IPV4_DEVCONF_ALL(net, attr) \ IPV4_DEVCONF((*(net)->ipv4.devconf_all), attr) +#define IPV4_DEVCONF_ALL_RO(net, attr) READ_ONCE(IPV4_DEVCONF_ALL(net, attr)) -static inline int ipv4_devconf_get(struct in_device *in_dev, int index) +static inline int ipv4_devconf_get(const struct in_device *in_dev, int index) { index--; - return in_dev->cnf.data[index]; + return READ_ONCE(in_dev->cnf.data[index]); } static inline void ipv4_devconf_set(struct in_device *in_dev, int index, @@ -67,7 +69,7 @@ static inline void ipv4_devconf_set(struct in_device *in_dev, int index, { index--; set_bit(index, in_dev->cnf.state); - in_dev->cnf.data[index] = val; + WRITE_ONCE(in_dev->cnf.data[index], val); } static inline void ipv4_devconf_setall(struct in_device *in_dev) @@ -81,18 +83,18 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev) ipv4_devconf_set((in_dev), IPV4_DEVCONF_ ## attr, (val)) #define IN_DEV_ANDCONF(in_dev, attr) \ - (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \ + (IPV4_DEVCONF_ALL_RO(dev_net(in_dev->dev), attr) && \ IN_DEV_CONF_GET((in_dev), attr)) #define IN_DEV_NET_ORCONF(in_dev, net, attr) \ - (IPV4_DEVCONF_ALL(net, attr) || \ + (IPV4_DEVCONF_ALL_RO(net, attr) || \ IN_DEV_CONF_GET((in_dev), attr)) #define IN_DEV_ORCONF(in_dev, attr) \ IN_DEV_NET_ORCONF(in_dev, dev_net(in_dev->dev), attr) #define IN_DEV_MAXCONF(in_dev, attr) \ - (max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr), \ + (max(IPV4_DEVCONF_ALL_RO(dev_net(in_dev->dev), attr), \ IN_DEV_CONF_GET((in_dev), attr))) #define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING) diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index bc74f131fe4dfad327e71c1a8f0a4b66cdc526e5..ca75d0fff1d1ebd8c199fb74a6f0e2f51160635c 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1982,7 +1982,7 @@ static int inet_fill_link_af(struct sk_buff *skb, const struct net_device *dev, return -EMSGSIZE; for (i = 0; i < IPV4_DEVCONF_MAX; i++) - ((u32 *) nla_data(nla))[i] = in_dev->cnf.data[i]; + ((u32 *) nla_data(nla))[i] = READ_ONCE(in_dev->cnf.data[i]); return 0; } @@ -2068,9 +2068,9 @@ static int inet_netconf_msgsize_devconf(int type) } static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex, - struct ipv4_devconf *devconf, u32 portid, - u32 seq, int event, unsigned int flags, - int type) + const struct ipv4_devconf *devconf, + u32 portid, u32 seq, int event, + unsigned int flags, int type) { struct nlmsghdr *nlh; struct netconfmsg *ncm; @@ -2095,27 +2095,28 @@ static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex, if ((all || type == NETCONFA_FORWARDING) && nla_put_s32(skb, NETCONFA_FORWARDING, - IPV4_DEVCONF(*devconf, FORWARDING)) < 0) + IPV4_DEVCONF_RO(*devconf, FORWARDING)) < 0) goto nla_put_failure; if ((all || type == NETCONFA_RP_FILTER) && nla_put_s32(skb, NETCONFA_RP_FILTER, - IPV4_DEVCONF(*devconf, RP_FILTER)) < 0) + IPV4_DEVCONF_RO(*devconf, RP_FILTER)) < 0) goto nla_put_failure; if ((all || type == NETCONFA_MC_FORWARDING) && nla_put_s32(skb, NETCONFA_MC_FORWARDING, - IPV4_DEVCONF(*devconf, MC_FORWARDING)) < 0) + IPV4_DEVCONF_RO(*devconf, MC_FORWARDING)) < 0) goto nla_put_failure; if ((all || type == NETCONFA_BC_FORWARDING) && nla_put_s32(skb, NETCONFA_BC_FORWARDING, - IPV4_DEVCONF(*devconf, BC_FORWARDING)) < 0) + IPV4_DEVCONF_RO(*devconf, BC_FORWARDING)) < 0) goto nla_put_failure; if ((all || type == NETCONFA_PROXY_NEIGH) && nla_put_s32(skb, NETCONFA_PROXY_NEIGH, - IPV4_DEVCONF(*devconf, PROXY_ARP)) < 0) + IPV4_DEVCONF_RO(*devconf, PROXY_ARP)) < 0) goto nla_put_failure; if ((all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) && nla_put_s32(skb, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, - IPV4_DEVCONF(*devconf, IGNORE_ROUTES_WITH_LINKDOWN)) < 0) + IPV4_DEVCONF_RO(*devconf, + IGNORE_ROUTES_WITH_LINKDOWN)) < 0) goto nla_put_failure; out: diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index efeeca2b13285a3149645ab945b0364391f6721b..717e97a389a8aee75f51a5a5d859cb94a5d868eb 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@ -120,12 +120,12 @@ */ #define IGMP_V1_SEEN(in_dev) \ - (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 1 || \ + (IPV4_DEVCONF_ALL_RO(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 1 || \ IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 1 || \ ((in_dev)->mr_v1_seen && \ time_before(jiffies, (in_dev)->mr_v1_seen))) #define IGMP_V2_SEEN(in_dev) \ - (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 2 || \ + (IPV4_DEVCONF_ALL_RO(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 2 || \ IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 2 || \ ((in_dev)->mr_v2_seen && \ time_before(jiffies, (in_dev)->mr_v2_seen))) diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index 5f4654ebff487494b6afbaa69174df4c004395dc..914bc9c35cc702395aee257fb010034294e501de 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c @@ -395,7 +395,7 @@ static int snmp_seq_show_ipstats(struct seq_file *seq, void *v) seq_printf(seq, " %s", snmp4_ipstats_list[i].name); seq_printf(seq, "\nIp: %d %d", - IPV4_DEVCONF_ALL(net, FORWARDING) ? 1 : 2, + IPV4_DEVCONF_ALL_RO(net, FORWARDING) ? 1 : 2, READ_ONCE(net->ipv4.sysctl_ip_default_ttl)); BUILD_BUG_ON(offsetof(struct ipstats_mib, mibs) != 0); diff --git a/net/ipv4/route.c b/net/ipv4/route.c index b512288d6fcc6bc0ce586bc5dc501b979ac3b9c1..c8f76f56dc1653371ca39663f29cc798b062e60d 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -2313,7 +2313,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, if (IN_DEV_BFORWARD(in_dev)) goto make_route; /* not do cache if bc_forwarding is enabled */ - if (IPV4_DEVCONF_ALL(net, BC_FORWARDING)) + if (IPV4_DEVCONF_ALL_RO(net, BC_FORWARDING)) do_cache = false; goto brd_input; } @@ -2993,7 +2993,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, #ifdef CONFIG_IP_MROUTE if (ipv4_is_multicast(dst) && !ipv4_is_local_multicast(dst) && - IPV4_DEVCONF_ALL(net, MC_FORWARDING)) { + IPV4_DEVCONF_ALL_RO(net, MC_FORWARDING)) { int err = ipmr_get_route(net, skb, fl4->saddr, fl4->daddr, r, portid); From patchwork Tue Feb 27 09:24:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13573428 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C4A1136667 for ; Tue, 27 Feb 2024 09:24:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709025859; cv=none; b=TRGfTqns9jeaex3NV4/KidfC5WKAm1XqGYnbYJQKGVrTdZ4yMQKBxLDKXyxpwMZyEuvYv1v1LZkeChWlNzOhwTb1pVRwFO+AkYDBJCPGS4IUrOq9pRHlTJImoRdzeFsAO3o0KCzy495ARxLwSlb5OhxfLcB7F+PFajr0csL6oYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709025859; c=relaxed/simple; bh=vh2ICDBbTmXCv2gkACYwF/+D4SSe8wt3o9O6pnhy9ME=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Gr46s9ExZRM+PJIpzxTzqevw0CGMFg8CNsBZWjTwhoJslC1Tl66TMTe/wQUL4TT5iFAV/Cla1LXzm+EA69mCJRjUgE8drj3nEeSTNDzPz+mTnxmtX44w1vc67HbIxNGqNO6oqFILsA1EXD+DQ9Il9L5rNb7C/F3h/q9x0lHQMj4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=xjQB7PHJ; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="xjQB7PHJ" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-60810219282so49154307b3.0 for ; Tue, 27 Feb 2024 01:24:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1709025857; x=1709630657; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=2wPjrECtZLa3Ue5MegOH35CkWKzmgA77jCFx80Y9Fbc=; b=xjQB7PHJ2Fun5/WB90gDI0iezRAgANgI8EiktKHit0HI1wZxfL4yTAf/4HJ5x+6ZDB XTmmQxW22xip01EzBm5hSrztdzV39ZTgTYO58TnFyPA4kjes0cFfit1Xl9H3mZR7d2uk yaTrGhRQix89B58ehVBZaTqaedw8zlqXpPU3wGE1pxKnt16cgnzf5Dc7GC6oCml+2i7P InTcLoTxsZKeb/3UAeDiCfLqig5X/clJs0aXT5UmU05saPbVJ3SJMGN2b+dYwdKnf4KS R2UzFqilxWwYgASZD8wSDMz5U9kp9aiwjYemDVcDVhDRvW9fniuMBMmnZpHQPWnwfq0U GaBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709025857; x=1709630657; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2wPjrECtZLa3Ue5MegOH35CkWKzmgA77jCFx80Y9Fbc=; b=Ed0Q11/lLp0sJzGoPrax6RVyIf1+BZ7QcnbFFJsLczXwMvzKDnoe1LrlZKl1eDvFL3 h+ITpfoCJUijtRHC6cNUse0ir8l/O3hgs0eHcyAkCNBPhhx/TQdFCyesHBMei3a9FP3C F5KaWr185T0YCTxK4dNzIxrJwyh5yxwfUKxA3T/vPKXVN95o+XghtU8RN8RDUwl4h/Bo NRd6JcKnTlF17XPck1VTli57k/7Bf9cn9ze3wt3zXsoeTZHuR6ugnz9f+UunRcggC3uR /QRwPIgjL8ExnQvrK+E9dNPmQ8DFVlPGzv2ps/ajl84TFgPPBRVJk0bo1X9iNg3G9hgV ZRJQ== X-Forwarded-Encrypted: i=1; AJvYcCXQbDRkA4TMuuSNTGBP2QqY/w5e8kCKhf5Vuzmjf2isWRsNgopoI6urj5UULB/pRVbFhAesVAB7MoTkL8G0c0AT8QfuZQY/ X-Gm-Message-State: AOJu0YxNC7QB/wwr3H14PjKujiKwaCZZKwW/hxqYdgClnpromT3NBMEV 8Soogi8CENDv3cOUOwXRN6nC9KCXEpgKjrXDedb2lyq7aIQBhFZ4OUdSwviFvF983O3vFGT8DW3 xquUEf03Vuw== X-Google-Smtp-Source: AGHT+IHP3IU8uUPJaSpjMGLttJYkgxDX5U1cmCVkjyWq7WbfetT8pElCuSiCG5YfR2EP/xqEFV6lRIOSUxWpIg== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:102c:b0:dcc:8be2:7cb0 with SMTP id x12-20020a056902102c00b00dcc8be27cb0mr68263ybt.0.1709025857118; Tue, 27 Feb 2024 01:24:17 -0800 (PST) Date: Tue, 27 Feb 2024 09:24:10 +0000 In-Reply-To: <20240227092411.2315725-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240227092411.2315725-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240227092411.2315725-3-edumazet@google.com> Subject: [PATCH net-next 2/3] inet: do not use RTNL in inet_netconf_get_devconf() From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: David Ahern , Jiri Pirko , netdev@vger.kernel.org, eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org "ip -4 netconf show dev XXXX" no longer acquires RTNL. Return -ENODEV instead of -EINVAL if no netdev or idev can be found. Signed-off-by: Eric Dumazet Reviewed-by: Jiri Pirko --- net/ipv4/devinet.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index ca75d0fff1d1ebd8c199fb74a6f0e2f51160635c..f045a34e90b974b17512a30c3b719bdfc3cba153 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -2205,21 +2205,20 @@ static int inet_netconf_get_devconf(struct sk_buff *in_skb, struct netlink_ext_ack *extack) { struct net *net = sock_net(in_skb->sk); - struct nlattr *tb[NETCONFA_MAX+1]; + struct nlattr *tb[NETCONFA_MAX + 1]; + const struct ipv4_devconf *devconf; + struct in_device *in_dev = NULL; + struct net_device *dev = NULL; struct sk_buff *skb; - struct ipv4_devconf *devconf; - struct in_device *in_dev; - struct net_device *dev; int ifindex; int err; err = inet_netconf_valid_get_req(in_skb, nlh, tb, extack); if (err) - goto errout; + return err; - err = -EINVAL; if (!tb[NETCONFA_IFINDEX]) - goto errout; + return -EINVAL; ifindex = nla_get_s32(tb[NETCONFA_IFINDEX]); switch (ifindex) { @@ -2230,10 +2229,10 @@ static int inet_netconf_get_devconf(struct sk_buff *in_skb, devconf = net->ipv4.devconf_dflt; break; default: - dev = __dev_get_by_index(net, ifindex); - if (!dev) - goto errout; - in_dev = __in_dev_get_rtnl(dev); + err = -ENODEV; + dev = dev_get_by_index(net, ifindex); + if (dev) + in_dev = in_dev_get(dev); if (!in_dev) goto errout; devconf = &in_dev->cnf; @@ -2257,6 +2256,9 @@ static int inet_netconf_get_devconf(struct sk_buff *in_skb, } err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid); errout: + if (in_dev) + in_dev_put(in_dev); + dev_put(dev); return err; } @@ -2826,5 +2828,6 @@ void __init devinet_init(void) rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, 0); rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, 0); rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, - inet_netconf_dump_devconf, 0); + inet_netconf_dump_devconf, + RTNL_FLAG_DOIT_UNLOCKED); } From patchwork Tue Feb 27 09:24:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13573429 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ADF0C13667A for ; Tue, 27 Feb 2024 09:24:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709025861; cv=none; b=ogoCzsyQF2S4oxl6q0Hdi0pQJbzFmMxZdNpjYDT4suzJTAPOnpFv4M3H/Bz/1+DGwAAux1OyGVIiklrsXcjEW7Kv2s+w21UntcTty6y4oMO1xzz1ESMar+Q9zLoI2C6S3aFFYfq/JeMk5Wa1li7Zv2yrQ3XhX1wIdA7xnGApTBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709025861; c=relaxed/simple; bh=kpSbrNlRFH9J/0vV6hV2zAOKBJurYLJ9YpqWsa5xki4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VPdS27SVTSC5qvhqmKk8D8uoX6eU9gy2HKUIDs2UNYzSjlpTqBjh/qTX/xrTSiLflL08pgoP0bC3u1/qFXRHWqpJ7k9aSVNy/9jtgcnCzL7OL0BgDuE+OWf7EftymDBuj1r04jDCOtgFu2WgM96nudwDclnpU7Ach/W5QSzX968= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ZB/yHFXq; arc=none smtp.client-ip=209.85.128.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ZB/yHFXq" Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-608cf88048eso52475717b3.0 for ; Tue, 27 Feb 2024 01:24:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1709025859; x=1709630659; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=/5Wt7meqEI/IcJrOvTVAAv27qvK/oK7X8exmus6uRQE=; b=ZB/yHFXqfTCGhacI/BwcB969uvFROc0dHnCsXL2+NrCKS8usXALwuxdTZ0a2JAakyF t85Twsis3zB80gDIGn8act3+NUFunDW/FI3o6V4wP9BOBXIOTKkFrWWGPrCcWV1qt5l/ VUBNlDfVgR4+vBfee6o5oyHO8oZaTILvZn/IZt1jUQMWCqYGcfOR9w3EhkTMwoTMAPDs 1LL7svez3aSuhhgldGgbXnD8MYRXViR71T0E4nr8g9MXqoFQOiKQvXBl80k/d71e40ML 37MnkcS4PufkNFJkIgdUC02ZMdrg7KLFMQnE8nA06JZu26QEZjhzV9B5+eo0LTMe7G+U dGMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709025859; x=1709630659; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=/5Wt7meqEI/IcJrOvTVAAv27qvK/oK7X8exmus6uRQE=; b=iGU7UbC5h9b+3r1YUUeYosO2XG4LcdJh3e2wMKfNi/1GZPrB+pWtTiZjtOF9kKfRdd d57RgDDUO9wuxhWxKVn8wwyJ7dLeek5dZ9PAXZ/4cClCak2OSBILDU95L1pfqCuR50x4 QrqWoHC22nb7JAGQQImphYKLaGGetngm3MO5wMtuJqc7DrorRSXmWGFddGG/hHnFew11 HZ7eW/GO+3IqzfqhBgfwp2IuGTGkdfHq11w/Jzz1x+aGPquRdbapq8zUtJrwluzbN+zW xuPx+IMnTUgyiV52XVweCi+7NdS9rM2I8rmRWQYnkB9qrp4sk8KhWgOqYu4WK1Ne/AFf w3ZA== X-Forwarded-Encrypted: i=1; AJvYcCWivFJMybmTq5wd45iEJDv5VKWm+6MJrHuJImTkoFbHKeqyc2OgjLZv01+jWcQOugPWNaJliBMD5cLWpq1eYVJjERNS4iEz X-Gm-Message-State: AOJu0YxntpSRLxscIW06iXBYfmTQ1sMb0n3Ydp1kcJN//hKpWIAjl8N1 DdNIz3OwqtqT0AeSYul3po4MqCVckkDRmapQyspYGNyMAHaiitu6QtbzBsnLmaWGW1zCkh8/mHs 9Ed16HVdlWw== X-Google-Smtp-Source: AGHT+IFiOXtYcVcrbcpQ+f4ssuc9TOBBpG0L7tajwErpBOPiqssJ0HbexIzBbNF1z2N7ygVdZdCrKERQ9I8q9g== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:10c2:b0:dcd:5e5d:458b with SMTP id w2-20020a05690210c200b00dcd5e5d458bmr384798ybu.3.1709025858743; Tue, 27 Feb 2024 01:24:18 -0800 (PST) Date: Tue, 27 Feb 2024 09:24:11 +0000 In-Reply-To: <20240227092411.2315725-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240227092411.2315725-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240227092411.2315725-4-edumazet@google.com> Subject: [PATCH net-next 3/3] inet: use xa_array iterator to implement inet_netconf_dump_devconf() From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: David Ahern , Jiri Pirko , netdev@vger.kernel.org, eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org 1) inet_netconf_dump_devconf() can run under RCU protection instead of RTNL. 2) properly return 0 at the end of a dump, avoiding an an extra recvmsg() system call. 3) Do not use inet_base_seq() anymore, for_each_netdev_dump() has nice properties. Restarting a GETDEVCONF dump if a device has been added/removed or if net->ipv4.dev_addr_genid has changed is moot. Signed-off-by: Eric Dumazet Reviewed-by: Jiri Pirko --- net/ipv4/devinet.c | 101 +++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 58 deletions(-) diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index f045a34e90b974b17512a30c3b719bdfc3cba153..af741af61830aeb695e7e75608515547dade8f39 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -2267,11 +2267,13 @@ static int inet_netconf_dump_devconf(struct sk_buff *skb, { const struct nlmsghdr *nlh = cb->nlh; struct net *net = sock_net(skb->sk); - int h, s_h; - int idx, s_idx; + struct { + unsigned long ifindex; + unsigned int all_default; + } *ctx = (void *)cb->ctx; + const struct in_device *in_dev; struct net_device *dev; - struct in_device *in_dev; - struct hlist_head *head; + int err = 0; if (cb->strict_check) { struct netlink_ext_ack *extack = cb->extack; @@ -2288,64 +2290,47 @@ static int inet_netconf_dump_devconf(struct sk_buff *skb, } } - s_h = cb->args[0]; - s_idx = idx = cb->args[1]; - - for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { - idx = 0; - head = &net->dev_index_head[h]; - rcu_read_lock(); - cb->seq = inet_base_seq(net); - hlist_for_each_entry_rcu(dev, head, index_hlist) { - if (idx < s_idx) - goto cont; - in_dev = __in_dev_get_rcu(dev); - if (!in_dev) - goto cont; - - if (inet_netconf_fill_devconf(skb, dev->ifindex, - &in_dev->cnf, - NETLINK_CB(cb->skb).portid, - nlh->nlmsg_seq, - RTM_NEWNETCONF, - NLM_F_MULTI, - NETCONFA_ALL) < 0) { - rcu_read_unlock(); - goto done; - } - nl_dump_check_consistent(cb, nlmsg_hdr(skb)); -cont: - idx++; - } - rcu_read_unlock(); + rcu_read_lock(); + for_each_netdev_dump(net, dev, ctx->ifindex) { + in_dev = __in_dev_get_rcu(dev); + if (!in_dev) + continue; + err = inet_netconf_fill_devconf(skb, dev->ifindex, + &in_dev->cnf, + NETLINK_CB(cb->skb).portid, + nlh->nlmsg_seq, + RTM_NEWNETCONF, NLM_F_MULTI, + NETCONFA_ALL); + if (err < 0) + goto done; } - if (h == NETDEV_HASHENTRIES) { - if (inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL, - net->ipv4.devconf_all, - NETLINK_CB(cb->skb).portid, - nlh->nlmsg_seq, - RTM_NEWNETCONF, NLM_F_MULTI, - NETCONFA_ALL) < 0) + if (ctx->all_default == 0) { + err = inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL, + net->ipv4.devconf_all, + NETLINK_CB(cb->skb).portid, + nlh->nlmsg_seq, + RTM_NEWNETCONF, NLM_F_MULTI, + NETCONFA_ALL); + if (err < 0) goto done; - else - h++; - } - if (h == NETDEV_HASHENTRIES + 1) { - if (inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT, - net->ipv4.devconf_dflt, - NETLINK_CB(cb->skb).portid, - nlh->nlmsg_seq, - RTM_NEWNETCONF, NLM_F_MULTI, - NETCONFA_ALL) < 0) + ctx->all_default++; + } + if (ctx->all_default == 1) { + err = inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT, + net->ipv4.devconf_dflt, + NETLINK_CB(cb->skb).portid, + nlh->nlmsg_seq, + RTM_NEWNETCONF, NLM_F_MULTI, + NETCONFA_ALL); + if (err < 0) goto done; - else - h++; + ctx->all_default++; } done: - cb->args[0] = h; - cb->args[1] = idx; - - return skb->len; + if (err < 0 && likely(skb->len)) + err = skb->len; + rcu_read_unlock(); + return err; } #ifdef CONFIG_SYSCTL @@ -2829,5 +2814,5 @@ void __init devinet_init(void) rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, 0); rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, inet_netconf_dump_devconf, - RTNL_FLAG_DOIT_UNLOCKED); + RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED); }