]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/infiniband/core/nldev.c
RDMA/core: Add interface to read device namespace sharing mode
[linux.git] / drivers / infiniband / core / nldev.c
index 284e5f103fc931dcfc27ffa899f53f2ba34d88af..49c048738f946d0f5e3677e52ab1fab9db771ce3 100644 (file)
@@ -116,6 +116,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_RES_CTXN]              = { .type = NLA_U32 },
        [RDMA_NLDEV_ATTR_LINK_TYPE]             = { .type = NLA_NUL_STRING,
                                    .len = RDMA_NLDEV_ATTR_ENTRY_STRLEN },
+       [RDMA_NLDEV_SYS_ATTR_NETNS_MODE]        = { .type = NLA_U8 },
 };
 
 static int put_driver_name_print_type(struct sk_buff *msg, const char *name,
@@ -1312,6 +1313,34 @@ static int nldev_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
        return 0;
 }
 
+static int nldev_get_sys_get_dumpit(struct sk_buff *skb,
+                                   struct netlink_callback *cb)
+{
+       struct nlattr *tb[RDMA_NLDEV_ATTR_MAX];
+       struct nlmsghdr *nlh;
+       int err;
+
+       err = nlmsg_parse(cb->nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                         nldev_policy, NULL);
+       if (err)
+               return err;
+
+       nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
+                       RDMA_NL_GET_TYPE(RDMA_NL_NLDEV,
+                                        RDMA_NLDEV_CMD_SYS_GET),
+                       0, 0);
+
+       err = nla_put_u8(skb, RDMA_NLDEV_SYS_ATTR_NETNS_MODE,
+                        (u8)ib_devices_shared_netns);
+       if (err) {
+               nlmsg_cancel(skb, nlh);
+               return err;
+       }
+
+       nlmsg_end(skb, nlh);
+       return skb->len;
+}
+
 static const struct rdma_nl_cbs nldev_cb_table[RDMA_NLDEV_NUM_OPS] = {
        [RDMA_NLDEV_CMD_GET] = {
                .doit = nldev_get_doit,
@@ -1357,6 +1386,9 @@ static const struct rdma_nl_cbs nldev_cb_table[RDMA_NLDEV_NUM_OPS] = {
                .doit = nldev_res_get_pd_doit,
                .dump = nldev_res_get_pd_dumpit,
        },
+       [RDMA_NLDEV_CMD_SYS_GET] = {
+               .dump = nldev_get_sys_get_dumpit,
+       },
 };
 
 void __init nldev_init(void)