背景

  • Read the fucking source code! --By 鲁迅
  • A picture is worth a thousand words. --By 高尔基

说明:

  1. Kernel版本:4.14
  2. ARM64处理器,Contex-A53,双核
  3. 使用工具:Source Insight 3.5, Visio

1. 概述

本文将分析watermark
简单来说,在使用zoned page frame allocator分配页面时,会将可用的free pageszonewatermark进行比较,以便确定是否分配内存。
同时watermark也用来决定kswapd内核线程的睡眠与唤醒,以便对内存进行检索和压缩处理。

回忆一下之前提到过的struct zone结构体:

struct zone {     /* Read-mostly fields */      /* zone watermarks, access with *_wmark_pages(zone) macros */     unsigned long watermark[NR_WMARK];      unsigned long nr_reserved_highatomic;          .... }  enum zone_watermarks {     WMARK_MIN,     WMARK_LOW,     WMARK_HIGH,     NR_WMARK };  #define min_wmark_pages(z) (z->watermark[WMARK_MIN]) #define low_wmark_pages(z) (z->watermark[WMARK_LOW]) #define high_wmark_pages(z) (z->watermark[WMARK_HIGH])

可以看出,总共有三种水印,并且只能通过特定的宏来访问。

  • WMARK_MIN
    内存不足的最低点,如果计算出的可用页面低于该值,则无法进行页面计数;

  • WMARK_LOW
    默认情况下,该值为WMARK_MIN的125%,此时kswapd将被唤醒,可以通过修改watermark_scale_factor来改变比例值;

  • WMARK_HIGH
    默认情况下,该值为WMARK_MAX的150%,此时kswapd将睡眠,可以通过修改watermark_scale_factor来改变比例值;

图来了:

下边将对细节进一步分析。

1. watermark初始化

先看一下初始化的相关调用函数:

  • nr_free_buffer_pages:统计ZONE_DMAZONE_NORMAL中可用页面,managed_pages - high_pages