lkml.org 
[lkml]   [2023]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 16/18] mm: use a folio in zap_pte_range()
    Date
    Make should_zap_page() to take a folio and use a folio in
    zap_pte_range(), which save several compound_head() calls.

    Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
    ---
    mm/memory.c | 43 ++++++++++++++++++++++++-------------------
    1 file changed, 24 insertions(+), 19 deletions(-)

    diff --git a/mm/memory.c b/mm/memory.c
    index fcc04dce8e8a..9b4334de9bf0 100644
    --- a/mm/memory.c
    +++ b/mm/memory.c
    @@ -1358,19 +1358,19 @@ static inline bool should_zap_cows(struct zap_details *details)
    return details->even_cows;
    }

    -/* Decides whether we should zap this page with the page pointer specified */
    -static inline bool should_zap_page(struct zap_details *details, struct page *page)
    +/* Decides whether we should zap this folio with the folio pointer specified */
    +static inline bool should_zap_page(struct zap_details *details, struct folio *folio)
    {
    - /* If we can make a decision without *page.. */
    + /* If we can make a decision without *folio.. */
    if (should_zap_cows(details))
    return true;

    - /* E.g. the caller passes NULL for the case of a zero page */
    - if (!page)
    + /* E.g. the caller passes NULL for the case of a zero folio */
    + if (!folio)
    return true;

    - /* Otherwise we should only zap non-anon pages */
    - return !PageAnon(page);
    + /* Otherwise we should only zap non-anon folios */
    + return !folio_test_anon(folio);
    }

    static inline bool zap_drop_file_uffd_wp(struct zap_details *details)
    @@ -1423,6 +1423,7 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
    arch_enter_lazy_mmu_mode();
    do {
    pte_t ptent = ptep_get(pte);
    + struct folio *folio = NULL;
    struct page *page;

    if (pte_none(ptent))
    @@ -1435,7 +1436,10 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
    unsigned int delay_rmap;

    page = vm_normal_page(vma, addr, ptent);
    - if (unlikely(!should_zap_page(details, page)))
    + if (page)
    + folio = page_folio(page);
    +
    + if (unlikely(!should_zap_page(details, folio)))
    continue;
    ptent = ptep_get_and_clear_full(mm, addr, pte,
    tlb->fullmm);
    @@ -1449,18 +1453,18 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
    }

    delay_rmap = 0;
    - if (!PageAnon(page)) {
    + if (!folio_test_anon(folio)) {
    if (pte_dirty(ptent)) {
    - set_page_dirty(page);
    + folio_set_dirty(folio);
    if (tlb_delay_rmap(tlb)) {
    delay_rmap = 1;
    force_flush = 1;
    }
    }
    if (pte_young(ptent) && likely(vma_has_recency(vma)))
    - mark_page_accessed(page);
    + folio_mark_accessed(folio);
    }
    - rss[mm_counter(page)]--;
    + rss[mm_counter_folio(folio)]--;
    if (!delay_rmap) {
    page_remove_rmap(page, vma, false);
    if (unlikely(page_mapcount(page) < 0))
    @@ -1477,9 +1481,10 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
    entry = pte_to_swp_entry(ptent);
    if (is_device_private_entry(entry) ||
    is_device_exclusive_entry(entry)) {
    - page = pfn_swap_entry_to_page(entry);
    - if (unlikely(!should_zap_page(details, page)))
    + folio = pfn_swap_entry_to_folio(entry);
    + if (unlikely(!should_zap_page(details, folio)))
    continue;
    +
    /*
    * Both device private/exclusive mappings should only
    * work with anonymous page so far, so we don't need to
    @@ -1487,10 +1492,10 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
    * see zap_install_uffd_wp_if_needed().
    */
    WARN_ON_ONCE(!vma_is_anonymous(vma));
    - rss[mm_counter(page)]--;
    + rss[mm_counter_folio(folio)]--;
    if (is_device_private_entry(entry))
    page_remove_rmap(page, vma, false);
    - put_page(page);
    + folio_put(folio);
    } else if (!non_swap_entry(entry)) {
    /* Genuine swap entry, hence a private anon page */
    if (!should_zap_cows(details))
    @@ -1499,10 +1504,10 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
    if (unlikely(!free_swap_and_cache(entry)))
    print_bad_pte(vma, addr, ptent, NULL);
    } else if (is_migration_entry(entry)) {
    - page = pfn_swap_entry_to_page(entry);
    - if (!should_zap_page(details, page))
    + folio = pfn_swap_entry_to_folio(entry);
    + if (!should_zap_page(details, folio))
    continue;
    - rss[mm_counter(page)]--;
    + rss[mm_counter_folio(folio)]--;
    } else if (pte_marker_entry_uffd_wp(entry)) {
    /*
    * For anon: always drop the marker; for file: only
    --
    2.27.0
    \
     
     \ /
      Last update: 2023-11-20 13:47    [W:6.092 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site