* Re: [PATCH] RDMA/core: reduce IB_POLL_BATCH constant
[not found] ` <c1bcd5cc-381d-2d94-1278-f9fb5c9c0b14@grimberg.me>
@ 2018-02-27 22:09 ` Jason Gunthorpe
2018-02-27 22:15 ` Max Gurtovoy
0 siblings, 1 reply; 6+ messages in thread
From: Jason Gunthorpe @ 2018-02-27 22:09 UTC (permalink / raw)
To: Sagi Grimberg
Cc: Max Gurtovoy, Chuck Lever, Bart Van Assche, arnd@arndb.de,
dledford@redhat.com, linux-kernel@vger.kernel.org,
leonro@mellanox.com, linux-rdma@vger.kernel.org
On Thu, Feb 22, 2018 at 05:39:09PM +0200, Sagi Grimberg wrote:
>
> >>The only reason why I added this array on-stack was to allow consumers
> >>that did not use ib_alloc_cq api to call it, but that seems like a
> >>wrong decision when thinking it over again (as probably these users
> >>did not set the wr_cqe correctly).
> >>
> >>How about we make ib_process_cq_direct use the cq wc array and add
> >>a WARN_ON statement (and fail it gracefully) if the caller used this
> >>API without calling ib_alloc_cq?
> >
> >but we tried to avoid cuncurrent access to cq->wc.
>
> Not sure its a valid use-case. But if there is a compelling
> reason to keep it as is, then we can do smaller on-stack
> array.
Did we come to a conclusion what to do here?
Jason
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] RDMA/core: reduce IB_POLL_BATCH constant
2018-02-27 22:09 ` [PATCH] RDMA/core: reduce IB_POLL_BATCH constant Jason Gunthorpe
@ 2018-02-27 22:15 ` Max Gurtovoy
2018-02-28 0:21 ` Bart Van Assche
0 siblings, 1 reply; 6+ messages in thread
From: Max Gurtovoy @ 2018-02-27 22:15 UTC (permalink / raw)
To: Jason Gunthorpe, Sagi Grimberg
Cc: Chuck Lever, Bart Van Assche, arnd@arndb.de, dledford@redhat.com,
linux-kernel@vger.kernel.org, leonro@mellanox.com,
linux-rdma@vger.kernel.org
On 2/28/2018 12:09 AM, Jason Gunthorpe wrote:
> On Thu, Feb 22, 2018 at 05:39:09PM +0200, Sagi Grimberg wrote:
>>
>>>> The only reason why I added this array on-stack was to allow consumers
>>>> that did not use ib_alloc_cq api to call it, but that seems like a
>>>> wrong decision when thinking it over again (as probably these users
>>>> did not set the wr_cqe correctly).
>>>>
>>>> How about we make ib_process_cq_direct use the cq wc array and add
>>>> a WARN_ON statement (and fail it gracefully) if the caller used this
>>>> API without calling ib_alloc_cq?
>>>
>>> but we tried to avoid cuncurrent access to cq->wc.
>>
>> Not sure its a valid use-case. But if there is a compelling
>> reason to keep it as is, then we can do smaller on-stack
>> array.
>
> Did we come to a conclusion what to do here?
guys,
what do you think about the following solution (untested):
diff --git a/drivers/infiniband/core/cq.c b/drivers/infiniband/core/cq.c
index bc79ca8..59d2835 100644
--- a/drivers/infiniband/core/cq.c
+++ b/drivers/infiniband/core/cq.c
@@ -17,6 +17,7 @@
/* # of WCs to poll for with a single call to ib_poll_cq */
#define IB_POLL_BATCH 16
+#define IB_POLL_BATCH_DIRECT 8
/* # of WCs to iterate over before yielding */
#define IB_POLL_BUDGET_IRQ 256
@@ -25,17 +26,25 @@
#define IB_POLL_FLAGS \
(IB_CQ_NEXT_COMP | IB_CQ_REPORT_MISSED_EVENTS)
-static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
*poll_wc)
+static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
*poll_wc,
+ int batch)
{
- int i, n, completed = 0;
- struct ib_wc *wcs = poll_wc ? : cq->wc;
-
+ int i, n, ib_poll_batch, completed = 0;
+ struct ib_wc *wcs;
+
+ if (poll_wc) {
+ wcs = poll_wc;
+ ib_poll_batch = batch;
+ } else {
+ wcs = cq->wc;
+ ib_poll_batch = IB_POLL_BATCH;
+ }
/*
* budget might be (-1) if the caller does not
* want to bound this call, thus we need unsigned
* minimum here.
*/
- while ((n = ib_poll_cq(cq, min_t(u32, IB_POLL_BATCH,
+ while ((n = ib_poll_cq(cq, min_t(u32, ib_poll_batch,
budget - completed), wcs)) > 0) {
for (i = 0; i < n; i++) {
struct ib_wc *wc = &wcs[i];
@@ -48,7 +57,7 @@ static int __ib_process_cq(struct ib_cq *cq, int
budget, struct ib_wc *poll_wc)
completed += n;
- if (n != IB_POLL_BATCH ||
+ if (n != ib_poll_batch ||
(budget != -1 && completed >= budget))
break;
}
@@ -72,9 +81,9 @@ static int __ib_process_cq(struct ib_cq *cq, int
budget, struct ib_wc *poll_wc)
*/
int ib_process_cq_direct(struct ib_cq *cq, int budget)
{
- struct ib_wc wcs[IB_POLL_BATCH];
+ struct ib_wc wcs[IB_POLL_BATCH_DIRECT];
- return __ib_process_cq(cq, budget, wcs);
+ return __ib_process_cq(cq, budget, wcs, IB_POLL_BATCH_DIRECT);
}
EXPORT_SYMBOL(ib_process_cq_direct);
@@ -88,7 +97,7 @@ static int ib_poll_handler(struct irq_poll *iop, int
budget)
struct ib_cq *cq = container_of(iop, struct ib_cq, iop);
int completed;
- completed = __ib_process_cq(cq, budget, NULL);
+ completed = __ib_process_cq(cq, budget, NULL, 0);
if (completed < budget) {
irq_poll_complete(&cq->iop);
if (ib_req_notify_cq(cq, IB_POLL_FLAGS) > 0)
@@ -108,7 +117,7 @@ static void ib_cq_poll_work(struct work_struct *work)
struct ib_cq *cq = container_of(work, struct ib_cq, work);
int completed;
- completed = __ib_process_cq(cq, IB_POLL_BUDGET_WORKQUEUE, NULL);
+ completed = __ib_process_cq(cq, IB_POLL_BUDGET_WORKQUEUE, NULL, 0);
if (completed >= IB_POLL_BUDGET_WORKQUEUE ||
ib_req_notify_cq(cq, IB_POLL_FLAGS) > 0)
queue_work(ib_comp_wq, &cq->work);
>
> Jason
>
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] RDMA/core: reduce IB_POLL_BATCH constant
2018-02-27 22:15 ` Max Gurtovoy
@ 2018-02-28 0:21 ` Bart Van Assche
2018-02-28 9:50 ` Max Gurtovoy
0 siblings, 1 reply; 6+ messages in thread
From: Bart Van Assche @ 2018-02-28 0:21 UTC (permalink / raw)
To: Max Gurtovoy, Jason Gunthorpe, Sagi Grimberg
Cc: Chuck Lever, arnd@arndb.de, dledford@redhat.com,
linux-kernel@vger.kernel.org, leonro@mellanox.com,
linux-rdma@vger.kernel.org
On 02/27/18 14:15, Max Gurtovoy wrote:
> -static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
> *poll_wc)
> +static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
> *poll_wc,
> + int batch)
> {
> - int i, n, completed = 0;
> - struct ib_wc *wcs = poll_wc ? : cq->wc;
> + int i, n, ib_poll_batch, completed = 0;
> + struct ib_wc *wcs;
> +
> + if (poll_wc) {
> + wcs = poll_wc;
> + ib_poll_batch = batch;
> + } else {
> + wcs = cq->wc;
> + ib_poll_batch = IB_POLL_BATCH;
> + }
Since this code has to be touched I think that we can use this
opportunity to get rid of the "poll_wc ? : cq->wc" conditional and
instead use what the caller passes. That will require to update all
__ib_process_cq(..., ..., NULL) calls. I also propose to let the caller
pass ib_poll_batch instead of figuring it out in this function.
Otherwise the approach of this patch looks fine to me.
Thanks,
Bart.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] RDMA/core: reduce IB_POLL_BATCH constant
2018-02-28 0:21 ` Bart Van Assche
@ 2018-02-28 9:50 ` Max Gurtovoy
2018-02-28 18:55 ` Doug Ledford
0 siblings, 1 reply; 6+ messages in thread
From: Max Gurtovoy @ 2018-02-28 9:50 UTC (permalink / raw)
To: Bart Van Assche, Jason Gunthorpe, Sagi Grimberg
Cc: Chuck Lever, arnd@arndb.de, dledford@redhat.com,
linux-kernel@vger.kernel.org, leonro@mellanox.com,
linux-rdma@vger.kernel.org
On 2/28/2018 2:21 AM, Bart Van Assche wrote:
> On 02/27/18 14:15, Max Gurtovoy wrote:
>> -static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
>> *poll_wc)
>> +static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
>> *poll_wc,
>> + int batch)
>> {
>> - int i, n, completed = 0;
>> - struct ib_wc *wcs = poll_wc ? : cq->wc;
>> + int i, n, ib_poll_batch, completed = 0;
>> + struct ib_wc *wcs;
>> +
>> + if (poll_wc) {
>> + wcs = poll_wc;
>> + ib_poll_batch = batch;
>> + } else {
>> + wcs = cq->wc;
>> + ib_poll_batch = IB_POLL_BATCH;
>> + }
>
> Since this code has to be touched I think that we can use this
> opportunity to get rid of the "poll_wc ? : cq->wc" conditional and
> instead use what the caller passes. That will require to update all
> __ib_process_cq(..., ..., NULL) calls. I also propose to let the caller
> pass ib_poll_batch instead of figuring it out in this function.
> Otherwise the approach of this patch looks fine to me.
Thanks Bart.
I'll make these changes and submit.
>
> Thanks,
>
> Bart.
-Max.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] RDMA/core: reduce IB_POLL_BATCH constant
2018-02-28 9:50 ` Max Gurtovoy
@ 2018-02-28 18:55 ` Doug Ledford
2018-03-01 9:36 ` Max Gurtovoy
0 siblings, 1 reply; 6+ messages in thread
From: Doug Ledford @ 2018-02-28 18:55 UTC (permalink / raw)
To: Max Gurtovoy, Bart Van Assche, Jason Gunthorpe, Sagi Grimberg
Cc: Chuck Lever, arnd@arndb.de, linux-kernel@vger.kernel.org,
leonro@mellanox.com, linux-rdma@vger.kernel.org
[-- Attachment #1: Type: text/plain, Size: 1552 bytes --]
On Wed, 2018-02-28 at 11:50 +0200, Max Gurtovoy wrote:
>
> On 2/28/2018 2:21 AM, Bart Van Assche wrote:
> > On 02/27/18 14:15, Max Gurtovoy wrote:
> > > -static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
> > > *poll_wc)
> > > +static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
> > > *poll_wc,
> > > + int batch)
> > > {
> > > - int i, n, completed = 0;
> > > - struct ib_wc *wcs = poll_wc ? : cq->wc;
> > > + int i, n, ib_poll_batch, completed = 0;
> > > + struct ib_wc *wcs;
> > > +
> > > + if (poll_wc) {
> > > + wcs = poll_wc;
> > > + ib_poll_batch = batch;
> > > + } else {
> > > + wcs = cq->wc;
> > > + ib_poll_batch = IB_POLL_BATCH;
> > > + }
> >
> > Since this code has to be touched I think that we can use this
> > opportunity to get rid of the "poll_wc ? : cq->wc" conditional and
> > instead use what the caller passes. That will require to update all
> > __ib_process_cq(..., ..., NULL) calls. I also propose to let the caller
> > pass ib_poll_batch instead of figuring it out in this function.
> > Otherwise the approach of this patch looks fine to me.
>
> Thanks Bart.
> I'll make these changes and submit.
That sounds reasonable to me too, thanks for reworking and resubmitting.
--
Doug Ledford <dledford@redhat.com>
GPG KeyID: B826A3330E572FDD
Key fingerprint = AE6B 1BDA 122B 23B4 265B 1274 B826 A333 0E57 2FDD
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] RDMA/core: reduce IB_POLL_BATCH constant
2018-02-28 18:55 ` Doug Ledford
@ 2018-03-01 9:36 ` Max Gurtovoy
0 siblings, 0 replies; 6+ messages in thread
From: Max Gurtovoy @ 2018-03-01 9:36 UTC (permalink / raw)
To: Doug Ledford, Bart Van Assche, Jason Gunthorpe, Sagi Grimberg
Cc: Chuck Lever, arnd@arndb.de, linux-kernel@vger.kernel.org,
leonro@mellanox.com, linux-rdma@vger.kernel.org
On 2/28/2018 8:55 PM, Doug Ledford wrote:
> On Wed, 2018-02-28 at 11:50 +0200, Max Gurtovoy wrote:
>>
>> On 2/28/2018 2:21 AM, Bart Van Assche wrote:
>>> On 02/27/18 14:15, Max Gurtovoy wrote:
>>>> -static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
>>>> *poll_wc)
>>>> +static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc
>>>> *poll_wc,
>>>> + int batch)
>>>> {
>>>> - int i, n, completed = 0;
>>>> - struct ib_wc *wcs = poll_wc ? : cq->wc;
>>>> + int i, n, ib_poll_batch, completed = 0;
>>>> + struct ib_wc *wcs;
>>>> +
>>>> + if (poll_wc) {
>>>> + wcs = poll_wc;
>>>> + ib_poll_batch = batch;
>>>> + } else {
>>>> + wcs = cq->wc;
>>>> + ib_poll_batch = IB_POLL_BATCH;
>>>> + }
>>>
>>> Since this code has to be touched I think that we can use this
>>> opportunity to get rid of the "poll_wc ? : cq->wc" conditional and
>>> instead use what the caller passes. That will require to update all
>>> __ib_process_cq(..., ..., NULL) calls. I also propose to let the caller
>>> pass ib_poll_batch instead of figuring it out in this function.
>>> Otherwise the approach of this patch looks fine to me.
>>
>> Thanks Bart.
>> I'll make these changes and submit.
>
> That sounds reasonable to me too, thanks for reworking and resubmitting.
>
Sure, NP.
We've run NVMe-oF and SRP with the new patch.
I'll send it through Mellanox maintainers pull request.
Thanks for reporting and reviewing.
-Max.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-03-01 9:36 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20180220205924.2035765-1-arnd@arndb.de>
[not found] ` <1519161268.3737.12.camel@wdc.com>
[not found] ` <F2FB1034-BFB6-45ED-878E-6FADD756157D@oracle.com>
[not found] ` <c3eab137-1c37-0e6c-a53a-df2cf80653d2@grimberg.me>
[not found] ` <0f90134c-3d40-1d24-711f-e4ab32802bd8@mellanox.com>
[not found] ` <c1bcd5cc-381d-2d94-1278-f9fb5c9c0b14@grimberg.me>
2018-02-27 22:09 ` [PATCH] RDMA/core: reduce IB_POLL_BATCH constant Jason Gunthorpe
2018-02-27 22:15 ` Max Gurtovoy
2018-02-28 0:21 ` Bart Van Assche
2018-02-28 9:50 ` Max Gurtovoy
2018-02-28 18:55 ` Doug Ledford
2018-03-01 9:36 ` Max Gurtovoy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox