[PATCH v11 05/40] kselftest/arm64: signal: Allow tests to be incompatible with features

Shuah Khan skhan at linuxfoundation.org
Mon Feb 7 15:54:31 PST 2022


On 2/7/22 8:20 AM, Mark Brown wrote:
> Some features may invalidate some tests, for example by supporting an
> operation which would trap otherwise. Allow tests to list features that
> they are incompatible with so we can cover the case where a signal will
> be generated without disruption on systems where that won't happen.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>   .../selftests/arm64/signal/test_signals.h     |  1 +
>   .../arm64/signal/test_signals_utils.c         | 34 ++++++++++++++-----
>   .../arm64/signal/test_signals_utils.h         |  2 ++
>   3 files changed, 28 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h
> index ebe8694dbef0..f909b70d9e98 100644
> --- a/tools/testing/selftests/arm64/signal/test_signals.h
> +++ b/tools/testing/selftests/arm64/signal/test_signals.h
> @@ -53,6 +53,7 @@ struct tdescr {
>   	char			*name;
>   	char			*descr;
>   	unsigned long		feats_required;
> +	unsigned long		feats_incompatible;
>   	/* bitmask of effectively supported feats: populated at run-time */
>   	unsigned long		feats_supported;
>   	bool			initialized;
> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c
> index 2f8c23af3b5e..5743897984b0 100644
> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.c
> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c
> @@ -36,6 +36,8 @@ static inline char *feats_to_string(unsigned long feats)
>   {
>   	size_t flen = MAX_FEATS_SZ - 1;
>   
> +	feats_string[0] = '\0';
> +
>   	for (int i = 0; i < FMAX_END; i++) {
>   		if (feats & (1UL << i)) {
>   			size_t tlen = strlen(feats_names[i]);
> @@ -256,7 +258,7 @@ int test_init(struct tdescr *td)
>   		td->minsigstksz = MINSIGSTKSZ;
>   	fprintf(stderr, "Detected MINSTKSIGSZ:%d\n", td->minsigstksz);
>   
> -	if (td->feats_required) {
> +	if (td->feats_required || td->feats_incompatible) {
>   		td->feats_supported = 0;
>   		/*
>   		 * Checking for CPU required features using both the
> @@ -267,15 +269,29 @@ int test_init(struct tdescr *td)
>   		if (getauxval(AT_HWCAP) & HWCAP_SVE)
>   			td->feats_supported |= FEAT_SVE;
>   		if (feats_ok(td)) {
> -			fprintf(stderr,
> -				"Required Features: [%s] supported\n",
> -				feats_to_string(td->feats_required &
> -						td->feats_supported));
> +			if (td->feats_required & td->feats_supported)
> +				fprintf(stderr,
> +					"Required Features: [%s] supported\n",
> +					feats_to_string(td->feats_required &
> +							td->feats_supported));
> +			if (!(td->feats_incompatible & td->feats_supported))
> +				fprintf(stderr,
> +					"Incompatible Features: [%s] absent\n",
> +					feats_to_string(td->feats_incompatible));
>   		} else {
> -			fprintf(stderr,
> -				"Required Features: [%s] NOT supported\n",
> -				feats_to_string(td->feats_required &
> -						~td->feats_supported));
> +			if ((td->feats_required & td->feats_supported) !=
> +			    td->feats_supported)
> +				fprintf(stderr,
> +					"Required Features: [%s] NOT supported\n",
> +					feats_to_string(td->feats_required &
> +							~td->feats_supported));
> +			if (td->feats_incompatible & td->feats_supported)
> +				fprintf(stderr,
> +					"Incompatible Features: [%s] supported\n",
> +					feats_to_string(td->feats_incompatible &
> +							~td->feats_supported));
> +
> +
>   			td->result = KSFT_SKIP;
>   			return 0;
>   		}
> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h
> index 6772b5c8d274..f3aa99ba67bb 100644
> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.h
> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h
> @@ -18,6 +18,8 @@ void test_result(struct tdescr *td);
>   
>   static inline bool feats_ok(struct tdescr *td)
>   {
> +	if (td->feats_incompatible & td->feats_supported)
> +		return false;
>   	return (td->feats_required & td->feats_supported) == td->feats_required;
>   }
>   
> 

Assuming default_handler() will skip test and return skip test when
feature is unsupported?

Looks good to me.

Reviewed-by: Shuah Khan <skhan at linuxfoundation.org>

thanks,
-- Shuah



More information about the linux-arm-kernel mailing list