Re: [PATCH] scsi: Avoid unnecessary iterations on __scsi_scan_target

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks James.

This is on a VM on OCI cloud, using virtio scsi.

Here is output of lspci on the VM:

00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] 00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Device 1234:1111 (rev 02)
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI

With 16 iterations, we could reduce time by 0.13 secs.

Anjali

On 6/26/20 17:03, James Bottomley wrote:
On Fri, 2020-06-26 at 16:53 -0700, Anjali Kulkarni wrote:
There is a loop in scsi_scan_channel(), which calls
__scsi_scan_target() 255 times, even when it has found a
target/device on a
lun in the first iteration; this ends up adding a 2 secs delay to the
boot
time. The for loop in scsi_scan_channel() adding 2 secs to boot time
is as
follows:

for (id = 0; id < shost->max_id; ++id) {
      ...
      __scsi_scan_target(&shost->shost_gendev, channel,
                                order_id, lun, rescan);
}

__scsi_scan_target() calls scsi_probe_and_add_lun() which calls
scsi_probe_lun(), hence scsi_probe_lun() ends up getting called 255
times.
Each call of scsi_probe_lun() takes 0.007865 secs.
0.007865 multiplied by 255 = 2.00557 secs.
By adding a break in above for loop when a valid device on lun is
found,
we can avoid this 2 secs delay improving boot time by 2 secs.

The flow of code is depicted in the following sequence of events:

do_scan_async() ->
      do_scsi_scan_host()->
          scsi_scan_host_selected() ->
              scsi_scan_channel()
                  __scsi_scan_target() -> this is called shost->max_id
times
                                          (255 times)
                      scsi_probe_and_add_lun-> this is called 255
times
                          scsi_probe_lun : called 255 times, each call
                                           takes 0.007865 secs.
What HBA is this?  This code is for legacy scanning of busses which
require it, which is pretty much only SPI.  The max_id of even the
latest SPI bus should only be 16, so where is 255 coming from?

James




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux