All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jay Vosburgh <jay.vosburgh@canonical.com>
To: Eric Dumazet <edumazet@google.com>
Cc: "David S . Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Andy Gospodarek <andy@greyhouse.net>,
	netdev@vger.kernel.org, eric.dumazet@gmail.com
Subject: Re: [PATCH net-next 3/3] bonding: no longer use RTNL in bonding_show_queue_id()
Date: Tue, 09 Apr 2024 13:39:33 -0700	[thread overview]
Message-ID: <17498.1712695173@famine> (raw)
In-Reply-To: <20240408190437.2214473-4-edumazet@google.com>

Eric Dumazet <edumazet@google.com> wrote:

>Annotate lockless reads of slave->queue_id.
>
>Annotate writes of slave->queue_id.
>
>Switch bonding_show_queue_id() to rcu_read_lock()
>and bond_for_each_slave_rcu().

	This is combining two logical changes into one patch, isn't it?
The annotation change isn't part of what's stated in the Subject.

	-J

>Signed-off-by: Eric Dumazet <edumazet@google.com>
>---
> drivers/net/bonding/bond_main.c        |  2 +-
> drivers/net/bonding/bond_netlink.c     |  3 ++-
> drivers/net/bonding/bond_options.c     |  2 +-
> drivers/net/bonding/bond_procfs.c      |  2 +-
> drivers/net/bonding/bond_sysfs.c       | 10 +++++-----
> drivers/net/bonding/bond_sysfs_slave.c |  2 +-
> 6 files changed, 11 insertions(+), 10 deletions(-)
>
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index 08e9bdbf450afdc103931249259c58a08665dc02..b3a7d60c3a5ca60be1d9eed184ec1dad593a182b 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -5245,7 +5245,7 @@ static inline int bond_slave_override(struct bonding *bond,
> 
> 	/* Find out if any slaves have the same mapping as this skb. */
> 	bond_for_each_slave_rcu(bond, slave, iter) {
>-		if (slave->queue_id == skb_get_queue_mapping(skb)) {
>+		if (READ_ONCE(slave->queue_id) == skb_get_queue_mapping(skb)) {
> 			if (bond_slave_is_up(slave) &&
> 			    slave->link == BOND_LINK_UP) {
> 				bond_dev_queue_xmit(bond, skb, slave->dev);
>diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c
>index 29b4c3d1b9b6ff873fe067e80bedf7cb681d18f1..2a6a424806aa603ad8a00ca797e9e22d38bd0435 100644
>--- a/drivers/net/bonding/bond_netlink.c
>+++ b/drivers/net/bonding/bond_netlink.c
>@@ -51,7 +51,8 @@ static int bond_fill_slave_info(struct sk_buff *skb,
> 		    slave_dev->addr_len, slave->perm_hwaddr))
> 		goto nla_put_failure;
> 
>-	if (nla_put_u16(skb, IFLA_BOND_SLAVE_QUEUE_ID, slave->queue_id))
>+	if (nla_put_u16(skb, IFLA_BOND_SLAVE_QUEUE_ID,
>+			READ_ONCE(slave->queue_id)))
> 		goto nla_put_failure;
> 
> 	if (nla_put_s32(skb, IFLA_BOND_SLAVE_PRIO, slave->prio))
>diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
>index 4cdbc7e084f4b4cb3b150656aa765531806d8ad9..0cacd7027e352dbf3204d82b7ce1672469a186de 100644
>--- a/drivers/net/bonding/bond_options.c
>+++ b/drivers/net/bonding/bond_options.c
>@@ -1589,7 +1589,7 @@ static int bond_option_queue_id_set(struct bonding *bond,
> 		goto err_no_cmd;
> 
> 	/* Actually set the qids for the slave */
>-	update_slave->queue_id = qid;
>+	WRITE_ONCE(update_slave->queue_id, qid);
> 
> out:
> 	return ret;
>diff --git a/drivers/net/bonding/bond_procfs.c b/drivers/net/bonding/bond_procfs.c
>index 43be458422b3f9448d96383b0fb140837562f446..7edf72ec816abd8b66917bdecd2c93d237629ffa 100644
>--- a/drivers/net/bonding/bond_procfs.c
>+++ b/drivers/net/bonding/bond_procfs.c
>@@ -209,7 +209,7 @@ static void bond_info_show_slave(struct seq_file *seq,
> 
> 	seq_printf(seq, "Permanent HW addr: %*phC\n",
> 		   slave->dev->addr_len, slave->perm_hwaddr);
>-	seq_printf(seq, "Slave queue ID: %d\n", slave->queue_id);
>+	seq_printf(seq, "Slave queue ID: %d\n", READ_ONCE(slave->queue_id));
> 
> 	if (BOND_MODE(bond) == BOND_MODE_8023AD) {
> 		const struct port *port = &SLAVE_AD_INFO(slave)->port;
>diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
>index 75ee7ca369034ef6fa58fc9399b566dd7044fedc..1e13bb17051567e2b5d9451ceef47f2cf1a588ec 100644
>--- a/drivers/net/bonding/bond_sysfs.c
>+++ b/drivers/net/bonding/bond_sysfs.c
>@@ -625,10 +625,9 @@ static ssize_t bonding_show_queue_id(struct device *d,
> 	struct slave *slave;
> 	int res = 0;
> 
>-	if (!rtnl_trylock())
>-		return restart_syscall();
>+	rcu_read_lock();
> 
>-	bond_for_each_slave(bond, slave, iter) {
>+	bond_for_each_slave_rcu(bond, slave, iter) {
> 		if (res > (PAGE_SIZE - IFNAMSIZ - 6)) {
> 			/* not enough space for another interface_name:queue_id pair */
> 			if ((PAGE_SIZE - res) > 10)
>@@ -637,12 +636,13 @@ static ssize_t bonding_show_queue_id(struct device *d,
> 			break;
> 		}
> 		res += sysfs_emit_at(buf, res, "%s:%d ",
>-				     slave->dev->name, slave->queue_id);
>+				     slave->dev->name,
>+				     READ_ONCE(slave->queue_id));
> 	}
> 	if (res)
> 		buf[res-1] = '\n'; /* eat the leftover space */
> 
>-	rtnl_unlock();
>+	rcu_read_unlock();
> 
> 	return res;
> }
>diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c
>index 313866f2c0e49ac96299ffea307b1613955713ec..36d0e8440b5b94464b3226ce1a04f32361de5aa6 100644
>--- a/drivers/net/bonding/bond_sysfs_slave.c
>+++ b/drivers/net/bonding/bond_sysfs_slave.c
>@@ -53,7 +53,7 @@ static SLAVE_ATTR_RO(perm_hwaddr);
> 
> static ssize_t queue_id_show(struct slave *slave, char *buf)
> {
>-	return sysfs_emit(buf, "%d\n", slave->queue_id);
>+	return sysfs_emit(buf, "%d\n", READ_ONCE(slave->queue_id));
> }
> static SLAVE_ATTR_RO(queue_id);
> 
>-- 
>2.44.0.478.gd926399ef9-goog
>
>

---
	-Jay Vosburgh, jay.vosburgh@canonical.com

  reply	other threads:[~2024-04-09 20:39 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-08 19:04 [PATCH net-next 0/3] bonding: remove RTNL from three sysfs files Eric Dumazet
2024-04-08 19:04 ` [PATCH net-next 1/3] bonding: no longer use RTNL in bonding_show_bonds() Eric Dumazet
2024-04-09 20:37   ` Jay Vosburgh
2024-04-08 19:04 ` [PATCH net-next 2/3] bonding: no longer use RTNL in bonding_show_slaves() Eric Dumazet
2024-04-09 20:37   ` Jay Vosburgh
2024-04-08 19:04 ` [PATCH net-next 3/3] bonding: no longer use RTNL in bonding_show_queue_id() Eric Dumazet
2024-04-09 20:39   ` Jay Vosburgh [this message]
2024-04-09 20:47     ` Eric Dumazet
2024-04-09 20:53       ` Jay Vosburgh
2024-04-10  0:40 ` [PATCH net-next 0/3] bonding: remove RTNL from three sysfs files patchwork-bot+netdevbpf

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=17498.1712695173@famine \
    --to=jay.vosburgh@canonical.com \
    --cc=andy@greyhouse.net \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.