• John Garry's avatar
    scsi: scsi_debug: Only allow sdebug_max_queue be modified when no shosts · 57f7225a
    John Garry authored
    The shost->can_queue value is initially used to set per-HW queue context
    tag depth in the block layer. This ensures that the shost is not sent too
    many commands which it can deal with. However lowering sdebug_max_queue
    separately means that we can easily overload the shost, as in the following
    example:
    
    $ cat /sys/bus/pseudo/drivers/scsi_debug/max_queue
    192
    $ cat /sys/class/scsi_host/host0/can_queue
    192
    $ echo 100 > /sys/bus/pseudo/drivers/scsi_debug/max_queue
    $ cat /sys/class/scsi_host/host0/can_queue
    192
    $ fio --filename=/dev/sda --direct=1 --rw=read --bs=4k --iodepth=256
    --runtime=1200 --numjobs=10 --time_based --group_reporting
    --name=iops-test-job --eta-newline=1 --readonly    --ioengine=io_uring
    --hipri --exitall_on_error
    iops-test-job: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=io_uring, iodepth=256
    ...
    fio-3.28
    Starting 10 processes
    [  111.269885] scsi_io_completion_action: 400 callbacks suppressed
    [  111.269885] blk_print_req_error: 400 callbacks suppressed
    [  111.269889] I/O error, dev sda, sector 440 op 0x0:(READ) flags 0x1200000 phys_seg 1 prio class 2
    [  111.269892] sd 0:0:0:0: [sda] tag#132 FAILED Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK cmd_age=0s
    [  111.269897] sd 0:0:0:0: [sda] tag#132 CDB: Read(10) 28 00 00 00 01 68 00 00 08 00
    [  111.277058] I/O error, dev sda, sector 360 op 0x0:(READ) flags 0x1200000 phys_seg 1 prio class 2
    
    [...]
    
    Ensure that this cannot happen by allowing sdebug_max_queue be modified
    only when we have no shosts. As such, any shost->can_queue value will match
    sdebug_max_queue, and sdebug_max_queue cannot be modified separately.
    
    Since retired_max_queue is no longer set, remove support.
    
    Continue to apply the restriction that sdebug_host_max_queue cannot be
    modified when sdebug_host_max_queue is set. Adding support for that would
    mean extra code, and no one has complained about this restriction
    previously.
    
    A command like the following may be used to remove a shost:
    echo -1 > /sys/bus/pseudo/drivers/scsi_debug/add_host
    Signed-off-by: default avatarJohn Garry <john.g.garry@oracle.com>
    Link: https://lore.kernel.org/r/20230327074310.1862889-11-john.g.garry@oracle.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    57f7225a
scsi_debug.c 228 KB