]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
iser-target: Reduce CQ lock contention by batch polling
authorSagi Grimberg <sagig@mellanox.com>
Tue, 2 Dec 2014 14:57:45 +0000 (16:57 +0200)
committerNicholas Bellinger <nab@linux-iscsi.org>
Sat, 13 Dec 2014 07:32:32 +0000 (23:32 -0800)
In order to reduce the contention on CQ locking (present
in some LLDDs) we poll in batches of 16 work completion items.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/infiniband/ulp/isert/ib_isert.c
drivers/infiniband/ulp/isert/ib_isert.h

index 22841487f60012438410591efea594cdabe9e9f6..276054b65b988d397c21a0c1e71a57fda2efb5b9 100644 (file)
@@ -2047,13 +2047,15 @@ isert_cq_work(struct work_struct *work)
        enum { isert_poll_budget = 65536 };
        struct isert_comp *comp = container_of(work, struct isert_comp,
                                               work);
-       int completed = 0;
-       struct ib_wc wc;
+       struct ib_wc *const wcs = comp->wcs;
+       int i, n, completed = 0;
 
-       while (ib_poll_cq(comp->cq, 1, &wc) == 1) {
-               isert_handle_wc(&wc);
+       while ((n = ib_poll_cq(comp->cq, ARRAY_SIZE(comp->wcs), wcs)) > 0) {
+               for (i = 0; i < n; i++)
+                       isert_handle_wc(&wcs[i]);
 
-               if (++completed >= isert_poll_budget)
+               completed += n;
+               if (completed >= isert_poll_budget)
                        break;
        }
 
index fc1d3232f89636c03ddb6aa73c6c9111a0dd33d9..2a0721f1f5dfb5c577d885bb808055e42da04d0a 100644 (file)
@@ -165,6 +165,7 @@ struct isert_conn {
  *
  * @device:     pointer to device handle
  * @cq:         completion queue
+ * @wcs:        work completion array
  * @active_qps: Number of active QPs attached
  *              to completion context
  * @work:       completion work handle
@@ -172,6 +173,7 @@ struct isert_conn {
 struct isert_comp {
        struct isert_device     *device;
        struct ib_cq            *cq;
+       struct ib_wc             wcs[16];
        int                      active_qps;
        struct work_struct       work;
 };