diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-12-02 15:57:44 +0100 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-12-13 08:32:31 +0100 |
commit | 37d9fe80a3afc87a3d9f3d83aa0e6137f9fd7cde (patch) | |
tree | b82fdaddb210cf6c69c9411014db8a705038dfe0 | |
parent | iser-target: Remove an atomic operation from the IO path (diff) | |
download | linux-37d9fe80a3afc87a3d9f3d83aa0e6137f9fd7cde.tar.xz linux-37d9fe80a3afc87a3d9f3d83aa0e6137f9fd7cde.zip |
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 eb3d628ec4dd..22841487f600 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); } |