From: Max Gurtovoy <maxg@mellanox.com> To: linux-nvme@lists.infradead.org, sagi@grimberg.me, hch@lst.de, loberman@redhat.com, bvanassche@acm.org, linux-rdma@vger.kernel.org Cc: kbusch@kernel.org, leonro@mellanox.com, jgg@mellanox.com, dledford@redhat.com, idanb@mellanox.com, shlomin@mellanox.com, oren@mellanox.com, vladimirk@mellanox.com, Max Gurtovoy <maxg@mellanox.com> Subject: [PATCH 1/5] IB/core: add a simple SRQ set per PD Date: Tue, 17 Mar 2020 15:40:26 +0200 [thread overview] Message-ID: <20200317134030.152833-2-maxg@mellanox.com> (raw) In-Reply-To: <20200317134030.152833-1-maxg@mellanox.com> ULP's can use this API to create/destroy SRQ's with the same characteristics for implementing a logic that aimed to save resources without significant performance penalty (e.g. create SRQ per completion vector and use shared receive buffers for multiple controllers of the ULP). Signed-off-by: Max Gurtovoy <maxg@mellanox.com> --- drivers/infiniband/core/Makefile | 2 +- drivers/infiniband/core/srq_set.c | 78 +++++++++++++++++++++++++++++++++++++++ drivers/infiniband/core/verbs.c | 4 ++ include/rdma/ib_verbs.h | 5 +++ include/rdma/srq_set.h | 18 +++++++++ 5 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 drivers/infiniband/core/srq_set.c create mode 100644 include/rdma/srq_set.h diff --git a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Makefile index d1b14887..1d3eaec 100644 --- a/drivers/infiniband/core/Makefile +++ b/drivers/infiniband/core/Makefile @@ -12,7 +12,7 @@ ib_core-y := packer.o ud_header.o verbs.o cq.o rw.o sysfs.o \ roce_gid_mgmt.o mr_pool.o addr.o sa_query.o \ multicast.o mad.o smi.o agent.o mad_rmpp.o \ nldev.o restrack.o counters.o ib_core_uverbs.o \ - trace.o + trace.o srq_set.o ib_core-$(CONFIG_SECURITY_INFINIBAND) += security.o ib_core-$(CONFIG_CGROUP_RDMA) += cgroup.o diff --git a/drivers/infiniband/core/srq_set.c b/drivers/infiniband/core/srq_set.c new file mode 100644 index 0000000..d143561 --- /dev/null +++ b/drivers/infiniband/core/srq_set.c @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* + * Copyright (c) 2020 Mellanox Technologies. All rights reserved. + */ + +#include <rdma/srq_set.h> + +struct ib_srq *rdma_srq_get(struct ib_pd *pd) +{ + struct ib_srq *srq; + unsigned long flags; + + spin_lock_irqsave(&pd->srq_lock, flags); + srq = list_first_entry_or_null(&pd->srqs, struct ib_srq, pd_entry); + if (srq) { + list_del(&srq->pd_entry); + pd->srqs_used++; + } + spin_unlock_irqrestore(&pd->srq_lock, flags); + + return srq; +} +EXPORT_SYMBOL(rdma_srq_get); + +void rdma_srq_put(struct ib_pd *pd, struct ib_srq *srq) +{ + unsigned long flags; + + spin_lock_irqsave(&pd->srq_lock, flags); + list_add(&srq->pd_entry, &pd->srqs); + pd->srqs_used--; + spin_unlock_irqrestore(&pd->srq_lock, flags); +} +EXPORT_SYMBOL(rdma_srq_put); + +int rdma_srq_set_init(struct ib_pd *pd, int nr, + struct ib_srq_init_attr *srq_attr) +{ + struct ib_srq *srq; + unsigned long flags; + int ret, i; + + for (i = 0; i < nr; i++) { + srq = ib_create_srq(pd, srq_attr); + if (IS_ERR(srq)) { + ret = PTR_ERR(srq); + goto out; + } + + spin_lock_irqsave(&pd->srq_lock, flags); + list_add_tail(&srq->pd_entry, &pd->srqs); + spin_unlock_irqrestore(&pd->srq_lock, flags); + } + + return 0; +out: + rdma_srq_set_destroy(pd); + return ret; +} +EXPORT_SYMBOL(rdma_srq_set_init); + +void rdma_srq_set_destroy(struct ib_pd *pd) +{ + struct ib_srq *srq; + unsigned long flags; + + spin_lock_irqsave(&pd->srq_lock, flags); + while (!list_empty(&pd->srqs)) { + srq = list_first_entry(&pd->srqs, struct ib_srq, pd_entry); + list_del(&srq->pd_entry); + + spin_unlock_irqrestore(&pd->srq_lock, flags); + ib_destroy_srq(srq); + spin_lock_irqsave(&pd->srq_lock, flags); + } + spin_unlock_irqrestore(&pd->srq_lock, flags); +} +EXPORT_SYMBOL(rdma_srq_set_destroy); diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index e62c9df..6950abf 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -272,6 +272,9 @@ struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags, pd->__internal_mr = NULL; atomic_set(&pd->usecnt, 0); pd->flags = flags; + pd->srqs_used = 0; + spin_lock_init(&pd->srq_lock); + INIT_LIST_HEAD(&pd->srqs); pd->res.type = RDMA_RESTRACK_PD; rdma_restrack_set_task(&pd->res, caller); @@ -340,6 +343,7 @@ void ib_dealloc_pd_user(struct ib_pd *pd, struct ib_udata *udata) pd->__internal_mr = NULL; } + WARN_ON_ONCE(pd->srqs_used > 0); /* uverbs manipulates usecnt with proper locking, while the kabi requires the caller to guarantee we can't race here. */ WARN_ON(atomic_read(&pd->usecnt)); diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 1f779fa..fc8207d 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1517,6 +1517,10 @@ struct ib_pd { u32 unsafe_global_rkey; + spinlock_t srq_lock; + int srqs_used; + struct list_head srqs; + /* * Implementation details of the RDMA core, don't use in drivers: */ @@ -1585,6 +1589,7 @@ struct ib_srq { void *srq_context; enum ib_srq_type srq_type; atomic_t usecnt; + struct list_head pd_entry; /* srq set entry */ struct { struct ib_cq *cq; diff --git a/include/rdma/srq_set.h b/include/rdma/srq_set.h new file mode 100644 index 0000000..834c4c6 --- /dev/null +++ b/include/rdma/srq_set.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) */ +/* + * Copyright (c) 2020 Mellanox Technologies. All rights reserved. + */ + +#ifndef _RDMA_SRQ_SET_H +#define _RDMA_SRQ_SET_H 1 + +#include <rdma/ib_verbs.h> + +struct ib_srq *rdma_srq_get(struct ib_pd *pd); +void rdma_srq_put(struct ib_pd *pd, struct ib_srq *srq); + +int rdma_srq_set_init(struct ib_pd *pd, int nr, + struct ib_srq_init_attr *srq_attr); +void rdma_srq_set_destroy(struct ib_pd *pd); + +#endif /* _RDMA_SRQ_SET_H */ -- 1.8.3.1
WARNING: multiple messages have this Message-ID (diff)
From: Max Gurtovoy <maxg@mellanox.com> To: linux-nvme@lists.infradead.org, sagi@grimberg.me, hch@lst.de, loberman@redhat.com, bvanassche@acm.org, linux-rdma@vger.kernel.org Cc: vladimirk@mellanox.com, shlomin@mellanox.com, leonro@mellanox.com, dledford@redhat.com, jgg@mellanox.com, oren@mellanox.com, kbusch@kernel.org, Max Gurtovoy <maxg@mellanox.com>, idanb@mellanox.com Subject: [PATCH 1/5] IB/core: add a simple SRQ set per PD Date: Tue, 17 Mar 2020 15:40:26 +0200 [thread overview] Message-ID: <20200317134030.152833-2-maxg@mellanox.com> (raw) In-Reply-To: <20200317134030.152833-1-maxg@mellanox.com> ULP's can use this API to create/destroy SRQ's with the same characteristics for implementing a logic that aimed to save resources without significant performance penalty (e.g. create SRQ per completion vector and use shared receive buffers for multiple controllers of the ULP). Signed-off-by: Max Gurtovoy <maxg@mellanox.com> --- drivers/infiniband/core/Makefile | 2 +- drivers/infiniband/core/srq_set.c | 78 +++++++++++++++++++++++++++++++++++++++ drivers/infiniband/core/verbs.c | 4 ++ include/rdma/ib_verbs.h | 5 +++ include/rdma/srq_set.h | 18 +++++++++ 5 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 drivers/infiniband/core/srq_set.c create mode 100644 include/rdma/srq_set.h diff --git a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Makefile index d1b14887..1d3eaec 100644 --- a/drivers/infiniband/core/Makefile +++ b/drivers/infiniband/core/Makefile @@ -12,7 +12,7 @@ ib_core-y := packer.o ud_header.o verbs.o cq.o rw.o sysfs.o \ roce_gid_mgmt.o mr_pool.o addr.o sa_query.o \ multicast.o mad.o smi.o agent.o mad_rmpp.o \ nldev.o restrack.o counters.o ib_core_uverbs.o \ - trace.o + trace.o srq_set.o ib_core-$(CONFIG_SECURITY_INFINIBAND) += security.o ib_core-$(CONFIG_CGROUP_RDMA) += cgroup.o diff --git a/drivers/infiniband/core/srq_set.c b/drivers/infiniband/core/srq_set.c new file mode 100644 index 0000000..d143561 --- /dev/null +++ b/drivers/infiniband/core/srq_set.c @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* + * Copyright (c) 2020 Mellanox Technologies. All rights reserved. + */ + +#include <rdma/srq_set.h> + +struct ib_srq *rdma_srq_get(struct ib_pd *pd) +{ + struct ib_srq *srq; + unsigned long flags; + + spin_lock_irqsave(&pd->srq_lock, flags); + srq = list_first_entry_or_null(&pd->srqs, struct ib_srq, pd_entry); + if (srq) { + list_del(&srq->pd_entry); + pd->srqs_used++; + } + spin_unlock_irqrestore(&pd->srq_lock, flags); + + return srq; +} +EXPORT_SYMBOL(rdma_srq_get); + +void rdma_srq_put(struct ib_pd *pd, struct ib_srq *srq) +{ + unsigned long flags; + + spin_lock_irqsave(&pd->srq_lock, flags); + list_add(&srq->pd_entry, &pd->srqs); + pd->srqs_used--; + spin_unlock_irqrestore(&pd->srq_lock, flags); +} +EXPORT_SYMBOL(rdma_srq_put); + +int rdma_srq_set_init(struct ib_pd *pd, int nr, + struct ib_srq_init_attr *srq_attr) +{ + struct ib_srq *srq; + unsigned long flags; + int ret, i; + + for (i = 0; i < nr; i++) { + srq = ib_create_srq(pd, srq_attr); + if (IS_ERR(srq)) { + ret = PTR_ERR(srq); + goto out; + } + + spin_lock_irqsave(&pd->srq_lock, flags); + list_add_tail(&srq->pd_entry, &pd->srqs); + spin_unlock_irqrestore(&pd->srq_lock, flags); + } + + return 0; +out: + rdma_srq_set_destroy(pd); + return ret; +} +EXPORT_SYMBOL(rdma_srq_set_init); + +void rdma_srq_set_destroy(struct ib_pd *pd) +{ + struct ib_srq *srq; + unsigned long flags; + + spin_lock_irqsave(&pd->srq_lock, flags); + while (!list_empty(&pd->srqs)) { + srq = list_first_entry(&pd->srqs, struct ib_srq, pd_entry); + list_del(&srq->pd_entry); + + spin_unlock_irqrestore(&pd->srq_lock, flags); + ib_destroy_srq(srq); + spin_lock_irqsave(&pd->srq_lock, flags); + } + spin_unlock_irqrestore(&pd->srq_lock, flags); +} +EXPORT_SYMBOL(rdma_srq_set_destroy); diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index e62c9df..6950abf 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -272,6 +272,9 @@ struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags, pd->__internal_mr = NULL; atomic_set(&pd->usecnt, 0); pd->flags = flags; + pd->srqs_used = 0; + spin_lock_init(&pd->srq_lock); + INIT_LIST_HEAD(&pd->srqs); pd->res.type = RDMA_RESTRACK_PD; rdma_restrack_set_task(&pd->res, caller); @@ -340,6 +343,7 @@ void ib_dealloc_pd_user(struct ib_pd *pd, struct ib_udata *udata) pd->__internal_mr = NULL; } + WARN_ON_ONCE(pd->srqs_used > 0); /* uverbs manipulates usecnt with proper locking, while the kabi requires the caller to guarantee we can't race here. */ WARN_ON(atomic_read(&pd->usecnt)); diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 1f779fa..fc8207d 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1517,6 +1517,10 @@ struct ib_pd { u32 unsafe_global_rkey; + spinlock_t srq_lock; + int srqs_used; + struct list_head srqs; + /* * Implementation details of the RDMA core, don't use in drivers: */ @@ -1585,6 +1589,7 @@ struct ib_srq { void *srq_context; enum ib_srq_type srq_type; atomic_t usecnt; + struct list_head pd_entry; /* srq set entry */ struct { struct ib_cq *cq; diff --git a/include/rdma/srq_set.h b/include/rdma/srq_set.h new file mode 100644 index 0000000..834c4c6 --- /dev/null +++ b/include/rdma/srq_set.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) */ +/* + * Copyright (c) 2020 Mellanox Technologies. All rights reserved. + */ + +#ifndef _RDMA_SRQ_SET_H +#define _RDMA_SRQ_SET_H 1 + +#include <rdma/ib_verbs.h> + +struct ib_srq *rdma_srq_get(struct ib_pd *pd); +void rdma_srq_put(struct ib_pd *pd, struct ib_srq *srq); + +int rdma_srq_set_init(struct ib_pd *pd, int nr, + struct ib_srq_init_attr *srq_attr); +void rdma_srq_set_destroy(struct ib_pd *pd); + +#endif /* _RDMA_SRQ_SET_H */ -- 1.8.3.1 _______________________________________________ linux-nvme mailing list linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme
next prev parent reply other threads:[~2020-03-17 13:40 UTC|newest] Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-03-17 13:40 [PATCH 0/5] nvmet-rdma/srpt: SRQ per completion vector Max Gurtovoy 2020-03-17 13:40 ` Max Gurtovoy 2020-03-17 13:40 ` Max Gurtovoy [this message] 2020-03-17 13:40 ` [PATCH 1/5] IB/core: add a simple SRQ set per PD Max Gurtovoy 2020-03-17 13:55 ` Leon Romanovsky 2020-03-17 13:55 ` Leon Romanovsky 2020-03-17 16:37 ` Max Gurtovoy 2020-03-17 16:37 ` Max Gurtovoy 2020-03-17 18:10 ` Jason Gunthorpe 2020-03-17 18:10 ` Jason Gunthorpe 2020-03-17 18:24 ` Max Gurtovoy 2020-03-17 18:24 ` Max Gurtovoy 2020-03-17 18:43 ` Jason Gunthorpe 2020-03-17 18:43 ` Jason Gunthorpe 2020-03-17 21:56 ` Max Gurtovoy 2020-03-17 21:56 ` Max Gurtovoy 2020-03-17 19:54 ` Leon Romanovsky 2020-03-17 19:54 ` Leon Romanovsky 2020-03-18 6:47 ` Leon Romanovsky 2020-03-18 6:47 ` Leon Romanovsky 2020-03-18 9:46 ` Max Gurtovoy 2020-03-18 9:46 ` Max Gurtovoy 2020-03-18 10:29 ` Leon Romanovsky 2020-03-18 10:29 ` Leon Romanovsky 2020-03-18 10:39 ` Max Gurtovoy 2020-03-18 10:39 ` Max Gurtovoy 2020-03-18 10:46 ` Leon Romanovsky 2020-03-18 10:46 ` Leon Romanovsky 2020-03-17 13:40 ` [PATCH 2/5] nvmet-rdma: add srq pointer to rdma_cmd Max Gurtovoy 2020-03-17 13:40 ` Max Gurtovoy 2020-03-17 13:40 ` [PATCH 3/5] nvmet-rdma: use SRQ per completion vector Max Gurtovoy 2020-03-17 13:40 ` Max Gurtovoy 2020-03-18 6:53 ` Leon Romanovsky 2020-03-18 6:53 ` Leon Romanovsky 2020-03-18 9:39 ` Max Gurtovoy 2020-03-18 9:39 ` Max Gurtovoy 2020-03-17 13:40 ` [PATCH 4/5] IB/core: cache the CQ " Max Gurtovoy 2020-03-17 13:40 ` Max Gurtovoy 2020-03-17 15:19 ` Chuck Lever 2020-03-17 15:19 ` Chuck Lever 2020-03-17 15:41 ` Max Gurtovoy 2020-03-17 15:41 ` Max Gurtovoy 2020-03-17 20:36 ` Chuck Lever 2020-03-17 20:36 ` Chuck Lever 2020-03-17 22:18 ` Max Gurtovoy 2020-03-17 22:18 ` Max Gurtovoy 2020-03-17 22:50 ` Bart Van Assche 2020-03-17 22:50 ` Bart Van Assche 2020-03-17 23:26 ` Max Gurtovoy 2020-03-17 23:26 ` Max Gurtovoy 2020-03-17 13:40 ` [PATCH 5/5] RDMA/srpt: use SRQ per " Max Gurtovoy 2020-03-17 13:40 ` Max Gurtovoy 2020-03-17 13:58 ` Leon Romanovsky 2020-03-17 13:58 ` Leon Romanovsky 2020-03-17 16:43 ` Max Gurtovoy 2020-03-17 16:43 ` Max Gurtovoy 2020-03-17 19:58 ` Leon Romanovsky 2020-03-17 19:58 ` Leon Romanovsky
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=20200317134030.152833-2-maxg@mellanox.com \ --to=maxg@mellanox.com \ --cc=bvanassche@acm.org \ --cc=dledford@redhat.com \ --cc=hch@lst.de \ --cc=idanb@mellanox.com \ --cc=jgg@mellanox.com \ --cc=kbusch@kernel.org \ --cc=leonro@mellanox.com \ --cc=linux-nvme@lists.infradead.org \ --cc=linux-rdma@vger.kernel.org \ --cc=loberman@redhat.com \ --cc=oren@mellanox.com \ --cc=sagi@grimberg.me \ --cc=shlomin@mellanox.com \ --cc=vladimirk@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: linkBe 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.