Skip to content

Commit

Permalink
net/mlx4: Add reference counting to MAC registeration
Browse files Browse the repository at this point in the history
Add reference counting to the driver MAC registeration code. This would
be needed for cases where a mac is registered from more than once, e.g
when both the host and the VM driver register the same mac, the host
for mac spoof protection purposes and the VM for its regular needs.

Signed-off-by: Rony Efraim <ronye@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Rony Efraim authored and David S. Miller committed Apr 27, 2013
1 parent dc8142e commit 6ce71ac
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions drivers/net/ethernet/mellanox/mlx4/port.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,9 @@ int __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac)
}

if (mac == (MLX4_MAC_MASK & be64_to_cpu(table->entries[i]))) {
/* MAC already registered, Must not have duplicates */
err = -EEXIST;
/* MAC already registered, increment ref count */
err = i;
++table->refs[i];
goto out;
}
}
Expand All @@ -165,7 +166,7 @@ int __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac)
table->entries[free] = 0;
goto out;
}

table->refs[free] = 1;
err = free;
++table->total;
out:
Expand Down Expand Up @@ -206,12 +207,16 @@ void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac)
struct mlx4_mac_table *table = &info->mac_table;
int index;

index = find_index(dev, table, mac);

mutex_lock(&table->mutex);
index = find_index(dev, table, mac);

if (validate_index(dev, table, index))
goto out;
if (--table->refs[index]) {
mlx4_dbg(dev, "Have more references for index %d,"
"no need to modify mac table\n", index);
goto out;
}

table->entries[index] = 0;
mlx4_set_port_mac_table(dev, port, table->entries);
Expand Down

0 comments on commit 6ce71ac

Please sign in to comment.