mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
Revert "arm64: kasan: Revert "arm64: mte: reset the page tag in page->flags""
This reverts commit add4bc9281.
On Mon, Sep 12, 2022 at 10:52:45AM +0100, Catalin Marinas wrote:
>I missed this (holidays) and it looks like it's in stable already. On
>its own it will likely break kasan_hw if used together with user-space
>MTE as this change relies on two previous commits:
>
>70c248aca9e7 ("mm: kasan: Skip unpoisoning of user pages")
>6d05141a3930 ("mm: kasan: Skip page unpoisoning only if __GFP_SKIP_KASAN_UNPOISON")
>
>The reason I did not cc stable is that there are other dependencies in
>this area. The potential issues without the above commits were rather
>theoretical, so take these patches rather as clean-ups/refactoring than
>fixes.
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7aa57d869e
commit
a8a007c5b1
@@ -326,6 +326,11 @@ static void swsusp_mte_restore_tags(void)
|
|||||||
unsigned long pfn = xa_state.xa_index;
|
unsigned long pfn = xa_state.xa_index;
|
||||||
struct page *page = pfn_to_online_page(pfn);
|
struct page *page = pfn_to_online_page(pfn);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It is not required to invoke page_kasan_tag_reset(page)
|
||||||
|
* at this point since the tags stored in page->flags are
|
||||||
|
* already restored.
|
||||||
|
*/
|
||||||
mte_restore_page_tags(page_address(page), tags);
|
mte_restore_page_tags(page_address(page), tags);
|
||||||
|
|
||||||
mte_free_tag_storage(tags);
|
mte_free_tag_storage(tags);
|
||||||
|
|||||||
@@ -44,6 +44,15 @@ static void mte_sync_page_tags(struct page *page, pte_t old_pte,
|
|||||||
if (!pte_is_tagged)
|
if (!pte_is_tagged)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
page_kasan_tag_reset(page);
|
||||||
|
/*
|
||||||
|
* We need smp_wmb() in between setting the flags and clearing the
|
||||||
|
* tags because if another thread reads page->flags and builds a
|
||||||
|
* tagged address out of it, there is an actual dependency to the
|
||||||
|
* memory access, but on the current thread we do not guarantee that
|
||||||
|
* the new page->flags are visible before the tags were updated.
|
||||||
|
*/
|
||||||
|
smp_wmb();
|
||||||
mte_clear_page_tags(page_address(page));
|
mte_clear_page_tags(page_address(page));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,15 @@ void copy_highpage(struct page *to, struct page *from)
|
|||||||
|
|
||||||
if (system_supports_mte() && test_bit(PG_mte_tagged, &from->flags)) {
|
if (system_supports_mte() && test_bit(PG_mte_tagged, &from->flags)) {
|
||||||
set_bit(PG_mte_tagged, &to->flags);
|
set_bit(PG_mte_tagged, &to->flags);
|
||||||
|
page_kasan_tag_reset(to);
|
||||||
|
/*
|
||||||
|
* We need smp_wmb() in between setting the flags and clearing the
|
||||||
|
* tags because if another thread reads page->flags and builds a
|
||||||
|
* tagged address out of it, there is an actual dependency to the
|
||||||
|
* memory access, but on the current thread we do not guarantee that
|
||||||
|
* the new page->flags are visible before the tags were updated.
|
||||||
|
*/
|
||||||
|
smp_wmb();
|
||||||
mte_copy_page_tags(kto, kfrom);
|
mte_copy_page_tags(kto, kfrom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,15 @@ bool mte_restore_tags(swp_entry_t entry, struct page *page)
|
|||||||
if (!tags)
|
if (!tags)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
page_kasan_tag_reset(page);
|
||||||
|
/*
|
||||||
|
* We need smp_wmb() in between setting the flags and clearing the
|
||||||
|
* tags because if another thread reads page->flags and builds a
|
||||||
|
* tagged address out of it, there is an actual dependency to the
|
||||||
|
* memory access, but on the current thread we do not guarantee that
|
||||||
|
* the new page->flags are visible before the tags were updated.
|
||||||
|
*/
|
||||||
|
smp_wmb();
|
||||||
mte_restore_page_tags(page_address(page), tags);
|
mte_restore_page_tags(page_address(page), tags);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user