lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 02/39] kasan, page_alloc: move tag_clear_highpage out of kernel_init_free_pages
    Date
    From: Andrey Konovalov <andreyknvl@google.com>

    Currently, kernel_init_free_pages() serves two purposes: it either only
    zeroes memory or zeroes both memory and memory tags via a different
    code path. As this function has only two callers, each using only one
    code path, this behaviour is confusing.

    Pull the code that zeroes both memory and tags out of
    kernel_init_free_pages().

    As a result of this change, the code in free_pages_prepare() starts to
    look complicated, but this is improved in the few following patches.
    Those improvements are not integrated into this patch to make diffs
    easier to read.

    This patch does no functional changes.

    Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
    Reviewed-by: Alexander Potapenko <glider@google.com>

    ---

    Changes v2->v3:
    - Update patch description.
    ---
    mm/page_alloc.c | 24 +++++++++++++-----------
    1 file changed, 13 insertions(+), 11 deletions(-)

    diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    index 25d4f9ad3525..012170b1c47a 100644
    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -1282,16 +1282,10 @@ static inline bool should_skip_kasan_poison(struct page *page, fpi_t fpi_flags)
    PageSkipKASanPoison(page);
    }

    -static void kernel_init_free_pages(struct page *page, int numpages, bool zero_tags)
    +static void kernel_init_free_pages(struct page *page, int numpages)
    {
    int i;

    - if (zero_tags) {
    - for (i = 0; i < numpages; i++)
    - tag_clear_highpage(page + i);
    - return;
    - }
    -
    /* s390's use of memset() could override KASAN redzones. */
    kasan_disable_current();
    for (i = 0; i < numpages; i++) {
    @@ -1387,7 +1381,7 @@ static __always_inline bool free_pages_prepare(struct page *page,
    bool init = want_init_on_free();

    if (init)
    - kernel_init_free_pages(page, 1 << order, false);
    + kernel_init_free_pages(page, 1 << order);
    if (!skip_kasan_poison)
    kasan_poison_pages(page, order, init);
    }
    @@ -2430,9 +2424,17 @@ inline void post_alloc_hook(struct page *page, unsigned int order,
    bool init = !want_init_on_free() && want_init_on_alloc(gfp_flags);

    kasan_unpoison_pages(page, order, init);
    - if (init)
    - kernel_init_free_pages(page, 1 << order,
    - gfp_flags & __GFP_ZEROTAGS);
    +
    + if (init) {
    + if (gfp_flags & __GFP_ZEROTAGS) {
    + int i;
    +
    + for (i = 0; i < 1 << order; i++)
    + tag_clear_highpage(page + i);
    + } else {
    + kernel_init_free_pages(page, 1 << order);
    + }
    + }
    }

    set_page_owner(page, order, gfp_flags);
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-01-24 19:03    [W:4.465 / U:24.992 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site