lkml.org 
[lkml]   [2008]   [Feb]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 6/8][for -mm] mem_notify v6: (optional) fixed incorrect shrink_zone
    on X86, ZONE_DMA is very very small.
    It is often no used at all.

    Unfortunately,
    when NR_ACTIVE==0, NR_INACTIVE==0, shrink_zone() try to reclaim 1 page.
    because

    zone->nr_scan_active +=
    (zone_page_state(zone, NR_ACTIVE) >> priority) + 1;
    ^^^^^

    it cause unnecessary low memory notify ;-)
    I fixed it.

    ChangeLog
    v5: new


    Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>

    ---
    mm/vmscan.c | 21 ++++++++++++++++-----
    1 file changed, 16 insertions(+), 5 deletions(-)

    Index: b/mm/vmscan.c
    ===================================================================
    --- a/mm/vmscan.c 2008-02-03 20:27:53.000000000 +0900
    +++ b/mm/vmscan.c 2008-02-03 20:33:13.000000000 +0900
    @@ -947,7 +947,7 @@ static inline void note_zone_scanning_pr

    static inline int zone_is_near_oom(struct zone *zone)
    {
    - return zone->pages_scanned >= (zone_page_state(zone, NR_ACTIVE)
    + return zone->pages_scanned > (zone_page_state(zone, NR_ACTIVE)
    + zone_page_state(zone, NR_INACTIVE))*3;
    }

    @@ -1196,18 +1196,29 @@ static unsigned long shrink_zone(int pri
    unsigned long nr_inactive;
    unsigned long nr_to_scan;
    unsigned long nr_reclaimed = 0;
    + unsigned long tmp;
    + unsigned long zone_active;
    + unsigned long zone_inactive;

    if (scan_global_lru(sc)) {
    /*
    * Add one to nr_to_scan just to make sure that the kernel
    * will slowly sift through the active list.
    */
    - zone->nr_scan_active +=
    - (zone_page_state(zone, NR_ACTIVE) >> priority) + 1;
    + zone_active = zone_page_state(zone, NR_ACTIVE);
    + tmp = (zone_active >> priority) + 1;
    + if (unlikely(tmp > zone_active))
    + tmp = zone_active;
    + zone->nr_scan_active += tmp;
    nr_active = zone->nr_scan_active;
    - zone->nr_scan_inactive +=
    - (zone_page_state(zone, NR_INACTIVE) >> priority) + 1;
    +
    + zone_inactive = zone_page_state(zone, NR_INACTIVE);
    + tmp = (zone_inactive >> priority) + 1;
    + if (unlikely(tmp > zone_inactive))
    + tmp = zone_inactive;
    + zone->nr_scan_inactive += tmp;
    nr_inactive = zone->nr_scan_inactive;
    +
    if (nr_inactive >= sc->swap_cluster_max)
    zone->nr_scan_inactive = 0;
    else

    \
     
     \ /
      Last update: 2008-02-09 16:29    [W:0.026 / U:0.020 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site