diff options
author | Eli Cohen <eli@mellanox.com> | 2012-03-06 15:50:51 +0200 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-03-12 16:24:59 -0700 |
commit | 3616f9cead935d4e4c35915600d5e4d1384219cd (patch) | |
tree | b82899b32ce3c64195195351358267764e535c04 /drivers/infiniband/hw | |
parent | 5984be90046fa978d94a5ec08bbf8f760cff2b30 (diff) | |
download | op-kernel-dev-3616f9cead935d4e4c35915600d5e4d1384219cd.zip op-kernel-dev-3616f9cead935d4e4c35915600d5e4d1384219cd.tar.gz |
IB/mlx4: Fix possible missed completion event
If an erroneous CQE is polled in the first iteration (i.e. npolled ==
0), we don't update the consumer index and hence the hardware could
get a wrong notion of how many CQEs software polled. Fix this by
unconditionally updating the doorbell record. We could change the
check to be something like
if (npolled || err != -EAGAIN)
...
but it does not seem worth the effort since a posted write to memory
should not cost too much.
Signed-off-by: Eli Cohen <eli@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r-- | drivers/infiniband/hw/mlx4/cq.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 5ecf38d..275861b 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -747,8 +747,7 @@ int mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) break; } - if (npolled) - mlx4_cq_set_ci(&cq->mcq); + mlx4_cq_set_ci(&cq->mcq); spin_unlock_irqrestore(&cq->lock, flags); |