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
