lkml.org 
[lkml]   [2018]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.15 097/124] block, scsi: Fix race between SPI domain validation and system suspend
    Date
    From: Bart Van Assche <bart.vanassche@wdc.com>

    [ Upstream commit 203f8c250e2195371d418b1e8466e4caf1a0ed51 ]

    Avoid that the following warning is reported when suspending a system
    that is using the mptspi driver:

    WARNING: CPU: 0 PID: 4187 at drivers/scsi/scsi_lib.c:2960 scsi_device_quiesce+0x20/0xb0
    EIP: scsi_device_quiesce+0x20/0xb0
    Call Trace:
    spi_dv_device+0x65/0x5f0 [scsi_transport_spi]
    mptspi_dv_device+0x4d/0x170 [mptspi]
    mptspi_dv_renegotiate_work+0x49/0xc0 [mptspi]
    process_one_work+0x190/0x2e0
    worker_thread+0x37/0x3f0
    kthread+0xcb/0x100
    ret_from_fork+0x19/0x24

    Fixes: 3a0a529971ec (block, scsi: Make SCSI quiesce and resume work reliably)
    Reported-by: Woody Suwalski <terraluna977@gmail.com>
    Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
    Acked-by: Martin K. Petersen <martin.petersen@oracle.com>
    [ rjw : Subject ]
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/scsi/scsi_transport_spi.c | 16 ++++++++++++++--
    1 file changed, 14 insertions(+), 2 deletions(-)

    diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
    index 10ebb213ddb3..871ea582029e 100644
    --- a/drivers/scsi/scsi_transport_spi.c
    +++ b/drivers/scsi/scsi_transport_spi.c
    @@ -26,6 +26,7 @@
    #include <linux/mutex.h>
    #include <linux/sysfs.h>
    #include <linux/slab.h>
    +#include <linux/suspend.h>
    #include <scsi/scsi.h>
    #include "scsi_priv.h"
    #include <scsi/scsi_device.h>
    @@ -1009,11 +1010,20 @@ spi_dv_device(struct scsi_device *sdev)
    u8 *buffer;
    const int len = SPI_MAX_ECHO_BUFFER_SIZE*2;

    + /*
    + * Because this function and the power management code both call
    + * scsi_device_quiesce(), it is not safe to perform domain validation
    + * while suspend or resume is in progress. Hence the
    + * lock/unlock_system_sleep() calls.
    + */
    + lock_system_sleep();
    +
    if (unlikely(spi_dv_in_progress(starget)))
    - return;
    + goto unlock;

    if (unlikely(scsi_device_get(sdev)))
    - return;
    + goto unlock;
    +
    spi_dv_in_progress(starget) = 1;

    buffer = kzalloc(len, GFP_KERNEL);
    @@ -1049,6 +1059,8 @@ spi_dv_device(struct scsi_device *sdev)
    out_put:
    spi_dv_in_progress(starget) = 0;
    scsi_device_put(sdev);
    +unlock:
    + unlock_system_sleep();
    }
    EXPORT_SYMBOL(spi_dv_device);

    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-19 23:16    [W:2.253 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site