lkml.org 
[lkml]   [2023]   [Jun]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [PATCH v4] mm/page_alloc: fix min_free_kbytes calculation regarding ZONE_MOVABLE
    Date
    liuq <liuq131@chinatelecom.cn> writes:

    > The current calculation of min_free_kbytes only uses ZONE_DMA and
    > ZONE_NORMAL pages,but the ZONE_MOVABLE zone->_watermark[WMARK_MIN]
    > will also divide part of min_free_kbytes.This will cause the min
    > watermark of ZONE_NORMAL to be too small in the presence of ZONE_MOVEABLE.
    >
    > __GFP_HIGH and PF_MEMALLOC allocations usually don't need movable
    > zone pages, so just like ZONE_HIGHMEM, cap pages_min to a small
    > value in __setup_per_zone_wmarks.
    ~~~~~~~~~~~~~~~~~~~~~~~

    Better to add () in function name to make it easier to understand. That
    is, "__setup_per_zone_wmarks()".

    Otherwise looks good to me.

    Reviewed-by: "Huang, Ying" <ying.huang@intel.com>

    >
    > On my testing machine with 16GB of memory (transparent hugepage is
    > turned off by default, and movablecore=12G is configured)
    > The following is a comparative test data of watermark_min
    >
    > no patch add patch
    > ZONE_DMA 1 8
    > ZONE_DMA32 151 709
    > ZONE_NORMAL 233 1113
    > ZONE_MOVABLE 1434 128
    > min_free_kbytes 7288 7326
    >
    > Signed-off-by: liuq<liuq131@chinatelecom.cn>
    > ---
    > mm/page_alloc.c | 12 ++++++------
    > 1 file changed, 6 insertions(+), 6 deletions(-)
    >
    > diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    > index 47421bedc12b..590ed8725e09 100644
    > --- a/mm/page_alloc.c
    > +++ b/mm/page_alloc.c
    > @@ -6362,9 +6362,9 @@ static void __setup_per_zone_wmarks(void)
    > struct zone *zone;
    > unsigned long flags;
    >
    > - /* Calculate total number of !ZONE_HIGHMEM pages */
    > + /* Calculate total number of !ZONE_HIGHMEM and !ZONE_MOVABLE pages */
    > for_each_zone(zone) {
    > - if (!is_highmem(zone))
    > + if (!is_highmem(zone) && zone_idx(zone) != ZONE_MOVABLE)
    > lowmem_pages += zone_managed_pages(zone);
    > }
    >
    > @@ -6374,15 +6374,15 @@ static void __setup_per_zone_wmarks(void)
    > spin_lock_irqsave(&zone->lock, flags);
    > tmp = (u64)pages_min * zone_managed_pages(zone);
    > do_div(tmp, lowmem_pages);
    > - if (is_highmem(zone)) {
    > + if (is_highmem(zone) || zone_idx(zone) == ZONE_MOVABLE) {
    > /*
    > * __GFP_HIGH and PF_MEMALLOC allocations usually don't
    > - * need highmem pages, so cap pages_min to a small
    > - * value here.
    > + * need highmem and movable zones pages, so cap pages_min
    > + * to a small value here.
    > *
    > * The WMARK_HIGH-WMARK_LOW and (WMARK_LOW-WMARK_MIN)
    > * deltas control async page reclaim, and so should
    > - * not be capped for highmem.
    > + * not be capped for highmem and movable zones.
    > */
    > unsigned long min_pages;
    >
    > -- 2.27.0

    \
     
     \ /
      Last update: 2023-06-25 04:35    [W:7.320 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site