diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-12-02 16:57:45 +0200 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-12-12 23:32:32 -0800 |
commit | 36ea63b523f3f3b57f708f14af848cac100677d5 (patch) | |
tree | 0b0078eb6547ab90a215dd0eb196c65c09316f46 /drivers/infiniband | |
parent | 37d9fe80a3afc87a3d9f3d83aa0e6137f9fd7cde (diff) | |
download | linux-stable-36ea63b523f3f3b57f708f14af848cac100677d5.tar.gz linux-stable-36ea63b523f3f3b57f708f14af848cac100677d5.tar.bz2 linux-stable-36ea63b523f3f3b57f708f14af848cac100677d5.zip |
iser-target: Reduce CQ lock contention by batch polling
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>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 12 | ||||
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.h | 2 |
2 files changed, 9 insertions, 5 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 22841487f600..276054b65b98 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c @@ -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; } diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h index fc1d3232f896..2a0721f1f5df 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.h +++ b/drivers/infiniband/ulp/isert/ib_isert.h @@ -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; }; |