Skip to content

Commit 408f124

Browse files
paravmellanoxjgunthorpe
authored andcommitted
IB/core: Delete lower netdevice default GID entries in bonding scenario
When NETDEV_CHANGEUPPER event occurs, lower device is not yet established as slave of the master, and when upper device is bond device, default GID entries not deleted. Due to this, when bond device is fully configured, default GID entries of bond device cannot be added as default GID entries are occupied by the lower netdevice. This is incorrect. Default GID entries should really be of bond netdevice because in all RoCE GIDs (default or IP), MAC address of the bond device will be used. It is confusing to have default GID of netdevice which is not really used for any purpose. Therefore, as first step, implement (a) filter function which filters if a CHANGEUPPER event netdevice and associated upper device is master device or not. (b) callback function which deletes the default GIDs of lower (event netdevice). Signed-off-by: Parav Pandit <parav@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
1 parent b9f0986 commit 408f124

File tree

1 file changed

+62
-9
lines changed

1 file changed

+62
-9
lines changed

drivers/infiniband/core/roce_gid_mgmt.c

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,34 @@ static int upper_device_filter(struct ib_device *ib_dev, u8 port,
208208
return res;
209209
}
210210

211+
/**
212+
* is_upper_ndev_bond_master_filter - Check if a given netdevice
213+
* is bond master device of netdevice of the the RDMA device of port.
214+
* @ib_dev: IB device to check
215+
* @port: Port to consider for adding default GID
216+
* @rdma_ndev: Pointer to rdma netdevice
217+
* @cookie: Netdevice to consider to form a default GID
218+
*
219+
* is_upper_ndev_bond_master_filter() returns true if a cookie_netdev
220+
* is bond master device and rdma_ndev is its lower netdevice. It might
221+
* not have been established as slave device yet.
222+
*/
223+
static int
224+
is_upper_ndev_bond_master_filter(struct ib_device *ib_dev, u8 port,
225+
struct net_device *rdma_ndev,
226+
void *cookie)
227+
{
228+
struct net_device *cookie_ndev = cookie;
229+
bool match = false;
230+
231+
rcu_read_lock();
232+
if (netif_is_bond_master(cookie_ndev) &&
233+
rdma_is_upper_dev_rcu(rdma_ndev, cookie_ndev))
234+
match = true;
235+
rcu_read_unlock();
236+
return match;
237+
}
238+
211239
static void update_gid_ip(enum gid_op_type gid_op,
212240
struct ib_device *ib_dev,
213241
u8 port, struct net_device *ndev,
@@ -391,6 +419,27 @@ static void del_netdev_ips(struct ib_device *ib_dev, u8 port,
391419
ib_cache_gid_del_all_netdev_gids(ib_dev, port, cookie);
392420
}
393421

422+
/**
423+
* del_default_gids - Delete default GIDs of the event/cookie netdevice
424+
* @ib_dev: RDMA device pointer
425+
* @port: Port of the RDMA device whose GID table to consider
426+
* @rdma_ndev: Unused rdma netdevice
427+
* @cookie: Pointer to event netdevice
428+
*
429+
* del_default_gids() deletes the default GIDs of the event/cookie netdevice.
430+
*/
431+
static void del_default_gids(struct ib_device *ib_dev, u8 port,
432+
struct net_device *rdma_ndev, void *cookie)
433+
{
434+
struct net_device *cookie_ndev = cookie;
435+
unsigned long gid_type_mask;
436+
437+
gid_type_mask = roce_gid_type_mask_support(ib_dev, port);
438+
439+
ib_cache_gid_set_default_gid(ib_dev, port, cookie_ndev, gid_type_mask,
440+
IB_CACHE_GID_DEFAULT_MODE_DELETE);
441+
}
442+
394443
static void enum_all_gids_of_dev_cb(struct ib_device *ib_dev,
395444
u8 port,
396445
struct net_device *rdma_ndev,
@@ -589,30 +638,34 @@ ndev_event_unlink(struct netdev_notifier_changeupper_info *changeupper_info,
589638
}
590639

591640
static void
592-
ndev_event_link(struct netdev_notifier_changeupper_info *changeupper_info,
641+
ndev_event_link(struct net_device *event_ndev,
642+
struct netdev_notifier_changeupper_info *changeupper_info,
593643
struct netdev_event_work_cmd *cmds)
594644
{
595645
static const struct netdev_event_work_cmd
596646
bonding_default_del_cmd = {
597-
.cb = bond_delete_netdev_default_gids,
598-
.filter = is_eth_port_inactive_slave
647+
.cb = del_default_gids,
648+
.filter = is_upper_ndev_bond_master_filter
599649
};
600650
/*
601651
* When a lower netdev is linked to its upper bonding
602-
* netdev, delete lower inactive slave netdev's default GIDs.
652+
* netdev, delete lower slave netdev's default GIDs.
603653
*/
604654
cmds[0] = bonding_default_del_cmd;
605-
cmds[0].ndev = changeupper_info->upper_dev;
655+
cmds[0].ndev = event_ndev;
656+
cmds[0].filter_ndev = changeupper_info->upper_dev;
657+
606658
cmds[1] = add_cmd_upper_ips;
607659
cmds[1].ndev = changeupper_info->upper_dev;
608660
cmds[1].filter_ndev = changeupper_info->upper_dev;
609661
}
610662

611-
static void netdevice_event_changeupper(struct netdev_notifier_changeupper_info *changeupper_info,
612-
struct netdev_event_work_cmd *cmds)
663+
static void netdevice_event_changeupper(struct net_device *event_ndev,
664+
struct netdev_notifier_changeupper_info *changeupper_info,
665+
struct netdev_event_work_cmd *cmds)
613666
{
614667
if (changeupper_info->linking)
615-
ndev_event_link(changeupper_info, cmds);
668+
ndev_event_link(event_ndev, changeupper_info, cmds);
616669
else
617670
ndev_event_unlink(changeupper_info, cmds);
618671
}
@@ -657,7 +710,7 @@ static int netdevice_event(struct notifier_block *this, unsigned long event,
657710
break;
658711

659712
case NETDEV_CHANGEUPPER:
660-
netdevice_event_changeupper(
713+
netdevice_event_changeupper(ndev,
661714
container_of(ptr, struct netdev_notifier_changeupper_info, info),
662715
cmds);
663716
break;

0 commit comments

Comments
 (0)