diff options
| author | Vladimir Sokolovsky <vlad@dev.mellanox.co.il> | 2011-01-10 20:42:06 -0500 |
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2011-01-10 20:42:06 -0500 |
| commit | 3afa9f19e5bd16abed998b7bf1b178206403286f (patch) | |
| tree | 2bd80f9204eaa867bbd7d4aee3ca51c11f3c5f75 | |
| parent | f5a49539a64ae5e3833fddec54a3c2524c7fe333 (diff) | |
IB/mlx4: Don't call dma_free_coherent() with irqs disabled
mlx4_ib_free_cq_buf() should not be called under spin_lock_irq() since
it calls dma_free_coherent(), which needs irqs enabled. Fix this by
deferring the free to outside the locked region.
This was found due to the
WARN_ON(irqs_disabled());
in swiotlb_free_coherent().
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
| -rw-r--r-- | drivers/infiniband/hw/mlx4/cq.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 5a219a2fdf16..e8df155bc3b0 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
| @@ -397,10 +397,14 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
| 397 | cq->resize_buf = NULL; | 397 | cq->resize_buf = NULL; |
| 398 | cq->resize_umem = NULL; | 398 | cq->resize_umem = NULL; |
| 399 | } else { | 399 | } else { |
| 400 | struct mlx4_ib_cq_buf tmp_buf; | ||
| 401 | int tmp_cqe = 0; | ||
| 402 | |||
| 400 | spin_lock_irq(&cq->lock); | 403 | spin_lock_irq(&cq->lock); |
| 401 | if (cq->resize_buf) { | 404 | if (cq->resize_buf) { |
| 402 | mlx4_ib_cq_resize_copy_cqes(cq); | 405 | mlx4_ib_cq_resize_copy_cqes(cq); |
| 403 | mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); | 406 | tmp_buf = cq->buf; |
| 407 | tmp_cqe = cq->ibcq.cqe; | ||
| 404 | cq->buf = cq->resize_buf->buf; | 408 | cq->buf = cq->resize_buf->buf; |
| 405 | cq->ibcq.cqe = cq->resize_buf->cqe; | 409 | cq->ibcq.cqe = cq->resize_buf->cqe; |
| 406 | 410 | ||
| @@ -408,6 +412,9 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
| 408 | cq->resize_buf = NULL; | 412 | cq->resize_buf = NULL; |
| 409 | } | 413 | } |
| 410 | spin_unlock_irq(&cq->lock); | 414 | spin_unlock_irq(&cq->lock); |
| 415 | |||
| 416 | if (tmp_cqe) | ||
| 417 | mlx4_ib_free_cq_buf(dev, &tmp_buf, tmp_cqe); | ||
| 411 | } | 418 | } |
| 412 | 419 | ||
| 413 | goto out; | 420 | goto out; |
