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

Li Wang liwang@redhat.com
Wed Oct 20 06:07:21 CEST 2021


On Tue, Oct 19, 2021 at 11:02 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/zoneinfo and include the "min" data when counting safety
> (free memory which should not be polluted).  This way we also include
> minimum memory for DMA zones and all nodes.
>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
> ---
>  lib/tst_memutils.c | 31 +++++++++++++++++++++++++++++--
>  1 file changed, 29 insertions(+), 2 deletions(-)
>
> diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c
> index af132bcc6c24..f34ba582ec93 100644
> --- a/lib/tst_memutils.c
> +++ b/lib/tst_memutils.c
> @@ -6,22 +6,49 @@
>  #include <unistd.h>
>  #include <limits.h>
>  #include <sys/sysinfo.h>
> +#include <stdio.h>
>  #include <stdlib.h>
>
>  #define TST_NO_DEFAULT_MAIN
>  #include "tst_test.h"
> +#include "tst_safe_stdio.h"
>
>  #define BLOCKSIZE (16 * 1024 * 1024)
>
> +unsigned long tst_min_memory(void)
>

The prefix "tst_" is used for a function which extern to the whole LTP.
In this case the function is only used in the library, so we'd better
avoid using tst_.

As it parses minimal pages from /proc/zoneinfo, so I'd suggest rename
it to count_min_pages.

The remaining part looks good to me.

Reviewed-by: Li Wang <liwang@redhat.com>

+{
> +       FILE *fp;
> +       int ret;
> +       unsigned long total_pages = 0;
> +       unsigned long pages;
> +       char line[BUFSIZ];
> +
> +       fp = SAFE_FOPEN("/proc/zoneinfo", "r");
> +
> +       while (fgets(line, BUFSIZ, fp) != NULL) {
> +               ret = sscanf(line, " min %lu", &pages);
> +               if (ret == 1)
> +                       total_pages += pages;
> +       }
> +
> +       SAFE_FCLOSE(fp);
> +
> +       /* Apply a margin because we cannot get below "min" watermark */
> +       total_pages += (total_pages / 10);
> +
> +       return total_pages;
> +}
> +
>  void tst_pollute_memory(size_t maxsize, int fillchar)
>  {
>         size_t i, map_count = 0, safety = 0, blocksize = BLOCKSIZE;
> +       long pagesize = SAFE_SYSCONF(_SC_PAGESIZE);
>         void **map_blocks;
>         struct sysinfo info;
>
>         SAFE_SYSINFO(&info);
> -       safety = MAX(4096 * SAFE_SYSCONF(_SC_PAGESIZE), 128 * 1024 * 1024);
> -       safety = MAX(safety, (info.freeram / 64));
> +       safety = MAX(4096 * pagesize, 128 * 1024 * 1024);
> +       safety = MAX(safety, tst_min_memory() * pagesize);
>         safety /= info.mem_unit;
>
>         if (info.freeswap > safety)
> --
> 2.30.2
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>
>

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


More information about the ltp mailing list