diff mbox series

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

Message ID 20220207152109.197566-6-broonie@kernel.org (mailing list archive)
State Accepted
Commit 32de73e89099c3f243032a733d3a64d417327a70
Headers show
Series arm64/sme: Initial support for the Scalable Matrix Extension | expand

Commit Message

Mark Brown Feb. 7, 2022, 3:20 p.m. UTC
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@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(-)

Comments

Shuah Khan Feb. 7, 2022, 11:54 p.m. UTC | #1
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@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@linuxfoundation.org>

thanks,
-- Shuah
Mark Brown Feb. 8, 2022, 3:32 p.m. UTC | #2
On Mon, Feb 07, 2022 at 04:54:31PM -0700, Shuah Khan wrote:

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

Yes.
Catalin Marinas Feb. 10, 2022, 3:08 p.m. UTC | #3
On Mon, Feb 07, 2022 at 03:20:34PM +0000, 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@kernel.org>

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
diff mbox series

Patch

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;
 }