* [ndctl PATCH v3] test/cxl-poison.sh: replace sysfs usage with cxl-cli cmds
@ 2026-02-18 19:11 Alison Schofield
2026-02-18 21:15 ` Dave Jiang
2026-02-19 17:30 ` Cheatham, Benjamin
0 siblings, 2 replies; 3+ messages in thread
From: Alison Schofield @ 2026-02-18 19:11 UTC (permalink / raw)
To: Ben Cheatham; +Cc: Alison Schofield, nvdimm, linux-cxl
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 <alison.schofield@intel.com>
---
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [ndctl PATCH v3] test/cxl-poison.sh: replace sysfs usage with cxl-cli cmds
2026-02-18 19:11 [ndctl PATCH v3] test/cxl-poison.sh: replace sysfs usage with cxl-cli cmds Alison Schofield
@ 2026-02-18 21:15 ` Dave Jiang
2026-02-19 17:30 ` Cheatham, Benjamin
1 sibling, 0 replies; 3+ messages in thread
From: Dave Jiang @ 2026-02-18 21:15 UTC (permalink / raw)
To: Alison Schofield, Ben Cheatham; +Cc: nvdimm, linux-cxl
On 2/18/26 12:11 PM, Alison Schofield wrote:
> 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 <alison.schofield@intel.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
> ---
>
> 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() {
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [ndctl PATCH v3] test/cxl-poison.sh: replace sysfs usage with cxl-cli cmds
2026-02-18 19:11 [ndctl PATCH v3] test/cxl-poison.sh: replace sysfs usage with cxl-cli cmds Alison Schofield
2026-02-18 21:15 ` Dave Jiang
@ 2026-02-19 17:30 ` Cheatham, Benjamin
1 sibling, 0 replies; 3+ messages in thread
From: Cheatham, Benjamin @ 2026-02-19 17:30 UTC (permalink / raw)
To: Alison Schofield; +Cc: nvdimm, linux-cxl
On 2/18/2026 1:11 PM, Alison Schofield wrote:
> 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 <alison.schofield@intel.com>
LGTM
Reviewed-by: Ben Cheatham <benjamin.cheatham@amd.com>
> ---
>
> 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() {
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-02-19 17:31 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-18 19:11 [ndctl PATCH v3] test/cxl-poison.sh: replace sysfs usage with cxl-cli cmds Alison Schofield
2026-02-18 21:15 ` Dave Jiang
2026-02-19 17:30 ` Cheatham, Benjamin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox