@@ -783,8 +783,11 @@ static void iser_cq_tasklet_fn(unsigned long data)
unsigned long xfer_len;
struct iser_conn *ib_conn;
int completed_tx, completed_rx;
+ int ret;
+
completed_tx = completed_rx = 0;
+again:
while (ib_poll_cq(cq, 1, &wc) == 1) {
desc = (struct iser_rx_desc *) (unsigned long) wc.wr_id;
BUG_ON(desc == NULL);
@@ -807,9 +810,10 @@ static void iser_cq_tasklet_fn(unsigned long data)
if (!(completed_rx & 63))
completed_tx += iser_drain_tx_cq(device);
}
- /* #warning "it is assumed here that arming CQ only once its empty" *
- * " would not cause interrupts to be missed" */
- ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
+ ret = ib_req_notify_cq(cq, IB_CQ_NEXT_COMP |
+ IB_CQ_REPORT_MISSED_EVENTS);
+ if (ret > 0)
+ goto again;
completed_tx += iser_drain_tx_cq(device);
iser_dbg("got %d rx %d tx completions\n", completed_rx, completed_tx);