mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-02-01 18:52:36 +00:00
bonding: no longer use RTNL in bonding_show_queue_id()
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(). Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com> Link: https://lore.kernel.org/r/20240408190437.2214473-4-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
d67fed98ca
commit
662e451d9a
@ -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);
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user