]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: protect rx_ring access with a lock
authorAmir Vadai <amirv@mellanox.co.il>
Sun, 13 Jun 2010 12:51:01 +0000 (15:51 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:01 +0000 (05:05 -0700)
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 <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp.h
drivers/infiniband/ulp/sdp/sdp_rx.c

index fcb75d9384434317297bac6985079af77271bf21..3bfa90ab69d02161a528c0923634273591ce53e7 100644 (file)
@@ -289,6 +289,7 @@ struct sdp_rx_ring {
 
        int              destroyed;
        rwlock_t         destroyed_lock;
+       spinlock_t       lock;
 
        struct tasklet_struct   tasklet;
 };
index 4d5ec1423a5442927934d90f48926bb934039eb8..60ba587344721b7b8cb0d8e416859f0da42b29fa 100644 (file)
@@ -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);