From 183cfa434ec90897b1423ce4f916e8a237139133 Mon Sep 17 00:00:00 2001 From: Sagi Grimberg Date: Wed, 1 Oct 2014 14:02:08 +0300 Subject: IB/iser: Use internal polling budget to avoid possible live-lock We need a way to guarentee that we don't stay in soft-IRQ context for too long. We might starve other pending CQ tasklets or worse lock against application trying to issue IO on the running CPU. Signed-off-by: Sagi Grimberg Signed-off-by: Roi Dayan Signed-off-by: Ariel Nahum Signed-off-by: Or Gerlitz Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 94d1b46..e31ac57 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c @@ -42,6 +42,8 @@ #define ISER_MAX_RX_CQ_LEN (ISER_QP_MAX_RECV_DTOS * ISCSI_ISER_MAX_CONN) #define ISER_MAX_TX_CQ_LEN (ISER_QP_MAX_REQ_DTOS * ISCSI_ISER_MAX_CONN) +static int iser_cq_poll_limit = 512; + static void iser_cq_tasklet_fn(unsigned long data); static void iser_cq_callback(struct ib_cq *cq, void *cq_context); static int iser_drain_tx_cq(struct iser_comp *comp); @@ -1248,6 +1250,8 @@ static void iser_cq_tasklet_fn(unsigned long data) completed_rx++; if (!(completed_rx & 63)) completed_tx += iser_drain_tx_cq(comp); + if (completed_rx >= iser_cq_poll_limit) + break; } /* #warning "it is assumed here that arming CQ only once its empty" * * " would not cause interrupts to be missed" */ -- cgit v0.10.2