kselftest/arm64: mte: user_mem: rework error handling
authorJoey Gouly <joey.gouly@arm.com>
Wed, 9 Feb 2022 15:22:36 +0000 (15:22 +0000)
committerWill Deacon <will@kernel.org>
Tue, 15 Feb 2022 16:57:50 +0000 (16:57 +0000)
Future commits will have multiple iterations of tests in this function,
so make the error handling assume it will pass and then bail out if there
is an error.

Signed-off-by: Joey Gouly <joey.gouly@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Reviewed-by: Mark Brown <broonie@kernel.org>
Tested-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20220209152240.52788-3-joey.gouly@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
tools/testing/selftests/arm64/mte/check_user_mem.c

index 5a5a7e1..2afcc9f 100644 (file)
@@ -27,7 +27,7 @@ static int check_usermem_access_fault(int mem_type, int mode, int mapping,
        size_t len, read_len;
        void *ptr, *ptr_next;
 
-       err = KSFT_FAIL;
+       err = KSFT_PASS;
        len = 2 * page_sz;
        mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
        fd = create_temp_file();
@@ -71,14 +71,22 @@ static int check_usermem_access_fault(int mem_type, int mode, int mapping,
         * mode without fault but may not fail in async mode as per the
         * implemented MTE userspace support in Arm64 kernel.
         */
-       if (mode == MTE_SYNC_ERR &&
-           !cur_mte_cxt.fault_valid && read_len < len) {
-               err = KSFT_PASS;
-       } else if (mode == MTE_ASYNC_ERR &&
-                  !cur_mte_cxt.fault_valid && read_len == len) {
-               err = KSFT_PASS;
+       if (cur_mte_cxt.fault_valid)
+               goto usermem_acc_err;
+
+       if (mode == MTE_SYNC_ERR && read_len < len) {
+               /* test passed */
+       } else if (mode == MTE_ASYNC_ERR && read_len == len) {
+               /* test passed */
+       } else {
+               goto usermem_acc_err;
        }
+
+       goto exit;
+
 usermem_acc_err:
+       err = KSFT_FAIL;
+exit:
        mte_free_memory((void *)ptr, len, mem_type, true);
        close(fd);
        return err;