cxl-cli commands were recently added for poison inject and clear operations by memdev. Replace the writes to sysfs with the new commands in the cxl-poison unit test.
All cxl-test memdevs are created as poison_injectable, so just confirm that the new poison_injectable field is indeed 'true'. Continue to use the sysfs writes for inject and clear poison by region offset until that support arrives in cxl-cli. Signed-off-by: Alison Schofield <[email protected]> --- Change in v3: Use new field 'poison_injectable' in memdev selection (BenC) Update commit log to include poison_injectable check. Change in v2: Use final format of new cxl-cli cmds: inject-media-poison and clear-media-poison test/cxl-poison.sh | 82 +++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/test/cxl-poison.sh b/test/cxl-poison.sh index 58cf132b613b..bbd147c85a77 100644 --- a/test/cxl-poison.sh +++ b/test/cxl-poison.sh @@ -20,7 +20,8 @@ find_memdev() { readarray -t capable_mems < <("$CXL" list -b "$CXL_TEST_BUS" -M | jq -r ".[] | select(.pmem_size != null) | - select(.ram_size != null) | .memdev") + select(.ram_size != null) | + select(.poison_injectable == true) | .memdev") if [ ${#capable_mems[@]} == 0 ]; then echo "no memdevs found for test" @@ -41,32 +42,37 @@ find_auto_region() echo "$region" } -# When cxl-cli support for inject and clear arrives, replace -# the writes to /sys/kernel/debug with the new cxl commands. - -_do_poison_sysfs() +_do_poison() { local action="$1" dev="$2" addr="$3" local expect_fail=${4:-false} - if "$expect_fail"; then - if echo "$addr" > "/sys/kernel/debug/cxl/$dev/${action}_poison"; then - echo "Expected ${action}_poison to fail for $addr" - err "$LINENO" - fi - else - echo "$addr" > "/sys/kernel/debug/cxl/$dev/${action}_poison" + # Regions use sysfs, memdevs use cxl-cli commands + if [[ "$dev" =~ ^region ]]; then + local sysfs_path="/sys/kernel/debug/cxl/$dev/${action}_poison" + "$expect_fail" && echo "$addr" > "$sysfs_path" && err "$LINENO" + "$expect_fail" || echo "$addr" > "$sysfs_path" + return fi + + case "$action" in + inject) local cmd=("$CXL" inject-media-poison "$dev" -a "$addr") ;; + clear) local cmd=("$CXL" clear-media-poison "$dev" -a "$addr") ;; + *) err "$LINENO" ;; + esac + + "$expect_fail" && "${cmd[@]}" && err "$LINENO" + "$expect_fail" || "${cmd[@]}" } -inject_poison_sysfs() +inject_poison() { - _do_poison_sysfs 'inject' "$@" + _do_poison 'inject' "$@" } -clear_poison_sysfs() +clear_poison() { - _do_poison_sysfs 'clear' "$@" + _do_poison 'clear' "$@" } check_trace_entry() @@ -121,27 +127,27 @@ validate_poison_found() test_poison_by_memdev_by_dpa() { find_memdev - inject_poison_sysfs "$memdev" "0x40000000" - inject_poison_sysfs "$memdev" "0x40001000" - inject_poison_sysfs "$memdev" "0x600" - inject_poison_sysfs "$memdev" "0x0" + inject_poison "$memdev" "0x40000000" + inject_poison "$memdev" "0x40001000" + inject_poison "$memdev" "0x600" + inject_poison "$memdev" "0x0" validate_poison_found "-m $memdev" 4 - clear_poison_sysfs "$memdev" "0x40000000" - clear_poison_sysfs "$memdev" "0x40001000" - clear_poison_sysfs "$memdev" "0x600" - clear_poison_sysfs "$memdev" "0x0" + clear_poison "$memdev" "0x40000000" + clear_poison "$memdev" "0x40001000" + clear_poison "$memdev" "0x600" + clear_poison "$memdev" "0x0" validate_poison_found "-m $memdev" 0 } test_poison_by_region_by_dpa() { - inject_poison_sysfs "$mem0" "0" - inject_poison_sysfs "$mem1" "0" + inject_poison "$mem0" "0" + inject_poison "$mem1" "0" validate_poison_found "-r $region" 2 - clear_poison_sysfs "$mem0" "0" - clear_poison_sysfs "$mem1" "0" + clear_poison "$mem0" "0" + clear_poison "$mem1" "0" validate_poison_found "-r $region" 0 } @@ -168,15 +174,15 @@ test_poison_by_region_offset() # Inject at the offset and check result using the hpa # ABI takes an offset, but recall the hpa to check trace event - inject_poison_sysfs "$region" "$cache_size" + inject_poison "$region" "$cache_size" check_trace_entry "$region" "$hpa1" - inject_poison_sysfs "$region" "$((gran + cache_size))" + inject_poison "$region" "$((gran + cache_size))" check_trace_entry "$region" "$hpa2" validate_poison_found "-r $region" 2 - clear_poison_sysfs "$region" "$cache_size" + clear_poison "$region" "$cache_size" check_trace_entry "$region" "$hpa1" - clear_poison_sysfs "$region" "$((gran + cache_size))" + clear_poison "$region" "$((gran + cache_size))" check_trace_entry "$region" "$hpa2" validate_poison_found "-r $region" 0 } @@ -196,21 +202,21 @@ test_poison_by_region_offset_negative() if [[ $cache_size -gt 0 ]]; then cache_offset=$((cache_size - 1)) echo "Testing offset within cache: $cache_offset (cache_size: $cache_size)" - inject_poison_sysfs "$region" "$cache_offset" true - clear_poison_sysfs "$region" "$cache_offset" true + inject_poison "$region" "$cache_offset" true + clear_poison "$region" "$cache_offset" true else echo "Skipping cache test - cache_size is 0" fi # Offset exceeds region size exceed_offset=$((region_size)) - inject_poison_sysfs "$region" "$exceed_offset" true - clear_poison_sysfs "$region" "$exceed_offset" true + inject_poison "$region" "$exceed_offset" true + clear_poison "$region" "$exceed_offset" true # Offset exceeds region size by a lot large_offset=$((region_size * 2)) - inject_poison_sysfs "$region" "$large_offset" true - clear_poison_sysfs "$region" "$large_offset" true + inject_poison "$region" "$large_offset" true + clear_poison "$region" "$large_offset" true } is_unaligned() { -- 2.37.3
