Skip to content

Commit

Permalink
bonding: procfs: clean bond->lock usage and use RCU
Browse files Browse the repository at this point in the history
Use RCU to protect against slave release, the proc show function will sync
with the bond destruction by the proc locks and the fact that the bond is
released after NETDEV_UNREGISTER which causes the bonding to remove the
proc entry.

Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Nikolay Aleksandrov authored and David S. Miller committed Sep 10, 2014
1 parent 059b47e commit e9fe8ef
Showing 1 changed file with 3 additions and 13 deletions.
16 changes: 3 additions & 13 deletions drivers/net/bonding/bond_procfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,18 @@

static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(RCU)
__acquires(&bond->lock)
{
struct bonding *bond = seq->private;
struct list_head *iter;
struct slave *slave;
loff_t off = 0;

/* make sure the bond won't be taken away */
rcu_read_lock();
read_lock(&bond->lock);

if (*pos == 0)
return SEQ_START_TOKEN;

bond_for_each_slave(bond, slave, iter)
bond_for_each_slave_rcu(bond, slave, iter)
if (++off == *pos)
return slave;

Expand All @@ -37,12 +34,9 @@ static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos)

++*pos;
if (v == SEQ_START_TOKEN)
return bond_first_slave(bond);
return bond_first_slave_rcu(bond);

if (bond_is_last_slave(bond, v))
return NULL;

bond_for_each_slave(bond, slave, iter) {
bond_for_each_slave_rcu(bond, slave, iter) {
if (found)
return slave;
if (slave == v)
Expand All @@ -53,12 +47,8 @@ static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos)
}

static void bond_info_seq_stop(struct seq_file *seq, void *v)
__releases(&bond->lock)
__releases(RCU)
{
struct bonding *bond = seq->private;

read_unlock(&bond->lock);
rcu_read_unlock();
}

Expand Down

0 comments on commit e9fe8ef

Please sign in to comment.