Several region setup paths repeat the same decoder and memdev lookups.

Factor them into shared helpers and centralize cxl_test reload and
memdev discovery. No functional change.

Assisted-by: LLM
Signed-off-by: Alison Schofield <[email protected]>
---
 test/cxl-create-region.sh | 99 +++++++++++++++++++--------------------
 1 file changed, 48 insertions(+), 51 deletions(-)

diff --git a/test/cxl-create-region.sh b/test/cxl-create-region.sh
index fcfcea0594bb..927edf4c17d4 100644
--- a/test/cxl-create-region.sh
+++ b/test/cxl-create-region.sh
@@ -12,8 +12,14 @@ trap 'err $LINENO' ERR
 
 check_prereq "jq"
 
-modprobe -r cxl_test
-modprobe cxl_test
+load_cxl_test()
+{
+       modprobe -r cxl_test
+       modprobe cxl_test "$@"
+       readarray -t mems < <("$CXL" list -b cxl_test -M | jq -r '.[].memdev')
+}
+
+load_cxl_test
 rc=1
 
 destroy_regions()
@@ -25,17 +31,27 @@ destroy_regions()
        fi
 }
 
+# List x1 root decoders for a memdev matching the jq predicate.
+find_x1_decoders()
+{
+       $CXL list -b cxl_test -D -d root -m "$1" |
+                 jq -r ".[] |
+                 select($2) |
+                 select(.nr_targets == 1) |
+                 .decoder"
+}
+
+# Pick the first pmem-capable x1 root decoder for a memdev.
+find_x1_decoder()
+{
+       find_x1_decoders "$1" ".pmem_capable == true" | head -n1
+}
+
 create_x1_region()
 {
        mem="$1"
 
-       # find a pmem capable root decoder for this mem
-       decoder=$($CXL list -b cxl_test -D -d root -m "$mem" |
-                 jq -r ".[] |
-                 select(.pmem_capable == true) |
-                 select(.nr_targets == 1) |
-                 .decoder")
-
+       decoder=$(find_x1_decoder "$mem")
        if [[ ! $decoder ]]; then
                echo "no suitable decoder found for $mem, skipping"
                return
@@ -69,13 +85,7 @@ create_subregions()
        slice=$((256 << 20))
        mem="$1"
 
-       # find a pmem capable root decoder for this mem
-       decoder=$($CXL list -b cxl_test -D -d root -m "$mem" |
-                 jq -r ".[] |
-                 select(.pmem_capable == true) |
-                 select(.nr_targets == 1) |
-                 .decoder")
-
+       decoder=$(find_x1_decoder "$mem")
        if [[ ! $decoder ]]; then
                echo "no suitable decoder found for $mem, skipping"
                return
@@ -133,6 +143,17 @@ create_single()
        destroy_regions "$region"
 }
 
+# Return memdev @index behind root target @position.
+find_memdev()
+{
+       local decoder="$1" position="$2" index="$3"
+       local port_dev
+
+       port_dev=$($CXL list -T -d "$decoder" | jq -r ".[] |
+               .targets | .[] | select(.position == $position) | .target")
+       $CXL list -M -p "$port_dev" | jq -r ".[$index].memdev"
+}
+
 create_and_destroy_region()
 {
        region=$($CXL create-region -d "$decoder" -m "$memdevs" |
@@ -154,10 +175,7 @@ setup_x1()
                select(.nr_targets == 1) |
                .decoder")
 
-       # Find a memdev for this host-bridge
-       port_dev0=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 0) | .target")
-       mem0=$($CXL list -M -p "$port_dev0" | jq -r ".[0].memdev")
+       mem0=$(find_memdev "$decoder" 0 0)
        memdevs="$mem0"
 }
 
@@ -169,13 +187,8 @@ setup_x2()
                select(.nr_targets == 2) |
                .decoder")
 
-       # Find a memdev for each host-bridge interleave position
-       port_dev0=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 0) | .target")
-       port_dev1=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 1) | .target")
-       mem0=$($CXL list -M -p "$port_dev0" | jq -r ".[0].memdev")
-       mem1=$($CXL list -M -p "$port_dev1" | jq -r ".[0].memdev")
+       mem0=$(find_memdev "$decoder" 0 0)
+       mem1=$(find_memdev "$decoder" 1 0)
        memdevs="$mem0 $mem1"
 }
 
@@ -187,15 +200,10 @@ setup_x4()
                select(.nr_targets == 2) |
                .decoder")
 
-       # Find a memdev for each host-bridge interleave position
-       port_dev0=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 0) | .target")
-       port_dev1=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 1) | .target")
-       mem0=$($CXL list -M -p "$port_dev0" | jq -r ".[0].memdev")
-       mem1=$($CXL list -M -p "$port_dev1" | jq -r ".[0].memdev")
-       mem2=$($CXL list -M -p "$port_dev0" | jq -r ".[1].memdev")
-       mem3=$($CXL list -M -p "$port_dev1" | jq -r ".[1].memdev")
+       mem0=$(find_memdev "$decoder" 0 0)
+       mem1=$(find_memdev "$decoder" 1 0)
+       mem2=$(find_memdev "$decoder" 0 1)
+       mem3=$(find_memdev "$decoder" 1 1)
        memdevs="$mem0 $mem1 $mem2 $mem3"
 }
 
@@ -212,25 +220,15 @@ setup_x3()
                return
        fi
 
-       # Find a memdev for each host-bridge interleave position
-       port_dev0=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 0) | .target")
-       port_dev1=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 1) | .target")
-       port_dev2=$($CXL list -T -d "$decoder" | jq -r ".[] |
-               .targets | .[] | select(.position == 2) | .target")
-       mem0=$($CXL list -M -p "$port_dev0" | jq -r ".[0].memdev")
-       mem1=$($CXL list -M -p "$port_dev1" | jq -r ".[0].memdev")
-       mem2=$($CXL list -M -p "$port_dev2" | jq -r ".[0].memdev")
+       mem0=$(find_memdev "$decoder" 0 0)
+       mem1=$(find_memdev "$decoder" 1 0)
+       mem2=$(find_memdev "$decoder" 2 0)
        memdevs="$mem0 $mem1 $mem2"
 }
 
 # test region creation on devices behind a single-port host-bridge
 create_single
 
-# test reading labels directly through cxl-cli
-readarray -t mems < <("$CXL" list -b cxl_test -M | jq -r '.[].memdev')
-
 for mem in ${mems[@]}; do
        create_x1_region "$mem"
 done
@@ -242,8 +240,7 @@ for mem in ${mems[@]}; do
 done
 
 # Repeat x1/x2/x3/x4 region creation with XOR interleave arithmetic.
-modprobe -r cxl_test
-modprobe cxl_test interleave_arithmetic=1
+load_cxl_test interleave_arithmetic=1
 
 setup_x1
 create_and_destroy_region
-- 
2.37.3


Reply via email to