scsi: storvsc: remove unnecessary channel inbound lock
authorStephen Hemminger <stephen@networkplumber.org>
Thu, 18 May 2017 16:18:12 +0000 (09:18 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Jun 2017 00:48:05 +0000 (20:48 -0400)
In storvsc driver, inbound messages do not go through inbound lock.  The
only effect of this lock was is to provide a barrier for connect and
remove logic.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/hv/channel_mgmt.c
drivers/scsi/storvsc_drv.c
include/linux/hyperv.h

index 735f9363f2e486933366baf6e4950cc9ebb2e7ba..685572bae1f0edc434b37de34d824920a8a4435b 100644 (file)
@@ -332,7 +332,6 @@ static struct vmbus_channel *alloc_channel(void)
        if (!channel)
                return NULL;
 
-       spin_lock_init(&channel->inbound_lock);
        spin_lock_init(&channel->lock);
 
        INIT_LIST_HEAD(&channel->sc_list);
index f8a1649e4c6363a2e41ebd20747c93b55d3527e5..8d955db6424fb79a9f9064b3c96c6e4e92ebb3d5 100644 (file)
@@ -1206,13 +1206,13 @@ static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size,
 static int storvsc_dev_remove(struct hv_device *device)
 {
        struct storvsc_device *stor_device;
-       unsigned long flags;
 
        stor_device = hv_get_drvdata(device);
 
-       spin_lock_irqsave(&device->channel->inbound_lock, flags);
        stor_device->destroy = true;
-       spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
+
+       /* Make sure flag is set before waiting */
+       wmb();
 
        /*
         * At this point, all outbound traffic should be disable. We
@@ -1229,9 +1229,7 @@ static int storvsc_dev_remove(struct hv_device *device)
         * we have drained - to drain the outgoing packets, we need to
         * allow incoming packets.
         */
-       spin_lock_irqsave(&device->channel->inbound_lock, flags);
        hv_set_drvdata(device, NULL);
-       spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
 
        /* Close the channel */
        vmbus_close(device->channel);
index e09fc8290c2f02d92689f4499bcf2a22ae8ce8be..b7d7bbec74e044a56b10b49eff12d380206dcd32 100644 (file)
@@ -744,7 +744,6 @@ struct vmbus_channel {
        u32 ringbuffer_pagecount;
        struct hv_ring_buffer_info outbound;    /* send to parent */
        struct hv_ring_buffer_info inbound;     /* receive from parent */
-       spinlock_t inbound_lock;
 
        struct vmbus_close_msg close_msg;