From: Eric Dumazet <edumazet@google.com>
To: "David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
Paolo Abeni <pabeni@redhat.com>
Cc: netdev@vger.kernel.org, eric.dumazet@gmail.com,
Eric Dumazet <edumazet@google.com>
Subject: [PATCH net-next 10/13] net: add netdev_set_operstate() helper
Date: Wed, 7 Feb 2024 14:26:26 +0000 [thread overview]
Message-ID: <20240207142629.3456570-11-edumazet@google.com> (raw)
In-Reply-To: <20240207142629.3456570-1-edumazet@google.com>
dev_base_lock is going away, add netdev_set_operstate() helper
so that hsr does not have to know core internals.
Remove dev_base_lock acquisition from rfc2863_policy()
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
include/linux/rtnetlink.h | 2 ++
net/core/link_watch.c | 4 ----
net/core/rtnetlink.c | 22 +++++++++++++++-------
net/hsr/hsr_device.c | 22 ++++++----------------
4 files changed, 23 insertions(+), 27 deletions(-)
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index 21780608cf47ca0687dbaaf0d07b561e8631412c..cdfc897f1e3c683940a0958bc8a790c07ae819b0 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -172,4 +172,6 @@ rtnl_notify_needed(const struct net *net, u16 nlflags, u32 group)
return (nlflags & NLM_F_ECHO) || rtnl_has_listeners(net, group);
}
+void netdev_set_operstate(struct net_device *dev, int newstate);
+
#endif /* __LINUX_RTNETLINK_H */
diff --git a/net/core/link_watch.c b/net/core/link_watch.c
index 1b93e054c9a3cfcdd5d1251a9982d88a071abbaa..83fdeb60dbd21169ab7a52def3674615b2ddedbd 100644
--- a/net/core/link_watch.c
+++ b/net/core/link_watch.c
@@ -70,8 +70,6 @@ static void rfc2863_policy(struct net_device *dev)
if (operstate == READ_ONCE(dev->operstate))
return;
- write_lock(&dev_base_lock);
-
switch(dev->link_mode) {
case IF_LINK_MODE_TESTING:
if (operstate == IF_OPER_UP)
@@ -88,8 +86,6 @@ static void rfc2863_policy(struct net_device *dev)
}
WRITE_ONCE(dev->operstate, operstate);
-
- write_unlock(&dev_base_lock);
}
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 4e797326c88fe1e23ca66e82103176767fe5c32e..46710e5f9bd19298403cdb8c179f33f155a4c9ad 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -842,9 +842,22 @@ int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, u32 id,
}
EXPORT_SYMBOL_GPL(rtnl_put_cacheinfo);
+void netdev_set_operstate(struct net_device *dev, int newstate)
+{
+ unsigned char old = READ_ONCE(dev->operstate);
+
+ do {
+ if (old == newstate)
+ return;
+ } while (!try_cmpxchg(&dev->operstate, &old, newstate));
+
+ netdev_state_change(dev);
+}
+EXPORT_SYMBOL(netdev_set_operstate);
+
static void set_operstate(struct net_device *dev, unsigned char transition)
{
- unsigned char operstate = dev->operstate;
+ unsigned char operstate = READ_ONCE(dev->operstate);
switch (transition) {
case IF_OPER_UP:
@@ -866,12 +879,7 @@ static void set_operstate(struct net_device *dev, unsigned char transition)
break;
}
- if (READ_ONCE(dev->operstate) != operstate) {
- write_lock(&dev_base_lock);
- WRITE_ONCE(dev->operstate, operstate);
- write_unlock(&dev_base_lock);
- netdev_state_change(dev);
- }
+ netdev_set_operstate(dev, operstate);
}
static unsigned int rtnl_dev_get_flags(const struct net_device *dev)
diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c
index be0e43f46556e028e675147e63c6b787aa72e894..5ef6d437db727e60bfd8cf68f010f0151d0db98b 100644
--- a/net/hsr/hsr_device.c
+++ b/net/hsr/hsr_device.c
@@ -28,29 +28,19 @@ static bool is_slave_up(struct net_device *dev)
return dev && is_admin_up(dev) && netif_oper_up(dev);
}
-static void __hsr_set_operstate(struct net_device *dev, int transition)
-{
- write_lock(&dev_base_lock);
- if (READ_ONCE(dev->operstate) != transition) {
- WRITE_ONCE(dev->operstate, transition);
- write_unlock(&dev_base_lock);
- netdev_state_change(dev);
- } else {
- write_unlock(&dev_base_lock);
- }
-}
-
static void hsr_set_operstate(struct hsr_port *master, bool has_carrier)
{
- if (!is_admin_up(master->dev)) {
- __hsr_set_operstate(master->dev, IF_OPER_DOWN);
+ struct net_device *dev = master->dev;
+
+ if (!is_admin_up(dev)) {
+ netdev_set_operstate(dev, IF_OPER_DOWN);
return;
}
if (has_carrier)
- __hsr_set_operstate(master->dev, IF_OPER_UP);
+ netdev_set_operstate(dev, IF_OPER_UP);
else
- __hsr_set_operstate(master->dev, IF_OPER_LOWERLAYERDOWN);
+ netdev_set_operstate(dev, IF_OPER_LOWERLAYERDOWN);
}
static bool hsr_check_carrier(struct hsr_port *master)
--
2.43.0.594.gd9cf4e227d-goog
next prev parent reply other threads:[~2024-02-07 14:26 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-07 14:26 [PATCH net-next 00/13] net: complete dev_base_lock removal Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 01/13] net: annotate data-races around dev->name_assign_type Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 02/13] ip_tunnel: annotate data-races around t->parms.link Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 03/13] dev: annotate accesses to dev->link Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 04/13] net: convert dev->reg_state to u8 Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 05/13] net-sysfs: convert netdev_show() to RCU Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 06/13] net-sysfs: use dev_addr_sem to remove races in address_show() Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 07/13] net-sysfs: convert dev->operstate reads to lockless ones Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 08/13] net-sysfs: convert netstat_show() to RCU Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 09/13] net: remove stale mentions of dev_base_lock in comments Eric Dumazet
2024-02-07 14:26 ` Eric Dumazet [this message]
2024-02-08 11:44 ` [PATCH net-next 10/13] net: add netdev_set_operstate() helper kernel test robot
2024-02-08 13:20 ` kernel test robot
2024-02-08 13:35 ` Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 11/13] net: remove dev_base_lock from do_setlink() Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 12/13] net: remove dev_base_lock from register_netdevice() and friends Eric Dumazet
2024-02-07 14:26 ` [PATCH net-next 13/13] net: remove dev_base_lock Eric Dumazet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240207142629.3456570-11-edumazet@google.com \
--to=edumazet@google.com \
--cc=davem@davemloft.net \
--cc=eric.dumazet@gmail.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).