From: Shamir Rabinovitch <srabinov7@gmail.com>
To: dledford@redhat.com, jgg@ziepe.ca, leon@kernel.org,
monis@mellanox.com, parav@mellanox.com, danielj@mellanox.com,
kamalheib1@gmail.com, markz@mellanox.com,
swise@opengridcomputing.com, shamir.rabinovitch@oracle.com,
johannes.berg@intel.com, willy@infradead.org,
michaelgur@mellanox.com, markb@mellanox.com,
yuval.shaia@oracle.com, dan.carpenter@oracle.com,
bvanassche@acm.org, maxg@mellanox.com, israelr@mellanox.com,
galpress@amazon.com, denisd@mellanox.com, yuvalav@mellanox.com,
dennis.dalessandro@intel.com, will@kernel.org,
ereza@mellanox.com, jgg@mellanox.com, linux-rdma@vger.kernel.org
Cc: Shamir Rabinovitch <srabinov7@gmail.com>
Subject: [PATCH 03/25] RDMA/nldev: ib_pd can be pointed by multiple ib_ucontext
Date: Tue, 16 Jul 2019 21:11:38 +0300 [thread overview]
Message-ID: <20190716181200.4239-4-srabinov7@gmail.com> (raw)
In-Reply-To: <20190716181200.4239-1-srabinov7@gmail.com>
From: Shamir Rabinovitch <shamir.rabinovitch@oracle.com>
In shared object model ib_pd can belong to 1 or more ib_ucontext.
Fix the nldev code so it could report multiple context ids.
Signed-off-by: Shamir Rabinovitch <shamir.rabinovitch@oracle.com>
Signed-off-by: Shamir Rabinovitch <srabinov7@gmail.com>
---
drivers/infiniband/core/nldev.c | 127 +++++++++++++++++++++++++++++--
include/uapi/rdma/rdma_netlink.h | 3 +
2 files changed, 125 insertions(+), 5 deletions(-)
diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
index 783e465e7c41..5167228dea1c 100644
--- a/drivers/infiniband/core/nldev.c
+++ b/drivers/infiniband/core/nldev.c
@@ -41,6 +41,7 @@
#include "core_priv.h"
#include "cma_priv.h"
#include "restrack.h"
+#include "uverbs.h"
/*
* Sort array elements by the netlink attribute name
@@ -141,6 +142,8 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
[RDMA_NLDEV_ATTR_UVERBS_DRIVER_ID] = { .type = NLA_U32 },
[RDMA_NLDEV_NET_NS_FD] = { .type = NLA_U32 },
[RDMA_NLDEV_SYS_ATTR_NETNS_MODE] = { .type = NLA_U8 },
+ [RDMA_NLDEV_ATTR_RES_CTX] = { .type = NLA_NESTED },
+ [RDMA_NLDEV_ATTR_RES_CTX_ENTRY] = { .type = NLA_NESTED },
};
static int put_driver_name_print_type(struct sk_buff *msg, const char *name,
@@ -611,11 +614,84 @@ static int fill_res_mr_entry(struct sk_buff *msg, bool has_cap_net_admin,
err: return -EMSGSIZE;
}
+struct context_id {
+ struct list_head list;
+ u32 id;
+};
+
+static void pd_context(struct ib_pd *pd, struct list_head *list, int *count)
+{
+ struct ib_device *device = pd->device;
+ struct rdma_restrack_entry *res;
+ struct rdma_restrack_root *rt;
+ struct ib_uverbs_file *ufile;
+ struct ib_ucontext *ucontext;
+ struct ib_uobject *uobj;
+ unsigned long flags;
+ unsigned long id;
+ bool found;
+
+ rt = &device->res[RDMA_RESTRACK_CTX];
+
+ xa_lock(&rt->xa);
+
+ xa_for_each(&rt->xa, id, res) {
+ if (!rdma_is_visible_in_pid_ns(res))
+ continue;
+
+ if (!rdma_restrack_get(res))
+ continue;
+
+ xa_unlock(&rt->xa);
+
+ ucontext = container_of(res, struct ib_ucontext, res);
+ ufile = ucontext->ufile;
+ found = false;
+
+ /* See locking requirements in struct ib_uverbs_file */
+ down_read(&ufile->hw_destroy_rwsem);
+ spin_lock_irqsave(&ufile->uobjects_lock, flags);
+
+ list_for_each_entry(uobj, &ufile->uobjects, list) {
+ if (uobj->object == pd) {
+ found = true;
+ goto found;
+ }
+ }
+
+found: spin_unlock_irqrestore(&ufile->uobjects_lock, flags);
+ up_read(&ufile->hw_destroy_rwsem);
+
+ if (found) {
+ struct context_id *ctx_id =
+ kmalloc(sizeof(*ctx_id), GFP_KERNEL);
+
+ if (WARN_ON_ONCE(!ctx_id))
+ goto next;
+
+ ctx_id->id = ucontext->res.id;
+ list_add(&ctx_id->list, list);
+ (*count)++;
+ }
+
+next: rdma_restrack_put(res);
+ xa_lock(&rt->xa);
+ }
+
+ xa_unlock(&rt->xa);
+}
+
static int fill_res_pd_entry(struct sk_buff *msg, bool has_cap_net_admin,
struct rdma_restrack_entry *res, uint32_t port)
{
struct ib_pd *pd = container_of(res, struct ib_pd, res);
struct ib_device *dev = pd->device;
+ struct nlattr *table_attr = NULL;
+ struct nlattr *entry_attr = NULL;
+ struct context_id *ctx_id;
+ struct context_id *tmp;
+ LIST_HEAD(pd_context_ids);
+ int ctx_count = 0;
if (has_cap_net_admin) {
if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY,
@@ -633,10 +709,38 @@ static int fill_res_pd_entry(struct sk_buff *msg, bool has_cap_net_admin,
if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_PDN, res->id))
goto err;
- if (!rdma_is_kernel_res(res) &&
- nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CTXN,
- pd->uobject->context->res.id))
- goto err;
+ if (!rdma_is_kernel_res(res)) {
+ pd_context(pd, &pd_context_ids, &ctx_count);
+ if (ctx_count == 1) {
+ /* user pd, not shared */
+ ctx_id = list_first_entry(&pd_context_ids,
+ struct context_id, list);
+ if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CTXN,
+ ctx_id->id))
+ goto err;
+ } else if (ctx_count > 1) {
+ /* user pd, shared */
+ table_attr = nla_nest_start(msg,
+ RDMA_NLDEV_ATTR_RES_CTX);
+ if (!table_attr)
+ goto err;
+
+ list_for_each_entry(ctx_id, &pd_context_ids, list) {
+ entry_attr = nla_nest_start(msg,
+ RDMA_NLDEV_ATTR_RES_CTX_ENTRY);
+ if (!entry_attr)
+ goto err;
+ if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CTXN,
+ ctx_id->id))
+ goto err;
+ nla_nest_end(msg, entry_attr);
+ entry_attr = NULL;
+ }
+
+ nla_nest_end(msg, table_attr);
+ table_attr = NULL;
+ }
+ }
if (fill_res_name_pid(msg, res))
goto err;
@@ -644,9 +748,22 @@ static int fill_res_pd_entry(struct sk_buff *msg, bool has_cap_net_admin,
if (fill_res_entry(dev, msg, res))
goto err;
+ list_for_each_entry_safe(ctx_id, tmp, &pd_context_ids, list)
+ kfree(ctx_id);
+
return 0;
-err: return -EMSGSIZE;
+err:
+ if (entry_attr)
+ nla_nest_end(msg, entry_attr);
+
+ if (table_attr)
+ nla_nest_end(msg, table_attr);
+
+ list_for_each_entry_safe(ctx_id, tmp, &pd_context_ids, list)
+ kfree(ctx_id);
+
+ return -EMSGSIZE;
}
static int fill_stat_counter_mode(struct sk_buff *msg,
diff --git a/include/uapi/rdma/rdma_netlink.h b/include/uapi/rdma/rdma_netlink.h
index 8e277783fa96..7fbbfb07f071 100644
--- a/include/uapi/rdma/rdma_netlink.h
+++ b/include/uapi/rdma/rdma_netlink.h
@@ -525,6 +525,9 @@ enum rdma_nldev_attr {
*/
RDMA_NLDEV_ATTR_DEV_DIM, /* u8 */
+ RDMA_NLDEV_ATTR_RES_CTX, /* nested table */
+ RDMA_NLDEV_ATTR_RES_CTX_ENTRY, /* nested table */
+
/*
* Always the end
*/
--
2.20.1
next prev parent reply other threads:[~2019-07-16 18:13 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-16 18:11 [PATCH 00/25] Shared PD and MR Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 01/25] RDMA/uverbs: uobj_get_obj_read should return the ib_uobject Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 02/25] RDMA/uverbs: Delete the macro uobj_put_obj_read Shamir Rabinovitch
2019-07-16 18:11 ` Shamir Rabinovitch [this message]
2019-07-18 16:05 ` [PATCH 03/25] RDMA/nldev: ib_pd can be pointed by multiple ib_ucontext Leon Romanovsky
2019-07-16 18:11 ` [PATCH 04/25] IB/{core,hw}: ib_pd should not have ib_uobject pointer Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 05/25] IB/core: ib_uobject need HW object reference count Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 06/25] IB/uverbs: Helper function to initialize ufile member of uverbs_attr_bundle Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 07/25] IB/uverbs: Add context import lock/unlock helper Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 08/25] IB/uverbs: ufile must be freed only when not used anymore Shamir Rabinovitch
2019-07-17 11:53 ` Jason Gunthorpe
2019-07-17 19:25 ` Shamir Rabinovitch
2019-07-17 19:33 ` Jason Gunthorpe
2019-07-17 20:31 ` Yuval Shaia
2019-07-17 20:45 ` Matthew Wilcox
2019-07-17 21:36 ` Yuval Shaia
2019-07-17 23:51 ` Ira Weiny
2019-07-18 12:17 ` Jason Gunthorpe
2019-07-18 20:45 ` Yuval Shaia
2019-07-19 11:46 ` Jason Gunthorpe
2019-07-16 18:11 ` [PATCH 09/25] IB/verbs: Prototype of HW object clone callback Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 10/25] IB/core: Install clone ib_pd in device ops Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 11/25] IB/mlx4: Add implementation of clone_pd callback Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 12/25] IB/mlx5: " Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 13/25] RDMA/rxe: " Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 14/25] IB/uverbs: Add clone reference counting to ib_pd Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 15/25] IB/uverbs: Add PD import verb Shamir Rabinovitch
2019-07-17 11:44 ` Jason Gunthorpe
2019-07-17 20:15 ` Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 16/25] IB/mlx4: Enable import from FD verb Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 17/25] IB/mlx5: " Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 18/25] RDMA/rxe: " Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 19/25] IB/core: ib_mr should not have ib_uobject pointer Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 20/25] IB/core: Install clone ib_mr in device ops Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 21/25] IB/mlx4: Add implementation of clone_pd callback Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 22/25] IB/mlx5: " Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 23/25] RDMA/rxe: " Shamir Rabinovitch
2019-07-16 18:11 ` [PATCH 24/25] IB/uverbs: Add clone reference counting to ib_mr Shamir Rabinovitch
2019-07-16 18:12 ` [PATCH 25/25] IB/uverbs: Add MR import verb Shamir Rabinovitch
2019-07-17 5:09 ` [PATCH 00/25] Shared PD and MR Christoph Hellwig
2019-07-17 11:09 ` Shamir Rabinovitch
2019-07-17 11:55 ` Jason Gunthorpe
2019-07-17 13:35 ` Shamir Rabinovitch
2019-07-17 23:55 ` Ira Weiny
2019-08-01 4:05 ` Yuval Shaia
2019-07-18 12:16 ` Jason Gunthorpe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190716181200.4239-4-srabinov7@gmail.com \
--to=srabinov7@gmail.com \
--cc=bvanassche@acm.org \
--cc=dan.carpenter@oracle.com \
--cc=danielj@mellanox.com \
--cc=denisd@mellanox.com \
--cc=dennis.dalessandro@intel.com \
--cc=dledford@redhat.com \
--cc=ereza@mellanox.com \
--cc=galpress@amazon.com \
--cc=israelr@mellanox.com \
--cc=jgg@mellanox.com \
--cc=jgg@ziepe.ca \
--cc=johannes.berg@intel.com \
--cc=kamalheib1@gmail.com \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=markb@mellanox.com \
--cc=markz@mellanox.com \
--cc=maxg@mellanox.com \
--cc=michaelgur@mellanox.com \
--cc=monis@mellanox.com \
--cc=parav@mellanox.com \
--cc=shamir.rabinovitch@oracle.com \
--cc=swise@opengridcomputing.com \
--cc=will@kernel.org \
--cc=willy@infradead.org \
--cc=yuval.shaia@oracle.com \
--cc=yuvalav@mellanox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.