| From b1652cf4e92cecdea8454973febf5d2fe6e1373c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 12 Sep 2018 17:31:05 -0300 |
| Subject: selftests/powerpc: Do not fail with reschedule |
| |
| From: Breno Leitao <leitao@debian.org> |
| |
| [ Upstream commit 44d947eff19d64384efc06069509db7a0a1103b0 ] |
| |
| There are cases where the test is not expecting to have the transaction |
| aborted, but, the test process might have been rescheduled, either in the |
| OS level or by KVM (if it is running on a KVM guest machine). The process |
| reschedule will cause a treclaim/recheckpoint which will cause the |
| transaction to doom, aborting the transaction as soon as the process is |
| rescheduled back to the CPU. This might cause the test to fail, but this is |
| not a failure in essence. |
| |
| If that is the case, TEXASR[FC] is indicated with either |
| TM_CAUSE_RESCHEDULE or TM_CAUSE_KVM_RESCHEDULE for KVM interruptions. |
| |
| In this scenario, ignore these two failures and avoid the whole test to |
| return failure. |
| |
| Signed-off-by: Breno Leitao <leitao@debian.org> |
| Reviewed-by: Gustavo Romero <gromero@linux.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/testing/selftests/powerpc/tm/tm-unavailable.c | 9 ++++++--- |
| tools/testing/selftests/powerpc/tm/tm.h | 9 +++++++++ |
| 2 files changed, 15 insertions(+), 3 deletions(-) |
| |
| diff --git a/tools/testing/selftests/powerpc/tm/tm-unavailable.c b/tools/testing/selftests/powerpc/tm/tm-unavailable.c |
| index 156c8e750259b..09894f4ff62e6 100644 |
| --- a/tools/testing/selftests/powerpc/tm/tm-unavailable.c |
| +++ b/tools/testing/selftests/powerpc/tm/tm-unavailable.c |
| @@ -236,7 +236,8 @@ void *tm_una_ping(void *input) |
| } |
| |
| /* Check if we were not expecting a failure and a it occurred. */ |
| - if (!expecting_failure() && is_failure(cr_)) { |
| + if (!expecting_failure() && is_failure(cr_) && |
| + !failure_is_reschedule()) { |
| printf("\n\tUnexpected transaction failure 0x%02lx\n\t", |
| failure_code()); |
| return (void *) -1; |
| @@ -244,9 +245,11 @@ void *tm_una_ping(void *input) |
| |
| /* |
| * Check if TM failed due to the cause we were expecting. 0xda is a |
| - * TM_CAUSE_FAC_UNAV cause, otherwise it's an unexpected cause. |
| + * TM_CAUSE_FAC_UNAV cause, otherwise it's an unexpected cause, unless |
| + * it was caused by a reschedule. |
| */ |
| - if (is_failure(cr_) && !failure_is_unavailable()) { |
| + if (is_failure(cr_) && !failure_is_unavailable() && |
| + !failure_is_reschedule()) { |
| printf("\n\tUnexpected failure cause 0x%02lx\n\t", |
| failure_code()); |
| return (void *) -1; |
| diff --git a/tools/testing/selftests/powerpc/tm/tm.h b/tools/testing/selftests/powerpc/tm/tm.h |
| index df4204247d45c..5518b1d4ef8b2 100644 |
| --- a/tools/testing/selftests/powerpc/tm/tm.h |
| +++ b/tools/testing/selftests/powerpc/tm/tm.h |
| @@ -52,6 +52,15 @@ static inline bool failure_is_unavailable(void) |
| return (failure_code() & TM_CAUSE_FAC_UNAV) == TM_CAUSE_FAC_UNAV; |
| } |
| |
| +static inline bool failure_is_reschedule(void) |
| +{ |
| + if ((failure_code() & TM_CAUSE_RESCHED) == TM_CAUSE_RESCHED || |
| + (failure_code() & TM_CAUSE_KVM_RESCHED) == TM_CAUSE_KVM_RESCHED) |
| + return true; |
| + |
| + return false; |
| +} |
| + |
| static inline bool failure_is_nesting(void) |
| { |
| return (__builtin_get_texasru() & 0x400000); |
| -- |
| 2.20.1 |
| |