The destroy-region test assumed a free decoder was available and
silently skipped execution when none could be found. When cxl_test
began creating an auto region on module load, it consumed the decoder
resource the test relied on, leading to false passes all the time.
This was recently noticed during review of test logs.

Clear all regions at test start to reclaim decoder resources. Fail
the test if no usable decoder is found and select the first match when
multiple decoders satisfy the query.

Signed-off-by: Alison Schofield <[email protected]>
---
 test/cxl-destroy-region.sh | 37 +++++++++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 6 deletions(-)

diff --git a/test/cxl-destroy-region.sh b/test/cxl-destroy-region.sh
index 3952060cf3e2..f03aa67e8b0d 100644
--- a/test/cxl-destroy-region.sh
+++ b/test/cxl-destroy-region.sh
@@ -16,6 +16,22 @@ modprobe -r cxl_test
 modprobe cxl_test
 rc=1
 
+assert_no_regions()
+{
+       regions_json="$("$CXL" list -b "$CXL_TEST_BUS" -Ri)"
+       [[ -n "$regions_json" ]] || err "$LINENO"
+       [[ "$(jq 'length' <<<"$regions_json")" -eq 0 ]] || err "$LINENO"
+}
+
+destroy_regions()
+{
+       if [[ "$*" ]]; then
+               "$CXL" destroy-region -f -b "$CXL_TEST_BUS" "$@"
+       else
+               "$CXL" destroy-region -f -b "$CXL_TEST_BUS" all
+       fi
+}
+
 check_destroy_ram()
 {
        mem=$1
@@ -51,8 +67,15 @@ check_destroy_devdax()
        "$CXL" destroy-region "$region"
 }
 
+# Get clean slate, including auto region resources
+destroy_regions
+assert_no_regions
+
 # Find a memory device to create regions on to test the destroy
 readarray -t mems < <("$CXL" list -b "$CXL_TEST_BUS" -M | jq -r '.[].memdev')
+[[ ${#mems[@]} -eq 0 ]] && err "$LINENO"
+
+found=0
 for mem in "${mems[@]}"; do
         ramsize="$("$CXL" list -m "$mem" | jq -r '.[].ram_size')"
         if [[ $ramsize == "null" || ! $ramsize ]]; then
@@ -63,13 +86,15 @@ for mem in "${mems[@]}"; do
                   select(.volatile_capable == true) |
                   select(.nr_targets == 1) |
                   select(.max_available_extent >= ${ramsize}) |
-                  .decoder")"
-        if [[ $decoder ]]; then
-               check_destroy_ram "$mem" "$decoder"
-               check_destroy_devdax "$mem" "$decoder"
-                break
-        fi
+                  .decoder" | head -n1)"
+       [[ -z $decoder || $decoder == "null" ]] && continue
+
+       check_destroy_ram "$mem" "$decoder"
+       check_destroy_devdax "$mem" "$decoder"
+       found=1
+       break
 done
+[[ $found -eq 1 ]] || err "$LINENO"
 
 check_dmesg "$LINENO"
 
-- 
2.37.3


Reply via email to