* blktests v3 tests/nvme: add tests for error logging @ 2022-05-13 15:52 Alan Adamson 2022-05-13 15:52 ` [PATCH v3 blktests 1/2] tests/nvme: add helper routines to use error injector Alan Adamson 2022-05-13 15:52 ` [PATCH v3 blktests 2/2] tests/nvme: add tests for error logging Alan Adamson 0 siblings, 2 replies; 5+ messages in thread From: Alan Adamson @ 2022-05-13 15:52 UTC (permalink / raw) To: linux-block; +Cc: alan.adamson, linux-nvme, osandov blktests tests/nvme: add tests for error logging Test nvme error logging by injecting errors. Kernel must have FAULT_INJECTION and FAULT_INJECTION_DEBUG_FS configured to use error injector. Tests can be run with or without NVME_VERBOSE_ERRORS configured. These test verify the functionality delivered by the follow: commit bd83fe6f2cd2 ("nvme: add verbose error logging") V2 - Update from suggestions from shinichiro.kawasaki@wdc.com V3 - Add error injector helper functions to nvme/rc Alan Adamson (2): tests/nvme: add helper routine to use error injector tests/nvme: add tests for error logging tests/nvme/039 | 152 +++++++++++++++++++++++++++++++++++++++++++++ tests/nvme/039.out | 7 +++ tests/nvme/rc | 44 +++++++++++++ 3 files changed, 203 insertions(+) create mode 100755 tests/nvme/039 create mode 100644 tests/nvme/039.out -- 2.27.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 blktests 1/2] tests/nvme: add helper routines to use error injector 2022-05-13 15:52 blktests v3 tests/nvme: add tests for error logging Alan Adamson @ 2022-05-13 15:52 ` Alan Adamson 2022-05-16 1:10 ` Shinichiro Kawasaki 2022-05-13 15:52 ` [PATCH v3 blktests 2/2] tests/nvme: add tests for error logging Alan Adamson 1 sibling, 1 reply; 5+ messages in thread From: Alan Adamson @ 2022-05-13 15:52 UTC (permalink / raw) To: linux-block; +Cc: alan.adamson, linux-nvme, osandov nvme tests can use these helper routines to setup and use the nvme error injector. Signed-off-by: Alan Adamson <alan.adamson@oracle.com> --- tests/nvme/rc | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/nvme/rc b/tests/nvme/rc index 3c38408a0bfe..c49a3c5d78da 100644 --- a/tests/nvme/rc +++ b/tests/nvme/rc @@ -375,3 +375,47 @@ _discovery_genctr() { _nvme_discover "${nvme_trtype}" | sed -n -e 's/^.*Generation counter \([0-9]\+\).*$/\1/p' } + +declare -A NS_DEV_FAULT_INJECT_SAVE +declare -A CTRL_DEV_FAULT_INJECT_SAVE + +_nvme_err_inject_setup() +{ + local a + + for a in /sys/kernel/debug/"$1"/fault_inject/*; do + NS_DEV_FAULT_INJECT_SAVE[${a}]=$(<"${a}") + done + + for a in /sys/kernel/debug/"$2"/fault_inject/*; do + CTRL_DEV_FAULT_INJECT_SAVE[${a}]=$(<"${a}") + done +} + +_nvme_err_inject_cleanup() +{ + local a + + for a in /sys/kernel/debug/"${ns_dev}"/fault_inject/*; do + echo "${NS_DEV_FAULT_INJECT_SAVE[${a}]}" > "${a}" + echo ${a} $(<"${a}") >> /tmp/iii + done + for a in /sys/kernel/debug/"${ctrl_dev}"/fault_inject/*; do + echo "${CTRL_DEV_FAULT_INJECT_SAVE[${a}]}" > "${a}" + done +} + +_nvme_enable_err_inject() +{ + echo "$2" > /sys/kernel/debug/"$1"/fault_inject/verbose + echo "$3" > /sys/kernel/debug/"$1"/fault_inject/probability + echo "$4" > /sys/kernel/debug/"$1"/fault_inject/dont_retry + echo "$5" > /sys/kernel/debug/"$1"/fault_inject/status + echo "$6" > /sys/kernel/debug/"$1"/fault_inject/times +} + +_nvme_clear_err_inject() +{ + echo 0 > /sys/kernel/debug/"$1"/fault_inject/probability + echo 0 > /sys/kernel/debug/"$1"/fault_inject/times +} -- 2.27.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 blktests 1/2] tests/nvme: add helper routines to use error injector 2022-05-13 15:52 ` [PATCH v3 blktests 1/2] tests/nvme: add helper routines to use error injector Alan Adamson @ 2022-05-16 1:10 ` Shinichiro Kawasaki 0 siblings, 0 replies; 5+ messages in thread From: Shinichiro Kawasaki @ 2022-05-16 1:10 UTC (permalink / raw) To: Alan Adamson; +Cc: linux-block, linux-nvme, osandov On May 13, 2022 / 08:52, Alan Adamson wrote: > nvme tests can use these helper routines to setup and use > the nvme error injector. > > Signed-off-by: Alan Adamson <alan.adamson@oracle.com> > --- > tests/nvme/rc | 44 ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 44 insertions(+) > > diff --git a/tests/nvme/rc b/tests/nvme/rc > index 3c38408a0bfe..c49a3c5d78da 100644 > --- a/tests/nvme/rc > +++ b/tests/nvme/rc > @@ -375,3 +375,47 @@ _discovery_genctr() { > _nvme_discover "${nvme_trtype}" | > sed -n -e 's/^.*Generation counter \([0-9]\+\).*$/\1/p' > } > + > +declare -A NS_DEV_FAULT_INJECT_SAVE > +declare -A CTRL_DEV_FAULT_INJECT_SAVE > + > +_nvme_err_inject_setup() > +{ > + local a > + > + for a in /sys/kernel/debug/"$1"/fault_inject/*; do > + NS_DEV_FAULT_INJECT_SAVE[${a}]=$(<"${a}") > + done > + > + for a in /sys/kernel/debug/"$2"/fault_inject/*; do > + CTRL_DEV_FAULT_INJECT_SAVE[${a}]=$(<"${a}") > + done > +} > + > +_nvme_err_inject_cleanup() > +{ > + local a > + > + for a in /sys/kernel/debug/"${ns_dev}"/fault_inject/*; do > + echo "${NS_DEV_FAULT_INJECT_SAVE[${a}]}" > "${a}" > + echo ${a} $(<"${a}") >> /tmp/iii > + done > + for a in /sys/kernel/debug/"${ctrl_dev}"/fault_inject/*; do > + echo "${CTRL_DEV_FAULT_INJECT_SAVE[${a}]}" > "${a}" > + done > +} Thanks for separating out the helper functions. ${ns_dev} and ${ctrl_dev} should be ${1} and ${2}, and a debug code is left. 'make check' finds out them. Also, I wish to have an empty line between two for blocks in same manner as _nvme_err_inject_setup(). > + > +_nvme_enable_err_inject() > +{ > + echo "$2" > /sys/kernel/debug/"$1"/fault_inject/verbose > + echo "$3" > /sys/kernel/debug/"$1"/fault_inject/probability > + echo "$4" > /sys/kernel/debug/"$1"/fault_inject/dont_retry > + echo "$5" > /sys/kernel/debug/"$1"/fault_inject/status > + echo "$6" > /sys/kernel/debug/"$1"/fault_inject/times > +} > + > +_nvme_clear_err_inject() To be paired with _nvme_enable_err_inject(), _nvme_disable_err_inject() would be the better name? > +{ > + echo 0 > /sys/kernel/debug/"$1"/fault_inject/probability > + echo 0 > /sys/kernel/debug/"$1"/fault_inject/times > +} > -- > 2.27.0 > -- Best Regards, Shin'ichiro Kawasaki ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 blktests 2/2] tests/nvme: add tests for error logging 2022-05-13 15:52 blktests v3 tests/nvme: add tests for error logging Alan Adamson 2022-05-13 15:52 ` [PATCH v3 blktests 1/2] tests/nvme: add helper routines to use error injector Alan Adamson @ 2022-05-13 15:52 ` Alan Adamson 2022-05-16 1:18 ` Shinichiro Kawasaki 1 sibling, 1 reply; 5+ messages in thread From: Alan Adamson @ 2022-05-13 15:52 UTC (permalink / raw) To: linux-block; +Cc: alan.adamson, linux-nvme, osandov Test nvme error logging by injecting errors. Kernel must have FAULT_INJECTION and FAULT_INJECTION_DEBUG_FS configured to use error injector. Tests can be run with or without NVME_VERBOSE_ERRORS configured. Signed-off-by: Alan Adamson <alan.adamson@oracle.com> Signed-off-by: Chaitanya Kulkarni <kch@nvidia.com> --- tests/nvme/039 | 152 +++++++++++++++++++++++++++++++++++++++++++++ tests/nvme/039.out | 7 +++ 2 files changed, 159 insertions(+) create mode 100755 tests/nvme/039 create mode 100644 tests/nvme/039.out diff --git a/tests/nvme/039 b/tests/nvme/039 new file mode 100755 index 000000000000..dd216cbb2ef0 --- /dev/null +++ b/tests/nvme/039 @@ -0,0 +1,152 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2022 Oracle and/or its affiliates +# +# Test nvme error logging by injecting errors. Kernel must have FAULT_INJECTION +# and FAULT_INJECTION_DEBUG_FS configured to use error injector. Tests can be +# run with or without NVME_VERBOSE_ERRORS configured. +# +# Test for commit bd83fe6f2cd2 ("nvme: add verbose error logging"). + +. tests/nvme/rc +DESCRIPTION="test error logging" +QUICK=1 + +requires() { + _nvme_requires + _have_kernel_option FAULT_INJECTION && \ + _have_kernel_option FAULT_INJECTION_DEBUG_FS +} + +inject_unrec_read_read() +{ + # Inject a 'Unrecovered Read Error' (0x281) status error on a READ + _nvme_enable_err_inject "$1" 0 100 1 0x281 1 + + dd if=/dev/"$1" of=/dev/null bs=512 count=1 iflag=direct \ + 2> /dev/null 1>&2 + + _nvme_clear_err_inject "$1" + if ${nvme_verbose_errors}; then + dmesg -t | tail -2 | grep "Unrecovered Read Error (" | \ + sed 's/nvme.*://g' + else + dmesg -t | tail -2 | grep "Cmd(" | sed 's/I\/O Cmd/Read/g' | \ + sed 's/I\/O Error/Unrecovered Read Error/g' | \ + sed 's/nvme.*://g' + fi +} + +inject_invalid_status_read() +{ + # Inject an invalid status (0x375) on a READ + _nvme_enable_err_inject "$1" 0 100 1 0x375 1 + + dd if=/dev/"$1" of=/dev/null bs=512 count=1 iflag=direct \ + 2> /dev/null 1>&2 + + _nvme_clear_err_inject "$1" + + if ${nvme_verbose_errors}; then + dmesg -t | tail -2 | grep "Unknown (" | \ + sed 's/nvme.*://g' + else + dmesg -t | tail -2 | grep "Cmd(" | sed 's/I\/O Cmd/Read/g' | \ + sed 's/I\/O Error/Unknown/g' | \ + sed 's/nvme.*://g' + fi +} + +inject_write_fault_write() +{ + # Inject a 'Write Fault' 0x280 status error on a WRITE + _nvme_enable_err_inject "$1" 0 100 1 0x280 1 + + dd if=/dev/zero of=/dev/"$1" bs=512 count=1 oflag=direct \ + 2> /dev/null 1>&2 + + _nvme_clear_err_inject "$1" + + if ${nvme_verbose_errors}; then + dmesg -t | tail -2 | grep "Write Fault (" | \ + sed 's/nvme.*://g' + else + dmesg -t | tail -2 | grep "Cmd(" | sed 's/I\/O Cmd/Write/g' | \ + sed 's/I\/O Error/Write Fault/g' | \ + sed 's/nvme.*://g' + fi +} + +inject_access_denied_identify() +{ + # Inject a 'Access Denied' (0x286) status error on an + # Identify admin command + _nvme_enable_err_inject "$1" 0 100 1 0x286 1 + + nvme admin-passthru /dev/"$1" --opcode=0x06 --data-len=4096 \ + --cdw10=1 -r 2> /dev/null 1>&2 + + _nvme_clear_err_inject "$1" + + if ${nvme_verbose_errors}; then + dmesg -t | tail -1 | grep "Access Denied (" | \ + sed 's/nvme.*://g' + else + dmesg -t | tail -1 | grep "Admin Cmd(" | \ + sed 's/Admin Cmd/Identify/g' | \ + sed 's/I\/O Error/Access Denied/g' | \ + sed 's/nvme.*://g' + fi +} + +inject_invalid_cmd_admin() +{ + # Inject a 'Invalid Command Opcode' (0x1) on an invalid command (0x96) + _nvme_enable_err_inject "$1" 0 100 1 0x1 1 + + nvme admin-passthru /dev/"$1" --opcode=0x96 --data-len=4096 \ + --cdw10=1 -r 2> /dev/null 1>&2 + + _nvme_clear_err_inject "$1" + + if ${nvme_verbose_errors}; then + dmesg -t | tail -1 | grep "Invalid Command Opcode (" | \ + sed 's/nvme.*://g' + else + dmesg -t | tail -1 | grep "Admin Cmd(" | \ + sed 's/Admin Cmd/Unknown/g' | \ + sed 's/I\/O Error/Invalid Command Opcode/g' | \ + sed 's/nvme.*://g' + fi +} + +test_device() { + local nvme_verbose_errors + local ns_dev + local ctrl_dev + + echo "Running ${TEST_NAME}" + + if _have_kernel_option NVME_VERBOSE_ERRORS; then + nvme_verbose_errors=true + else + unset SKIP_REASON + nvme_verbose_errors=false + fi + + ns_dev=${TEST_DEV##*/} + ctrl_dev=${ns_dev%n*} + + _nvme_err_inject_setup "${ns_dev}" "${ctrl_dev}" + + inject_unrec_read_read "${ns_dev}" + inject_invalid_status_read "${ns_dev}" + inject_write_fault_write "${ns_dev}" + + inject_access_denied_identify "${ctrl_dev}" + inject_invalid_cmd_admin "${ctrl_dev}" + + _nvme_err_inject_cleanup "${ns_dev}" "${ctrl_dev}" + + echo "Test complete" +} diff --git a/tests/nvme/039.out b/tests/nvme/039.out new file mode 100644 index 000000000000..162935eb1d7b --- /dev/null +++ b/tests/nvme/039.out @@ -0,0 +1,7 @@ +Running nvme/039 + Read(0x2) @ LBA 0, 1 blocks, Unrecovered Read Error (sct 0x2 / sc 0x81) DNR + Read(0x2) @ LBA 0, 1 blocks, Unknown (sct 0x3 / sc 0x75) DNR + Write(0x1) @ LBA 0, 1 blocks, Write Fault (sct 0x2 / sc 0x80) DNR + Identify(0x6), Access Denied (sct 0x2 / sc 0x86) DNR + Unknown(0x96), Invalid Command Opcode (sct 0x0 / sc 0x1) DNR +Test complete -- 2.27.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 blktests 2/2] tests/nvme: add tests for error logging 2022-05-13 15:52 ` [PATCH v3 blktests 2/2] tests/nvme: add tests for error logging Alan Adamson @ 2022-05-16 1:18 ` Shinichiro Kawasaki 0 siblings, 0 replies; 5+ messages in thread From: Shinichiro Kawasaki @ 2022-05-16 1:18 UTC (permalink / raw) To: Alan Adamson; +Cc: linux-block, linux-nvme, osandov On May 13, 2022 / 08:52, Alan Adamson wrote: > Test nvme error logging by injecting errors. Kernel must have FAULT_INJECTION > and FAULT_INJECTION_DEBUG_FS configured to use error injector. Tests can be > run with or without NVME_VERBOSE_ERRORS configured. > > Signed-off-by: Alan Adamson <alan.adamson@oracle.com> > Signed-off-by: Chaitanya Kulkarni <kch@nvidia.com> > --- > tests/nvme/039 | 152 +++++++++++++++++++++++++++++++++++++++++++++ > tests/nvme/039.out | 7 +++ > 2 files changed, 159 insertions(+) > create mode 100755 tests/nvme/039 > create mode 100644 tests/nvme/039.out > > diff --git a/tests/nvme/039 b/tests/nvme/039 > new file mode 100755 > index 000000000000..dd216cbb2ef0 > --- /dev/null > +++ b/tests/nvme/039 > @@ -0,0 +1,152 @@ > +#!/bin/bash > +# SPDX-License-Identifier: GPL-3.0+ > +# Copyright (C) 2022 Oracle and/or its affiliates > +# > +# Test nvme error logging by injecting errors. Kernel must have FAULT_INJECTION > +# and FAULT_INJECTION_DEBUG_FS configured to use error injector. Tests can be > +# run with or without NVME_VERBOSE_ERRORS configured. > +# > +# Test for commit bd83fe6f2cd2 ("nvme: add verbose error logging"). > + > +. tests/nvme/rc > +DESCRIPTION="test error logging" > +QUICK=1 > + > +requires() { > + _nvme_requires > + _have_kernel_option FAULT_INJECTION && \ > + _have_kernel_option FAULT_INJECTION_DEBUG_FS > +} > + > +inject_unrec_read_read() This new function name looks a bit weird for me. How about to have 'on' between the error to inject and the command to be injected? Such as, 'inject_unrec_read_on_read'. Same comment on other three inject_*() functions. > +{ > + # Inject a 'Unrecovered Read Error' (0x281) status error on a READ > + _nvme_enable_err_inject "$1" 0 100 1 0x281 1 > + > + dd if=/dev/"$1" of=/dev/null bs=512 count=1 iflag=direct \ > + 2> /dev/null 1>&2 > + > + _nvme_clear_err_inject "$1" Nit: let's have one empty line here. > + if ${nvme_verbose_errors}; then > + dmesg -t | tail -2 | grep "Unrecovered Read Error (" | \ > + sed 's/nvme.*://g' > + else > + dmesg -t | tail -2 | grep "Cmd(" | sed 's/I\/O Cmd/Read/g' | \ > + sed 's/I\/O Error/Unrecovered Read Error/g' | \ > + sed 's/nvme.*://g' > + fi > +} > + > +inject_invalid_status_read() > +{ > + # Inject an invalid status (0x375) on a READ > + _nvme_enable_err_inject "$1" 0 100 1 0x375 1 > + > + dd if=/dev/"$1" of=/dev/null bs=512 count=1 iflag=direct \ > + 2> /dev/null 1>&2 > + > + _nvme_clear_err_inject "$1" > + > + if ${nvme_verbose_errors}; then > + dmesg -t | tail -2 | grep "Unknown (" | \ > + sed 's/nvme.*://g' > + else > + dmesg -t | tail -2 | grep "Cmd(" | sed 's/I\/O Cmd/Read/g' | \ > + sed 's/I\/O Error/Unknown/g' | \ > + sed 's/nvme.*://g' > + fi > +} > + > +inject_write_fault_write() > +{ > + # Inject a 'Write Fault' 0x280 status error on a WRITE > + _nvme_enable_err_inject "$1" 0 100 1 0x280 1 > + > + dd if=/dev/zero of=/dev/"$1" bs=512 count=1 oflag=direct \ > + 2> /dev/null 1>&2 > + > + _nvme_clear_err_inject "$1" > + > + if ${nvme_verbose_errors}; then > + dmesg -t | tail -2 | grep "Write Fault (" | \ > + sed 's/nvme.*://g' > + else > + dmesg -t | tail -2 | grep "Cmd(" | sed 's/I\/O Cmd/Write/g' | \ > + sed 's/I\/O Error/Write Fault/g' | \ > + sed 's/nvme.*://g' > + fi > +} > + > +inject_access_denied_identify() > +{ > + # Inject a 'Access Denied' (0x286) status error on an > + # Identify admin command > + _nvme_enable_err_inject "$1" 0 100 1 0x286 1 > + > + nvme admin-passthru /dev/"$1" --opcode=0x06 --data-len=4096 \ > + --cdw10=1 -r 2> /dev/null 1>&2 > + > + _nvme_clear_err_inject "$1" > + > + if ${nvme_verbose_errors}; then > + dmesg -t | tail -1 | grep "Access Denied (" | \ > + sed 's/nvme.*://g' > + else > + dmesg -t | tail -1 | grep "Admin Cmd(" | \ > + sed 's/Admin Cmd/Identify/g' | \ > + sed 's/I\/O Error/Access Denied/g' | \ > + sed 's/nvme.*://g' > + fi > +} > + > +inject_invalid_cmd_admin() > +{ > + # Inject a 'Invalid Command Opcode' (0x1) on an invalid command (0x96) > + _nvme_enable_err_inject "$1" 0 100 1 0x1 1 > + > + nvme admin-passthru /dev/"$1" --opcode=0x96 --data-len=4096 \ > + --cdw10=1 -r 2> /dev/null 1>&2 > + > + _nvme_clear_err_inject "$1" > + > + if ${nvme_verbose_errors}; then > + dmesg -t | tail -1 | grep "Invalid Command Opcode (" | \ > + sed 's/nvme.*://g' > + else > + dmesg -t | tail -1 | grep "Admin Cmd(" | \ > + sed 's/Admin Cmd/Unknown/g' | \ > + sed 's/I\/O Error/Invalid Command Opcode/g' | \ > + sed 's/nvme.*://g' > + fi > +} > + > +test_device() { > + local nvme_verbose_errors > + local ns_dev > + local ctrl_dev > + > + echo "Running ${TEST_NAME}" > + > + if _have_kernel_option NVME_VERBOSE_ERRORS; then > + nvme_verbose_errors=true > + else > + unset SKIP_REASON > + nvme_verbose_errors=false > + fi > + > + ns_dev=${TEST_DEV##*/} > + ctrl_dev=${ns_dev%n*} > + > + _nvme_err_inject_setup "${ns_dev}" "${ctrl_dev}" > + > + inject_unrec_read_read "${ns_dev}" > + inject_invalid_status_read "${ns_dev}" > + inject_write_fault_write "${ns_dev}" > + > + inject_access_denied_identify "${ctrl_dev}" > + inject_invalid_cmd_admin "${ctrl_dev}" > + > + _nvme_err_inject_cleanup "${ns_dev}" "${ctrl_dev}" > + > + echo "Test complete" > +} > diff --git a/tests/nvme/039.out b/tests/nvme/039.out > new file mode 100644 > index 000000000000..162935eb1d7b > --- /dev/null > +++ b/tests/nvme/039.out > @@ -0,0 +1,7 @@ > +Running nvme/039 > + Read(0x2) @ LBA 0, 1 blocks, Unrecovered Read Error (sct 0x2 / sc 0x81) DNR > + Read(0x2) @ LBA 0, 1 blocks, Unknown (sct 0x3 / sc 0x75) DNR > + Write(0x1) @ LBA 0, 1 blocks, Write Fault (sct 0x2 / sc 0x80) DNR > + Identify(0x6), Access Denied (sct 0x2 / sc 0x86) DNR > + Unknown(0x96), Invalid Command Opcode (sct 0x0 / sc 0x1) DNR > +Test complete > -- > 2.27.0 > -- Best Regards, Shin'ichiro Kawasaki ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-05-16 1:18 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-05-13 15:52 blktests v3 tests/nvme: add tests for error logging Alan Adamson 2022-05-13 15:52 ` [PATCH v3 blktests 1/2] tests/nvme: add helper routines to use error injector Alan Adamson 2022-05-16 1:10 ` Shinichiro Kawasaki 2022-05-13 15:52 ` [PATCH v3 blktests 2/2] tests/nvme: add tests for error logging Alan Adamson 2022-05-16 1:18 ` Shinichiro Kawasaki
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.