On Tue, Apr 13, 2021 at 06:59:36PM +1000, Stephen Rothwell wrote: > diff --cc lib/test_kasan.c > index 785e724ce0d8,bf9225002a7e..000000000000 > --- a/lib/test_kasan.c > +++ b/lib/test_kasan.c > @@@ -78,33 -83,30 +83,35 @@@ static void kasan_test_exit(struct kuni > * fields, it can reorder or optimize away the accesses to those fields. > * Use READ/WRITE_ONCE() for the accesses and compiler barriers around the > * expression to prevent that. > + * > + * In between KUNIT_EXPECT_KASAN_FAIL checks, fail_data.report_found is kept as > + * false. This allows detecting KASAN reports that happen outside of the checks > + * by asserting !fail_data.report_found at the start of KUNIT_EXPECT_KASAN_FAIL > + * and in kasan_test_exit. > */ > - #define KUNIT_EXPECT_KASAN_FAIL(test, expression) do { \ > - if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) && \ > - !kasan_async_mode_enabled()) \ > - migrate_disable(); \ > - WRITE_ONCE(fail_data.report_expected, true); \ > - WRITE_ONCE(fail_data.report_found, false); \ > - kunit_add_named_resource(test, \ > - NULL, \ > - NULL, \ > - &resource, \ > - "kasan_data", &fail_data); \ > - barrier(); \ > - expression; \ > - barrier(); \ > - if (kasan_async_mode_enabled()) \ > - kasan_force_async_fault(); \ > - barrier(); \ > - KUNIT_EXPECT_EQ(test, \ > - READ_ONCE(fail_data.report_expected), \ > - READ_ONCE(fail_data.report_found)); \ > - if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) && \ > - !kasan_async_mode_enabled()) { \ > - if (READ_ONCE(fail_data.report_found)) \ > - kasan_enable_tagging_sync(); \ > - migrate_enable(); \ > - } \ > + #define KUNIT_EXPECT_KASAN_FAIL(test, expression) do { \ > - if (IS_ENABLED(CONFIG_KASAN_HW_TAGS)) \ > ++ if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) && \ > ++ !kasan_async_mode_enabled()) \ > + migrate_disable(); \ > + KUNIT_EXPECT_FALSE(test, READ_ONCE(fail_data.report_found)); \ > + WRITE_ONCE(fail_data.report_expected, true); \ > + barrier(); \ > + expression; \ > + barrier(); \ > ++ if (kasan_async_mode_enabled()) \ > ++ kasan_force_async_fault(); \ > ++ barrier(); \ > + KUNIT_EXPECT_EQ(test, \ > + READ_ONCE(fail_data.report_expected), \ > + READ_ONCE(fail_data.report_found)); \ > - if (IS_ENABLED(CONFIG_KASAN_HW_TAGS)) { \ > ++ if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) && \ > ++ !kasan_async_mode_enabled()) { \ > + if (READ_ONCE(fail_data.report_found)) \ > - kasan_enable_tagging(); \ > ++ kasan_enable_tagging_sync(); \ > + migrate_enable(); \ > + } \ > + WRITE_ONCE(fail_data.report_found, false); \ > + WRITE_ONCE(fail_data.report_expected, false); \ > } while (0) > > #define KASAN_TEST_NEEDS_CONFIG_ON(test, config) do { \ Thanks Stephen. The resolution looks correct. Andrew, if you'd rather I dropped the MTE async mode support from the arm64 tree please let me know. Thanks. https://lore.kernel.org/r/20210315132019.33202-1-vincenzo.frascino@xxxxxxx/ -- Catalin