[PATCH v1 rdma-next 3/4] RDMA/nldev: add provider-specific device/port tracking

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add fill_dev_info and fill_port_info functions to rdma_restrack_root.
This allows providers to have provider-specific fill functions for device
and port restrack operations.

Signed-off-by: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx>
---
 drivers/infiniband/core/nldev.c | 35 +++++++++++++++++++++++++++++------
 include/rdma/restrack.h         | 15 +++++++++++++++
 2 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
index 8346ede..16c5eba 100644
--- a/drivers/infiniband/core/nldev.c
+++ b/drivers/infiniband/core/nldev.c
@@ -116,6 +116,22 @@ static int provider_fill_res_entry(struct rdma_restrack_root *resroot,
 		resroot->fill_res_entry(msg, cb, res) : 0;
 }
 
+static int provider_fill_dev_info(struct sk_buff *msg,
+				  struct netlink_callback *cb,
+				  struct ib_device *device)
+{
+	return device->res.fill_dev_info ?
+		device->res.fill_dev_info(msg, cb, device) : 0;
+}
+
+static int provider_fill_port_info(struct sk_buff *msg,
+				   struct netlink_callback *cb,
+				   struct ib_device *device, u32 port)
+{
+	return device->res.fill_port_info ?
+		device->res.fill_port_info(msg, cb, device, port) : 0;
+}
+
 static int fill_nldev_handle(struct sk_buff *msg, struct ib_device *device)
 {
 	if (nla_put_u32(msg, RDMA_NLDEV_ATTR_DEV_INDEX, device->index))
@@ -126,7 +142,8 @@ static int fill_nldev_handle(struct sk_buff *msg, struct ib_device *device)
 	return 0;
 }
 
-static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)
+static int fill_dev_info(struct sk_buff *msg, struct netlink_callback *cb,
+			 struct ib_device *device)
 {
 	char fw[IB_FW_VERSION_NAME_MAX];
 
@@ -157,10 +174,14 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)
 		return -EMSGSIZE;
 	if (nla_put_u8(msg, RDMA_NLDEV_ATTR_DEV_NODE_TYPE, device->node_type))
 		return -EMSGSIZE;
+
+	if (provider_fill_dev_info(msg, cb, device))
+		return -EMSGSIZE;
+
 	return 0;
 }
 
-static int fill_port_info(struct sk_buff *msg,
+static int fill_port_info(struct sk_buff *msg, struct netlink_callback *cb,
 			  struct ib_device *device, u32 port)
 {
 	struct ib_port_attr attr;
@@ -196,6 +217,8 @@ static int fill_port_info(struct sk_buff *msg,
 		return -EMSGSIZE;
 	if (nla_put_u8(msg, RDMA_NLDEV_ATTR_PORT_PHYS_STATE, attr.phys_state))
 		return -EMSGSIZE;
+	if (provider_fill_port_info(msg, cb, device, port))
+		return -EMSGSIZE;
 	return 0;
 }
 
@@ -555,7 +578,7 @@ static int nldev_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
 			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),
 			0, 0);
 
-	err = fill_dev_info(msg, device);
+	err = fill_dev_info(msg, NULL, device);
 	if (err)
 		goto err_free;
 
@@ -586,7 +609,7 @@ static int _nldev_get_dumpit(struct ib_device *device,
 			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),
 			0, NLM_F_MULTI);
 
-	if (fill_dev_info(skb, device)) {
+	if (fill_dev_info(skb, cb, device)) {
 		nlmsg_cancel(skb, nlh);
 		goto out;
 	}
@@ -646,7 +669,7 @@ static int nldev_port_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
 			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),
 			0, 0);
 
-	err = fill_port_info(msg, device, port);
+	err = fill_port_info(msg, NULL, device, port);
 	if (err)
 		goto err_free;
 
@@ -706,7 +729,7 @@ static int nldev_port_get_dumpit(struct sk_buff *skb,
 						 RDMA_NLDEV_CMD_PORT_GET),
 				0, NLM_F_MULTI);
 
-		if (fill_port_info(skb, device, p)) {
+		if (fill_port_info(skb, cb, device, p)) {
 			nlmsg_cancel(skb, nlh);
 			goto out;
 		}
diff --git a/include/rdma/restrack.h b/include/rdma/restrack.h
index bd3cd9a..936b56f 100644
--- a/include/rdma/restrack.h
+++ b/include/rdma/restrack.h
@@ -45,6 +45,7 @@ enum rdma_restrack_type {
 
 #define RDMA_RESTRACK_HASH_BITS	8
 struct rdma_restrack_entry;
+struct ib_device;
 
 /**
  * struct rdma_restrack_root - main resource tracking management
@@ -67,6 +68,20 @@ struct rdma_restrack_root {
 	int (*fill_res_entry)(struct sk_buff *msg,
 			      struct netlink_callback *cb,
 			      struct rdma_restrack_entry *entry);
+	/**
+	 * @fill_dev_info: provider-specific fill function
+	 *
+	 * Allows rdma providers to add their own device attributes.
+	 */
+	int (*fill_dev_info)(struct sk_buff *msg, struct netlink_callback *cb,
+			     struct ib_device *device);
+	/**
+	 * @fill_port_info: provider-specific fill function
+	 *
+	 * Allows rdma providers to add their own port attributes.
+	 */
+	int (*fill_port_info)(struct sk_buff *msg, struct netlink_callback *cb,
+			      struct ib_device *device, u32 port);
 };
 
 /**
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux