From 239c0e2a050b43f45096675dcd0e24072e595287 Mon Sep 17 00:00:00 2001 From: Amir Vadai Date: Sun, 13 Jun 2010 15:51:01 +0300 Subject: [PATCH] sdp: protect rx_ring access with a lock because sdp_poll_rx_cq() is accessed both from interrupt and from user context, need to protect it with a lock. Signed-off-by: Amir Vadai --- drivers/infiniband/ulp/sdp/sdp.h | 1 + drivers/infiniband/ulp/sdp/sdp_rx.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index fcb75d938443..3bfa90ab69d0 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -289,6 +289,7 @@ struct sdp_rx_ring { int destroyed; rwlock_t destroyed_lock; + spinlock_t lock; struct tasklet_struct tasklet; }; diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index 4d5ec1423a54..60ba58734472 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -712,7 +712,9 @@ static int sdp_poll_rx_cq(struct sdp_sock *ssk) int n, i; int wc_processed = 0; struct sk_buff *skb; + unsigned long flags; + spin_lock_irqsave(&ssk->rx_ring.lock, flags); do { n = ib_poll_cq(cq, SDP_NUM_WC, ibwc); for (i = 0; i < n; ++i) { @@ -727,6 +729,7 @@ static int sdp_poll_rx_cq(struct sdp_sock *ssk) wc_processed++; } } while (n == SDP_NUM_WC); + spin_unlock_irqrestore(&ssk->rx_ring.lock, flags); if (wc_processed) sdp_bzcopy_write_space(ssk); @@ -951,6 +954,8 @@ int sdp_rx_ring_create(struct sdp_sock *ssk, struct ib_device *device) sdp_sk(&ssk->isk.sk)->rx_ring.cq = rx_cq; + spin_lock_init(&ssk->rx_ring.lock); + INIT_WORK(&ssk->rx_comp_work, sdp_rx_comp_work); tasklet_init(&ssk->rx_ring.tasklet, sdp_process_rx_tasklet, (unsigned long) ssk); -- 2.51.0