On 1/7/26 10:25 PM, Alison Schofield wrote:
> Add a test case to validate that all switch port decoders sharing
> downstream ports, dports, have target lists properly enumerated.
> 
> This test catches the regression fixed by a recent kernel patch[1]
> where only one decoder per switch port has targets populated while
> others have nr_targets=0, even when dports are available.
> 
> This test is based on the current cxl_test topology which provides
> multiple switch ports with 8 decoders each. Like other testcases in
> cxl-topology.sh, if the cxl_test topology changes (number of switches,
> decoders per port, or hierarchy), this test will need corresponding
> updates.
> 
> This new case is quietly skipped with kernel version 6.18 where it
> is known broken.
> 
> [1] 
> https://lore.kernel.org/linux-cxl/[email protected]/
> 
> Signed-off-by: Alison Schofield <[email protected]>
> ---
> 
>  test/common          | 12 +++++++++++
>  test/cxl-topology.sh | 51 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 63 insertions(+)
> 
> diff --git a/test/common b/test/common
> index 2d076402ef7c..2eb11b7396d0 100644
> --- a/test/common
> +++ b/test/common
> @@ -101,6 +101,18 @@ check_min_kver()
>       [[ "$ver" == "$(echo -e "$ver\n$KVER" | sort -V | head -1)" ]]
>  }
>  
> +# check_eq_kver
> +# $1: Kernel version to match. format: X.Y
> +#
> +check_eq_kver()
> +{
> +        local ver="$1"
> +        : "${KVER:=$(uname -r)}"
> +
> +        [ -n "$ver" ] || return 1
> +        [[ "$KVER" == "$ver"* ]]
> +}
> +
>  # do_skip
>  # $1: Skip message
>  #
> diff --git a/test/cxl-topology.sh b/test/cxl-topology.sh
> index b68cb8b262b6..d9475b1bae9c 100644
> --- a/test/cxl-topology.sh
> +++ b/test/cxl-topology.sh
> @@ -151,6 +151,57 @@ count=$(jq "map(select(.pmem_size == $pmem_size)) | 
> length" <<< $json)
>  ((bridges == 2 && count == 8 || bridges == 3 && count == 10 ||
>    bridges == 4 && count == 11)) || err "$LINENO"
>  
> +# Test that switch port decoders have complete target list enumeration
> +# Validates a fix for multiple decoders sharing the same dport.
> +# Based on the cxl_test topology expectation of switch ports at depth 2
> +# with 8 decoders each. Adjust if that expectation changes.
> +test_switch_decoder_target_enumeration() {
> +
> +     # Get verbose output to see targets arrays
> +     json=$($CXL list -b cxl_test -vvv)
> +
> +     switch_port_issues=$(jq '
> +     # Find all switch ports (depth 2)
> +     [.. | objects | select(.depth == 2 and has("decoders:" + .port))] |
> +
> +     # For each switch port, analyze its decoder target pattern
> +     map({
> +             port: .port,
> +             nr_dports: .nr_dports,
> +
> +             # Count non-endpoint decoders (no "mode" field)
> +             total: ([to_entries[] | select(.key | startswith("decoders:"))
> +                     | .value[] | select(has("mode") == false)] |
> +                     length),
> +
> +             # Count how many have targets
> +             with_targets: ([to_entries[] | select(.key |
> +                     startswith("decoders:")) | .value[] |
> +                     select(has("mode") == false and .nr_targets > 0)] |
> +                     length),
> +
> +             # Count how many explicitly have no targets
> +             without_targets: ([to_entries[] | select(.key |
> +                     startswith("decoders:")) | .value[] |
> +                     select(has("mode") == false and .nr_targets == 0)] |
> +                     length)
> +             }) |
> +
> +             # Filter for the expected pattern and count them
> +             map(select(.nr_dports > 0 and
> +                        .with_targets == 1 and
> +                        .without_targets >= 7)) |
> +                        length
> +     ' <<<"$json")
> +
> +     ((switch_port_issues == 0)) || {
> +             echo "Found $switch_port_issues switch ports with incomplete 
> target enumeration"
> +             echo "Only 1 decoder has targets while 7+ have nr_targets=0"
> +             err "$LINENO"
> +     }
> +}
> +# Skip the target enumeration test where known broken
> +check_eq_kver 6.18 || test_switch_decoder_target_enumeration

6.19 I believe?

DJ

>  
>  # check that switch ports disappear after all of their memdevs have been
>  # disabled, and return when the memdevs are enabled.


Reply via email to