From: Amir Vadai Date: Sun, 13 Jun 2010 12:51:01 +0000 (+0300) Subject: sdp: protect rx_ring access with a lock X-Git-Tag: v4.1.12-92~264^2~5^2~173 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=239c0e2a050b43f45096675dcd0e24072e595287;p=users%2Fjedix%2Flinux-maple.git 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 --- diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index fcb75d9384434..3bfa90ab69d02 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 4d5ec1423a544..60ba587344721 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);