Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66920e1b authored by Steve Wise's avatar Steve Wise Committed by Jason Gunthorpe
Browse files

rdma_rxe: Use netlink messages to add/delete links



Add support for the RDMA_NLDEV_CMD_NEWLINK/DELLINK messages which allow
dynamically adding new RXE links.  Deprecate the old module options for
now.

Cc: Moni Shoua <monis@mellanox.com>
Reviewed-by: default avatarYanjun Zhu <yanjun.zhu@oracle.com>
Signed-off-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 3856ec4b
Loading
Loading
Loading
Loading
+34 −2
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
 * SOFTWARE.
 */

#include <rdma/rdma_netlink.h>
#include <net/addrconf.h>
#include "rxe.h"
#include "rxe_loc.h"
@@ -301,7 +302,7 @@ void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)
/* called by ifc layer to create new rxe device.
 * The caller should allocate memory for rxe by calling ib_alloc_device.
 */
int rxe_add(struct rxe_dev *rxe, unsigned int mtu)
int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name)
{
	int err;

@@ -311,9 +312,36 @@ int rxe_add(struct rxe_dev *rxe, unsigned int mtu)

	rxe_set_mtu(rxe, mtu);

	return rxe_register_device(rxe);
	return rxe_register_device(rxe, ibdev_name);
}

static int rxe_newlink(const char *ibdev_name, struct net_device *ndev)
{
	struct rxe_dev *exists;
	int err = 0;

	exists = rxe_get_dev_from_net(ndev);
	if (exists) {
		ib_device_put(&exists->ib_dev);
		pr_err("already configured on %s\n", ndev->name);
		err = -EEXIST;
		goto err;
	}

	err = rxe_net_add(ibdev_name, ndev);
	if (err) {
		pr_err("failed to add %s\n", ndev->name);
		goto err;
	}
err:
	return err;
}

static struct rdma_link_ops rxe_link_ops = {
	.type = "rxe",
	.newlink = rxe_newlink,
};

static int __init rxe_module_init(void)
{
	int err;
@@ -329,12 +357,14 @@ static int __init rxe_module_init(void)
	if (err)
		return err;

	rdma_link_register(&rxe_link_ops);
	pr_info("loaded\n");
	return 0;
}

static void __exit rxe_module_exit(void)
{
	rdma_link_unregister(&rxe_link_ops);
	ib_unregister_driver(RDMA_DRIVER_RXE);
	rxe_net_exit();
	rxe_cache_exit();
@@ -344,3 +374,5 @@ static void __exit rxe_module_exit(void)

late_initcall(rxe_module_init);
module_exit(rxe_module_exit);

MODULE_ALIAS_RDMA_LINK("rxe");
+1 −1
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ static inline u32 rxe_crc32(struct rxe_dev *rxe,

void rxe_set_mtu(struct rxe_dev *rxe, unsigned int dev_mtu);

int rxe_add(struct rxe_dev *rxe, unsigned int mtu);
int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name);

void rxe_rcv(struct sk_buff *skb);

+2 −2
Original line number Diff line number Diff line
@@ -517,7 +517,7 @@ enum rdma_link_layer rxe_link_layer(struct rxe_dev *rxe, unsigned int port_num)
	return IB_LINK_LAYER_ETHERNET;
}

int rxe_net_add(struct net_device *ndev)
int rxe_net_add(const char *ibdev_name, struct net_device *ndev)
{
	int err;
	struct rxe_dev *rxe = NULL;
@@ -528,7 +528,7 @@ int rxe_net_add(struct net_device *ndev)

	rxe->ndev = ndev;

	err = rxe_add(rxe, ndev->mtu);
	err = rxe_add(rxe, ndev->mtu, ibdev_name);
	if (err) {
		ib_dealloc_device(&rxe->ib_dev);
		return err;
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ struct rxe_recv_sockets {
	struct socket *sk6;
};

int rxe_net_add(struct net_device *ndev);
int rxe_net_add(const char *ibdev_name, struct net_device *ndev);

int rxe_net_init(void);
void rxe_net_exit(void);
+2 −1
Original line number Diff line number Diff line
@@ -78,7 +78,8 @@ enum rxe_device_param {
					| IB_DEVICE_SYS_IMAGE_GUID
					| IB_DEVICE_RC_RNR_NAK_GEN
					| IB_DEVICE_SRQ_RESIZE
					| IB_DEVICE_MEM_MGT_EXTENSIONS,
					| IB_DEVICE_MEM_MGT_EXTENSIONS
					| IB_DEVICE_ALLOW_USER_UNREG,
	RXE_MAX_SGE			= 32,
	RXE_MAX_SGE_RD			= 32,
	RXE_MAX_CQ			= 16384,
Loading