mbox series

[00/29] UFS patches for kernel v5.19

Message ID 20220331223424.1054715-1-bvanassche@acm.org
Headers show
Series UFS patches for kernel v5.19 | expand

Message

Bart Van Assche March 31, 2022, 10:33 p.m. UTC
Hi Martin,

This patch series includes the following changes:
- Separation of UFS core and UFS driver source code into separate directories.
- Split the ufshcd.h header file into two header files - one file that
  defines the interface with UFS drivers and another file with definitions
  only used in the core.
- Multiple source code cleanup patches.
- A few patches with minor functional changes.

Please consider these changes for kernel v5.19.

Thank you,

Bart.

Bart Van Assche (29):
  scsi: ufs: Declare ufshcd_wait_for_register() static
  scsi: ufs: Remove superfluous boolean conversions
  scsi: ufs: Simplify statements that return a boolean
  scsi: ufs: Remove ufshcd_lrb.sense_bufflen
  scsi: ufs: Remove ufshcd_lrb.sense_buffer
  scsi: ufs: Use get_unaligned_be16() instead of be16_to_cpup()
  scsi: ufs: Remove the UFS_FIX() and END_FIX() macros
  scsi: ufs: Rename struct ufs_dev_fix into ufs_dev_quirk
  scsi: ufs: Declare the quirks array const
  scsi: ufs: Invert the return value of ufshcd_is_hba_active()
  scsi: ufs: Remove unused constants and code
  scsi: ufs: Switch to aggregate initialization
  scsi: ufs: Remove the LUN quiescing code from ufshcd_wl_shutdown()
  scsi: ufs: Make the config_scaling_param calls type safe
  scsi: ufs: Remove the driver version
  scsi: ufs: Rename sdev_ufs_device into ufs_device_wlun
  scsi: ufs: Use an SPDX license identifier in the Kconfig file
  scsi: ufs: Remove paths from source code comments
  scsi: ufs: Remove the TRUE and FALSE definitions
  scsi: ufs: Remove locking from around single register writes
  scsi: ufs: Introduce ufshcd_clkgate_delay_set()
  scsi: ufs: qcom: Fix ufs_qcom_resume()
  scsi: ufs: Remove unnecessary ufshcd-crypto.h include directives
  scsi: ufs: Fix kernel-doc syntax in ufshcd.h
  scsi: ufs: Minimize #include directives
  scsi: ufs: Split the ufshcd.h header file
  scsi: ufs: Move the struct ufs_ref_clk definition
  scsi: ufs: Move the ufs_is_valid_unit_desc_lun() definition
  scsi: ufs: Split the drivers/scsi/ufs directory

 drivers/scsi/Kconfig                          |   3 +-
 drivers/scsi/Makefile                         |   4 +-
 drivers/scsi/ufs-core/Kconfig                 |  82 ++++
 drivers/scsi/ufs-core/Makefile                |  10 +
 drivers/scsi/{ufs => ufs-core}/ufs-debugfs.c  |   4 +-
 drivers/scsi/{ufs => ufs-core}/ufs-debugfs.h  |   0
 .../{ufs => ufs-core}/ufs-fault-injection.c   |   4 +-
 .../{ufs => ufs-core}/ufs-fault-injection.h   |   0
 drivers/scsi/{ufs => ufs-core}/ufs-hwmon.c    |   4 +-
 drivers/scsi/{ufs => ufs-core}/ufs-sysfs.c    |   8 +-
 drivers/scsi/{ufs => ufs-core}/ufs-sysfs.h    |   3 +-
 drivers/scsi/{ufs => ufs-core}/ufs_bsg.c      |   6 +
 drivers/scsi/{ufs => ufs-core}/ufs_bsg.h      |   7 +-
 .../scsi/{ufs => ufs-core}/ufshcd-crypto.c    |   2 +-
 .../scsi/{ufs => ufs-core}/ufshcd-crypto.h    |   7 +-
 drivers/scsi/ufs-core/ufshcd-priv.h           | 296 ++++++++++++++
 drivers/scsi/{ufs => ufs-core}/ufshcd.c       | 254 ++++++------
 drivers/scsi/{ufs => ufs-core}/ufshpb.c       |  10 +-
 drivers/scsi/{ufs => ufs-core}/ufshpb.h       |   0
 drivers/scsi/ufs-drivers/Kconfig              | 118 ++++++
 drivers/scsi/{ufs => ufs-drivers}/Makefile    |  12 -
 .../scsi/{ufs => ufs-drivers}/cdns-pltfrm.c   |   5 +-
 .../{ufs => ufs-drivers}/tc-dwc-g210-pci.c    |   8 +-
 .../{ufs => ufs-drivers}/tc-dwc-g210-pltfrm.c |  10 +-
 .../scsi/{ufs => ufs-drivers}/tc-dwc-g210.c   |   8 +-
 .../scsi/{ufs => ufs-drivers}/tc-dwc-g210.h   |   2 +
 .../scsi/{ufs => ufs-drivers}/ti-j721e-ufs.c  |   0
 .../scsi/{ufs => ufs-drivers}/ufs-exynos.c    |  17 +-
 .../scsi/{ufs => ufs-drivers}/ufs-exynos.h    |   8 +-
 drivers/scsi/{ufs => ufs-drivers}/ufs-hisi.c  |  17 +-
 drivers/scsi/{ufs => ufs-drivers}/ufs-hisi.h  |   0
 .../{ufs => ufs-drivers}/ufs-mediatek-trace.h |   2 +-
 .../scsi/{ufs => ufs-drivers}/ufs-mediatek.c  |  40 +-
 .../scsi/{ufs => ufs-drivers}/ufs-mediatek.h  |   0
 .../scsi/{ufs => ufs-drivers}/ufs-qcom-ice.c  |   3 +-
 drivers/scsi/{ufs => ufs-drivers}/ufs-qcom.c  |  49 +--
 drivers/scsi/{ufs => ufs-drivers}/ufs-qcom.h  |   6 +-
 .../scsi/{ufs => ufs-drivers}/ufshcd-dwc.c    |   6 +-
 .../scsi/{ufs => ufs-drivers}/ufshcd-dwc.h    |   2 +
 .../scsi/{ufs => ufs-drivers}/ufshcd-pci.c    |  14 +-
 .../scsi/{ufs => ufs-drivers}/ufshcd-pltfrm.c |  35 +-
 .../scsi/{ufs => ufs-drivers}/ufshcd-pltfrm.h |   2 +-
 .../scsi/{ufs => ufs-drivers}/ufshci-dwc.h    |   0
 drivers/scsi/ufs/Kconfig                      | 211 ----------
 {drivers/scsi/ufs => include/scsi}/ufs.h      |  35 --
 .../scsi/ufs => include/scsi}/ufs_quirks.h    |  15 +-
 {drivers/scsi/ufs => include/scsi}/ufshcd.h   | 366 ++++--------------
 {drivers/scsi/ufs => include/scsi}/ufshci.h   |   2 +
 {drivers/scsi/ufs => include/scsi}/unipro.h   |  16 -
 49 files changed, 856 insertions(+), 857 deletions(-)
 create mode 100644 drivers/scsi/ufs-core/Kconfig
 create mode 100644 drivers/scsi/ufs-core/Makefile
 rename drivers/scsi/{ufs => ufs-core}/ufs-debugfs.c (99%)
 rename drivers/scsi/{ufs => ufs-core}/ufs-debugfs.h (100%)
 rename drivers/scsi/{ufs => ufs-core}/ufs-fault-injection.c (100%)
 rename drivers/scsi/{ufs => ufs-core}/ufs-fault-injection.h (100%)
 rename drivers/scsi/{ufs => ufs-core}/ufs-hwmon.c (98%)
 rename drivers/scsi/{ufs => ufs-core}/ufs-sysfs.c (99%)
 rename drivers/scsi/{ufs => ufs-core}/ufs-sysfs.h (95%)
 rename drivers/scsi/{ufs => ufs-core}/ufs_bsg.c (97%)
 rename drivers/scsi/{ufs => ufs-core}/ufs_bsg.h (77%)
 rename drivers/scsi/{ufs => ufs-core}/ufshcd-crypto.c (99%)
 rename drivers/scsi/{ufs => ufs-core}/ufshcd-crypto.h (94%)
 create mode 100644 drivers/scsi/ufs-core/ufshcd-priv.h
 rename drivers/scsi/{ufs => ufs-core}/ufshcd.c (98%)
 rename drivers/scsi/{ufs => ufs-core}/ufshpb.c (99%)
 rename drivers/scsi/{ufs => ufs-core}/ufshpb.h (100%)
 create mode 100644 drivers/scsi/ufs-drivers/Kconfig
 rename drivers/scsi/{ufs => ufs-drivers}/Makefile (56%)
 rename drivers/scsi/{ufs => ufs-drivers}/cdns-pltfrm.c (99%)
 rename drivers/scsi/{ufs => ufs-drivers}/tc-dwc-g210-pci.c (98%)
 rename drivers/scsi/{ufs => ufs-drivers}/tc-dwc-g210-pltfrm.c (98%)
 rename drivers/scsi/{ufs => ufs-drivers}/tc-dwc-g210.c (99%)
 rename drivers/scsi/{ufs => ufs-drivers}/tc-dwc-g210.h (95%)
 rename drivers/scsi/{ufs => ufs-drivers}/ti-j721e-ufs.c (100%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-exynos.c (99%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-exynos.h (97%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-hisi.c (99%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-hisi.h (100%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-mediatek-trace.h (92%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-mediatek.c (97%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-mediatek.h (100%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-qcom-ice.c (99%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-qcom.c (98%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufs-qcom.h (98%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufshcd-dwc.c (98%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufshcd-dwc.h (95%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufshcd-pci.c (99%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufshcd-pltfrm.c (94%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufshcd-pltfrm.h (98%)
 rename drivers/scsi/{ufs => ufs-drivers}/ufshci-dwc.h (100%)
 delete mode 100644 drivers/scsi/ufs/Kconfig
 rename {drivers/scsi/ufs => include/scsi}/ufs.h (93%)
 rename {drivers/scsi/ufs => include/scsi}/ufs_quirks.h (94%)
 rename {drivers/scsi/ufs => include/scsi}/ufshcd.h (82%)
 rename {drivers/scsi/ufs => include/scsi}/ufshci.h (99%)
 rename {drivers/scsi/ufs => include/scsi}/unipro.h (98%)

Comments

Bart Van Assche April 5, 2022, 2:22 p.m. UTC | #1
On 4/5/22 02:33, Bean Huo wrote:
> For performance improvement, according to my test, if we abandon SCSI
> command parsing, we can get 3%~5% performance improvement. Maybe this
> is little or no improvement? Yes, reliability issues outweigh this
> performance improvement. Error handling and UFS probes should also be
> rebuilt. But most importantly, it makes UFS more scalable. How do you
> think about adding an immature development driver to drever/staging
> first? name it driver/staging/lightweight-ufs?

I do not understand the interest in bypassing the SCSI core. The 
scsi_debug driver supports more than a million IOPS on a single CPU core 
(see also the attached script). I think this shows that the SCSI core is 
not a performance bottleneck. Additionally, I think it will take a while 
until UFS devices scale from the current performance level (100K IOPS?) 
to more than a million IOPS.

Please note that bypassing the SCSI core would make it much harder than 
necessary to introduce zoned storage support and also that this would 
lead to plenty of duplicated code.

>> For other SCSI LLDs the cost of
>> atomic operations and memory barriers in the LLD outweighs the cost
>> of
>> the operations in the SCSI core and sd drivers. I'm not sure whether
>> that's also the case for the UFS driver.
> 
> I didn't take this into account, maybe it's not a big deal, since the
> UFS driver might use its own lock/serialization lock.

Every single atomic operation in the hot path has a measurable 
performance impact. That includes locking operations.

Thanks,

Bart.
#!/bin/bash

set -e

iodepth=${1:-1}
runtime=30
blocksize=512
numcpus=$(nproc)

modprobe -r scsi_debug
modprobe scsi_debug max_queue=128 submit_queues="$numcpus" delay=0 fake_rw=1 &&
    udevadm settle

DEVICE=$(find /sys/bus/pseudo/drivers/scsi_debug/adapter*/host*/target*/*/block/ -maxdepth 1 -type d | grep -v 'block/$' | head -1 | xargs basename) || exit $?
[ -n "$DEVICE" ] || exit $?

args=()
if [ "$iodepth" = 1 ]; then
	args+=(--ioengine=psync)
else
	args+=(--ioengine=io_uring --iodepth_batch=$((iodepth/2)) --hipri=1)
fi
args+=(
    --bs="${blocksize}"
    --direct=1
    --filename=/dev/"$DEVICE"
    --group_reporting=1
    --gtod_reduce=1
    --invalidate=1
    --iodepth="$iodepth"
    --ioscheduler=none
    --name=scsi_debug
    --numjobs=1
    --runtime="$runtime"
    --rw=read
    --thread
    --time_based=1
)
set -x
if numactl -m 0 -N 0 echo >&/dev/null; then
	numactl -m 0 -N 0 -- fio "${args[@]}"
else
	fio "${args[@]}"
fi