diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-12-02 16:57:44 +0200 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-12-12 23:32:31 -0800 |
commit | 37d9fe80a3afc87a3d9f3d83aa0e6137f9fd7cde (patch) | |
tree | b82fdaddb210cf6c69c9411014db8a705038dfe0 | |
parent | bdf20e72548cdcca1c16f29ad30c5725fa1d8d11 (diff) | |
download | op-kernel-dev-37d9fe80a3afc87a3d9f3d83aa0e6137f9fd7cde.zip op-kernel-dev-37d9fe80a3afc87a3d9f3d83aa0e6137f9fd7cde.tar.gz |
iser-target: Introduce isert_poll_budget
In case the CQ is packed with completions, we can't just
hog the CPU forever. Poll until a sufficient budget (currently
hard-coded to 64k completions) and if budget is exhausted, bailout
and give a chance to other threads.
Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index eb3d628..2284148 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c @@ -2044,13 +2044,19 @@ isert_handle_wc(struct ib_wc *wc) static void 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; - while (ib_poll_cq(comp->cq, 1, &wc) == 1) + while (ib_poll_cq(comp->cq, 1, &wc) == 1) { isert_handle_wc(&wc); + if (++completed >= isert_poll_budget) + break; + } + ib_req_notify_cq(comp->cq, IB_CQ_NEXT_COMP); } |