[LTP] [PATCH v3] lib: memutils: respect minimum memory watermark when polluting memory

Li Wang liwang@redhat.com
Thu Oct 21 09:21:24 CEST 2021


On Wed, Oct 20, 2021 at 5:14 PM Krzysztof Kozlowski <
krzysztof.kozlowski@canonical.com> wrote:

> Previous fix for an out-of-memory killer killing ioctl_sg01 process
> in commit 4d2e3d44fad5 ("lib: memutils: don't pollute
> entire system memory to avoid OoM") was not fully effective.  While it
> covers most of the cases, an ARM64 machine with 128 GB of memory, 64 kB
> page size and v5.11 kernel hit it again.  Polluting the memory fails
> with OoM:
>
>   LTP: starting ioctl_sg01
>   ioctl_sg01 invoked oom-killer:
> gfp_mask=0x100dca(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), order=0, oom_score_adj=0
>   ...
>   Mem-Info:
>   active_anon:309 inactive_anon:1964781 isolated_anon:0
>                   active_file:94 inactive_file:0 isolated_file:0
>                   unevictable:305 dirty:0 writeback:0
>                   slab_reclaimable:1510 slab_unreclaimable:5012
>                   mapped:115 shmem:339 pagetables:463 bounce:0
>                   free:112043 free_pcp:1 free_cma:3159
>   Node 0 active_anon:19776kB inactive_anon:125745984kB active_file:6016kB
> inactive_file:0kB unevictable:19520kB ...
>   Node 0 DMA free:710656kB min:205120kB low:256384kB high:307648kB
> reserved_highatomic:0KB active_anon:0kB inactive_anon:3332032kB ...
>   lowmem_reserve[]: 0 0 7908 7908 7908
>   Node 0 Normal free:6460096kB min:6463168kB low:8078912kB high:9694656kB
> reserved_highatomic:0KB active_anon:19776kB inactive_anon:122413952kB ...
>   lowmem_reserve[]: 0 0 0 0 0
>
> The important part are details of memory on Node 0 in Normal zone:
> 1. free memory: 6460096 kB
> 2. min (minimum watermark): 6463168 kB
>
> Parse the /proc/sys/vm/min_free_kbytes which contains the free
> memory level used as minimum watermark (triggering OoM killer).
>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
>
> ---
>
> Changes since v2:
> 1. Use /proc/sys/vm/min_free_kbytes instead of parsing zoneinfo, thanks
>    tgo Liu Xinpeng.
>
> Changes since v1:
> 1. Add static and rename to count_min_pages().
> ---
>  lib/tst_memutils.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c
> index af132bcc6c24..df53c542d239 100644
> --- a/lib/tst_memutils.c
> +++ b/lib/tst_memutils.c
> @@ -16,12 +16,18 @@
>  void tst_pollute_memory(size_t maxsize, int fillchar)
>  {
>         size_t i, map_count = 0, safety = 0, blocksize = BLOCKSIZE;
> +       unsigned long min_free;
>         void **map_blocks;
>         struct sysinfo info;
>
> +       SAFE_FILE_SCANF("/proc/sys/vm/min_free_kbytes", "%lu", &min_free);
> +       min_free *= 1024;
> +       /* Apply a margin because we cannot get below "min" watermark */
> +       min_free += min_free / 10;
> +
>         SAFE_SYSINFO(&info);
>         safety = MAX(4096 * SAFE_SYSCONF(_SC_PAGESIZE), 128 * 1024 * 1024);
> -       safety = MAX(safety, (info.freeram / 64));
> +       safety = MAX(safety, min_free);
>

Therically this is correct, and I believe it will work on your tested
machine.

But my concern is ioctl_sg01 still fails on the special system which
MemAvai < MemFree.

Just like the one Xinpeng mentioned before:
https://lists.linux.it/pipermail/ltp/2021-January/020817.html

[root@test-env-nm05-compute-14e5e72e38 ~]# cat /proc/meminfo

MemTotal:       526997420 kB
MemFree:        520224908 kB
MemAvailable:   519936744 kB...

[root@test-env-nm05-compute-14e5e72e38 ~]# cat  /proc/sys/vm/min_free_kbytes
90112


There even reserve the safety to the 128MB, still less than the gap
between MemFree and MemAvailable.

MemFree (520224908 kB) - MemAvailable (520224908 kB) = 288164 kB  > safety


-- 
Regards,
Li Wang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20211021/1c595627/attachment.htm>


More information about the ltp mailing list