[PATCH V5 0/1] nvme: allow passthru cmd error logging
Chaitanya Kulkarni
kch at nvidia.com
Sun Apr 9 14:25:37 PDT 2023
Hi Alan,
I spnet some time on the V4 to fix several nits and testing with keeping
your authorship, please have a look, feel free to send a next version
if you find something not right.
In nvme_end_req()_ we only log errors which are for non-passthru
commands. Add a helper function nvme_log_err_passthru() which allows us
to log error for passthru commands by decoding cdw10-cdw15 values of
nvme command.
Full disclouser there is a checkpatch warning on this patch :-
WARNING: Symbolic permissions 'S_IRUGO | S_IWUSR' are not preferred. Consider using octal permissions '0644'.
#146: FILE: drivers/nvme/host/core.c:3487:
+static DEVICE_ATTR(passthru_err_log, S_IRUGO | S_IWUSR,
This patch is using DEVICE_ATTR declaration style in nvme/host/core.c
instead of inventing new one to remove above warning.
This has several fixes on V4, see list below.
Below is short testlog :-
nvme (nvme-6.4) # echo "############ TEST Admin Command error ###################"
############ TEST Admin Command error ###################
nvme (nvme-6.4) # nvme telemetry-log -o /tmp/test /dev/nvme0
NVMe status: Invalid Field in Command: A reserved coded value or an unsupported value in a defined field(0x4002)
Failed to acquire telemetry log 16386!
nvme (nvme-6.4) # dmesg -c
[50359.040637] nvme0: Get Log Page(0x2), Invalid Field in Command (sct 0x0 / sc 0x2) DNR cdw10=0x7f0107 cdw11=0x0 cdw12=0x0 cdw13=0x0 cdw14=0x0 cdw15=0x0
nvme (nvme-6.4) # echo "############ TEST I/O Command error ###################"
############ TEST I/O Command error ###################
nvme (nvme-6.4) # nvme write-zeroes -n 1 -s 0x200000 -c 10 /dev/nvme0
NVMe status: LBA Out of Range: The command references an LBA that exceeds the size of the namespace(0x4080)
nvme (nvme-6.4) # dmesg -c
[134411.419290] nvme nvme0: using deprecated NVME_IOCTL_IO_CMD ioctl on the char device!
[134411.419484] nvme0n1: Write Zeros(0x8), LBA Out of Range (sct 0x0 / sc 0x80) DNR cdw10=0x200000 cdw11=0x0 cdw12=0xa cdw13=0x0 cdw14=0x0 cdw15=0x0
nvme (nvme-6.4) #
nvme (nvme-6.4) #
-ck
Chaitanya Kulkarni (1):
nvme: allow passthru cme error logging
drivers/nvme/host/core.c | 83 +++++++++++++++++++++++++++++++++++++---
drivers/nvme/host/nvme.h | 1 +
2 files changed, 79 insertions(+), 5 deletions(-)
v5:
- Trim down code in the nvme_log_error_passthrough().
Use following to get the disk name as an arg to
pr_err_ratelimited() :-
ns ? ns->disk->disk_name : dev_name(nr->ctrl->device),
Use following to get the admin vs I/O opcode string as an arg to
pr_err_ratelimited() :-
ns ? nvme_get_opcode_str(nr->cmd->common.opcode) :
nvme_get_admin_opcode_str(nr->cmd->common.opcode),
- Rename nvme_log_error_passthrough() -> nvme_log_err_passthru().
- Remove else and return directly in nvme_passthru_err_log_show().
- Generate error on invalid values of the passthru_enable variable
in nvme_passthru_log_store().
- Rename passthrough -> passthru.
- Rename sysfs attr from passthru_admin_err_logging -> passthru_log_err.
v4:
- Change sysfs attribute to passthru_admin_err_logging
- Only log passthrough admin commands. IO passthrough commands will always be logged.
v3:
- Log a passthrough specific message that dumps CDW* contents.
- Enable/disable vis sysfs rather than debugfs.
v2:
- Included Pankaj Raghav's patch 'nvme: ignore starting sector while error logging for passthrough requests'
with a couple changes.
- Moved error_logging flag to nvme_ctrl structure
- The entire nvme-debugfs.c does not need to be guarded by #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS.
- Use IS_ENABLED((CONFIG_NVME_ERROR_LOGGING_DEBUG_FS)) to determine if error logging should be
initialized.
- Various other nits.
nvme (nvme-6.4) # git am p/nvme-passthru-err-log/0001-nvme-allow-passthru-cme-error-logging.patch
Applying: nvme: allow passthru cmd error logging
nvme (nvme-6.4) # gitlog -2
aeae7179040c (HEAD -> nvme-6.4) nvme: allow passthru cmd error logging
803fc6f9ccee Merge branch 'nvme-6.4' of git://git.infradead.org/nvme into nvme-6.4
nvme (nvme-6.4) # ./compile_nvme.sh
+ umount /mnt/nvme0n1
+ clear_dmesg
./compile_nvme.sh: line 3: clear_dmesg: command not found
umount: /mnt/nvme0n1: no mount point specified.
+ ./delete.sh
+ NQN=testnqn
+ nvme disconnect -n testnqn
NQN:testnqn disconnected 0 controller(s)
real 0m0.004s
user 0m0.001s
sys 0m0.002s
+ rm -fr '/sys/kernel/config/nvmet/ports/1/subsystems/*'
+ rmdir /sys/kernel/config/nvmet/ports/1
rmdir: failed to remove '/sys/kernel/config/nvmet/ports/1': No such file or directory
+ for subsys in /sys/kernel/config/nvmet/subsystems/*
+ for ns in ${subsys}/namespaces/*
+ echo 0
./delete.sh: line 14: /sys/kernel/config/nvmet/subsystems/*/namespaces/*/enable: No such file or directory
+ rmdir '/sys/kernel/config/nvmet/subsystems/*/namespaces/*'
rmdir: failed to remove '/sys/kernel/config/nvmet/subsystems/*/namespaces/*': No such file or directory
+ rmdir '/sys/kernel/config/nvmet/subsystems/*'
rmdir: failed to remove '/sys/kernel/config/nvmet/subsystems/*': No such file or directory
+ rmdir 'config/nullb/nullb*'
rmdir: failed to remove 'config/nullb/nullb*': No such file or directory
+ umount /mnt/nvme0n1
umount: /mnt/nvme0n1: no mount point specified.
+ umount /mnt/backend
umount: /mnt/backend: not mounted.
+ modprobe -r nvme_loop
+ modprobe -r nvme_fabrics
+ modprobe -r nvmet
+ modprobe -r nvme
+ modprobe -r null_blk
+ tree /sys/kernel/config
/sys/kernel/config
âââ pci_ep
âââ controllers
âââ functions
3 directories, 0 files
+ modprobe -r nvme-fabrics
+ modprobe -r nvme_loop
+ modprobe -r nvmet
+ modprobe -r nvme
+ sleep 1
+ modprobe -r nvme-core
+ lsmod
+ grep nvme
+ sleep 1
+ git diff
+ sleep 1
++ nproc
+ make -j 48 M=drivers/nvme/ modules
CC [M] drivers/nvme/common/auth.o
CC [M] drivers/nvme/host/core.o
CC [M] drivers/nvme/host/ioctl.o
CC [M] drivers/nvme/target/core.o
CC [M] drivers/nvme/target/configfs.o
CC [M] drivers/nvme/host/constants.o
CC [M] drivers/nvme/host/trace.o
CC [M] drivers/nvme/target/admin-cmd.o
CC [M] drivers/nvme/host/multipath.o
CC [M] drivers/nvme/target/fabrics-cmd.o
CC [M] drivers/nvme/host/zns.o
CC [M] drivers/nvme/target/discovery.o
CC [M] drivers/nvme/host/fault_inject.o
CC [M] drivers/nvme/target/io-cmd-file.o
CC [M] drivers/nvme/host/hwmon.o
CC [M] drivers/nvme/target/io-cmd-bdev.o
CC [M] drivers/nvme/host/auth.o
CC [M] drivers/nvme/target/passthru.o
CC [M] drivers/nvme/target/zns.o
CC [M] drivers/nvme/host/pci.o
CC [M] drivers/nvme/host/fabrics.o
CC [M] drivers/nvme/target/fabrics-cmd-auth.o
CC [M] drivers/nvme/target/auth.o
CC [M] drivers/nvme/target/trace.o
CC [M] drivers/nvme/host/rdma.o
CC [M] drivers/nvme/target/loop.o
CC [M] drivers/nvme/host/fc.o
CC [M] drivers/nvme/target/rdma.o
CC [M] drivers/nvme/host/tcp.o
CC [M] drivers/nvme/target/fc.o
CC [M] drivers/nvme/target/fcloop.o
CC [M] drivers/nvme/target/tcp.o
LD [M] drivers/nvme/common/nvme-common.o
LD [M] drivers/nvme/host/nvme-fabrics.o
LD [M] drivers/nvme/target/nvme-fcloop.o
LD [M] drivers/nvme/target/nvme-loop.o
LD [M] drivers/nvme/target/nvmet.o
LD [M] drivers/nvme/target/nvmet-fc.o
LD [M] drivers/nvme/host/nvme-rdma.o
LD [M] drivers/nvme/target/nvmet-tcp.o
LD [M] drivers/nvme/host/nvme-fc.o
LD [M] drivers/nvme/host/nvme.o
LD [M] drivers/nvme/host/nvme-tcp.o
LD [M] drivers/nvme/target/nvmet-rdma.o
LD [M] drivers/nvme/host/nvme-core.o
MODPOST drivers/nvme/Module.symvers
CC [M] drivers/nvme/host/nvme-core.mod.o
CC [M] drivers/nvme/host/nvme.mod.o
CC [M] drivers/nvme/host/nvme-fabrics.mod.o
CC [M] drivers/nvme/host/nvme-rdma.mod.o
CC [M] drivers/nvme/host/nvme-fc.mod.o
CC [M] drivers/nvme/host/nvme-tcp.mod.o
CC [M] drivers/nvme/target/nvmet.mod.o
CC [M] drivers/nvme/target/nvme-loop.mod.o
CC [M] drivers/nvme/target/nvmet-rdma.mod.o
CC [M] drivers/nvme/target/nvmet-fc.mod.o
CC [M] drivers/nvme/target/nvme-fcloop.mod.o
CC [M] drivers/nvme/target/nvmet-tcp.mod.o
CC [M] drivers/nvme/common/nvme-common.mod.o
LD [M] drivers/nvme/host/nvme-core.ko
LD [M] drivers/nvme/host/nvme-fabrics.ko
LD [M] drivers/nvme/host/nvme.ko
LD [M] drivers/nvme/host/nvme-fc.ko
LD [M] drivers/nvme/host/nvme-rdma.ko
LD [M] drivers/nvme/target/nvmet-rdma.ko
LD [M] drivers/nvme/target/nvmet.ko
LD [M] drivers/nvme/host/nvme-tcp.ko
LD [M] drivers/nvme/target/nvme-loop.ko
LD [M] drivers/nvme/target/nvme-fcloop.ko
LD [M] drivers/nvme/target/nvmet-tcp.ko
LD [M] drivers/nvme/target/nvmet-fc.ko
LD [M] drivers/nvme/common/nvme-common.ko
+ HOST=drivers/nvme/host
+ TARGET=drivers/nvme/target
++ uname -r
+ HOST_DEST=/lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/host/
++ uname -r
+ TARGET_DEST=/lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/target/
+ cp drivers/nvme/host/nvme-core.ko drivers/nvme/host/nvme-fabrics.ko drivers/nvme/host/nvme-fc.ko drivers/nvme/host/nvme.ko drivers/nvme/host/nvme-rdma.ko drivers/nvme/host/nvme-tcp.ko /lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/host//
+ cp drivers/nvme/target/nvme-fcloop.ko drivers/nvme/target/nvme-loop.ko drivers/nvme/target/nvmet-fc.ko drivers/nvme/target/nvmet.ko drivers/nvme/target/nvmet-rdma.ko drivers/nvme/target/nvmet-tcp.ko /lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/target//
+ ls -lrth /lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/host/ /lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/target//
/lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/host/:
total 7.5M
-rw-r--r--. 1 root root 3.5M Apr 8 14:59 nvme-core.ko
-rw-r--r--. 1 root root 477K Apr 8 14:59 nvme-fabrics.ko
-rw-r--r--. 1 root root 974K Apr 8 14:59 nvme-fc.ko
-rw-r--r--. 1 root root 783K Apr 8 14:59 nvme.ko
-rw-r--r--. 1 root root 925K Apr 8 14:59 nvme-rdma.ko
-rw-r--r--. 1 root root 900K Apr 8 14:59 nvme-tcp.ko
/lib/modules/6.3.0-rc2nvme+/kernel/drivers/nvme/target//:
total 7.3M
-rw-r--r--. 1 root root 529K Apr 8 14:59 nvme-fcloop.ko
-rw-r--r--. 1 root root 469K Apr 8 14:59 nvme-loop.ko
-rw-r--r--. 1 root root 799K Apr 8 14:59 nvmet-fc.ko
-rw-r--r--. 1 root root 4.0M Apr 8 14:59 nvmet.ko
-rw-r--r--. 1 root root 891K Apr 8 14:59 nvmet-rdma.ko
-rw-r--r--. 1 root root 751K Apr 8 14:59 nvmet-tcp.ko
+ sync
+ sync
+ sync
+ modprobe nvme
+ echo 'Press enter to continue ...'
Press enter to continue ...
nvme (nvme-6.4) # dmesg -c > /dev/null
nvme (nvme-6.4) #
nvme (nvme-6.4) #
bash: cho: command not found...
nvme (nvme-6.4) # echo 1 > /sys/class/nvme/nvme0/passthru_err_log
nvme (nvme-6.4) # echo "############ TEST Admin Command error ###################"
############ TEST Admin Command error ###################
nvme (nvme-6.4) # nvme telemetry-log -o /tmp/test /dev/nvme0
NVMe status: Invalid Field in Command: A reserved coded value or an unsupported value in a defined field(0x4002)
Failed to acquire telemetry log 16386!
nvme (nvme-6.4) # dmesg -c
[50359.040637] nvme0: Get Log Page(0x2), Invalid Field in Command (sct 0x0 / sc 0x2) DNR cdw10=0x7f0107 cdw11=0x0 cdw12=0x0 cdw13=0x0 cdw14=0x0 cdw15=0x0
nvme (nvme-6.4) # echo "############ TEST I/O Command error ###################"
############ TEST I/O Command error ###################
nvme (nvme-6.4) # nvme write-zeroes -n 1 -s 0x200000 -c 10 /dev/nvme0
NVMe status: LBA Out of Range: The command references an LBA that exceeds the size of the namespace(0x4080)
nvme (nvme-6.4) #
o
--
2.29.0
More information about the Linux-nvme
mailing list