Commit fd49ddaf authored by Mohammad Heib's avatar Mohammad Heib Committed by Jason Gunthorpe

RDMA/rxe: prevent rxe creation on top of vlan interface

Creating rxe device on top of vlan interface will create a non-functional
device that has an empty gids table and can't be used for rdma cm
communication.

This is caused by the logic in
enum_all_gids_of_dev_cb()/is_eth_port_of_netdev(), which only considers
networks connected to "upper devices" of the configured network device,
resulting in an empty set of gids for a vlan interface, and attempts to
connect via this rdma device fail in cm_init_av_for_response because no
gids can be resolved.

Apparently, this behavior was implemented to fit the HW-RoCE devices that
create RoCE device per port, therefore RXE must behave the same like
HW-RoCE devices and create rxe device per real device only.

In order to communicate via a vlan interface, the user must use the gid
index of the vlan address instead of creating rxe over vlan.

Link: https://lore.kernel.org/r/20200811150415.3693-1-goody698@gmail.comSigned-off-by: default avatarMohammad Heib <goody698@gmail.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 785167a1
...@@ -277,6 +277,12 @@ static int rxe_newlink(const char *ibdev_name, struct net_device *ndev) ...@@ -277,6 +277,12 @@ static int rxe_newlink(const char *ibdev_name, struct net_device *ndev)
struct rxe_dev *exists; struct rxe_dev *exists;
int err = 0; int err = 0;
if (is_vlan_dev(ndev)) {
pr_err("rxe creation allowed on top of a real device only\n");
err = -EPERM;
goto err;
}
exists = rxe_get_dev_from_net(ndev); exists = rxe_get_dev_from_net(ndev);
if (exists) { if (exists) {
ib_device_put(&exists->ib_dev); ib_device_put(&exists->ib_dev);
......
...@@ -73,6 +73,12 @@ static int rxe_param_set_add(const char *val, const struct kernel_param *kp) ...@@ -73,6 +73,12 @@ static int rxe_param_set_add(const char *val, const struct kernel_param *kp)
return -EINVAL; return -EINVAL;
} }
if (is_vlan_dev(ndev)) {
pr_err("rxe creation allowed on top of a real device only\n");
err = -EPERM;
goto err;
}
exists = rxe_get_dev_from_net(ndev); exists = rxe_get_dev_from_net(ndev);
if (exists) { if (exists) {
ib_device_put(&exists->ib_dev); ib_device_put(&exists->ib_dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment