<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><style>body { line-height: 1.5; }blockquote { margin-top: 0px; margin-bottom: 0px; margin-left: 0.5em; }p { margin-top: 0px; margin-bottom: 0px; }body { font-size: 14px; font-family: "Microsoft YaHei UI"; color: rgb(0, 0, 0); line-height: 1.5; }</style></head><body>
<div><span></span>Serveral months ago,i report this issue.I suggest to use <span style="background-color: transparent;">available memory.</span></div>
<div>You can test with available memory instead of <span style="background-color: transparent;">freeram,It will be OK.</span></div><div><span style="background-color: transparent;"><br></span></div><div><span style="background-color: transparent;">Report-by: </span><span style="background-color: transparent; font-family: "Microsoft YaHei UI", Tahoma; font-size: small;">Liu Xinpeng <</span><a href="mailto:liwang@redhat.com" target="_blank" class="" style="background-color: transparent; font-family: "Microsoft YaHei UI", Tahoma; font-size: small; text-decoration-line: none !important;">liuxp11@chinatelecom.cn</a><span style="background-color: transparent; font-family: "Microsoft YaHei UI", Tahoma; font-size: small;">></span></div><div><span style="font-family: "Microsoft YaHei UI", Tahoma; font-size: small;">Reviewed-by: Liu Xinpeng <</span><a href="mailto:liwang@redhat.com" target="_blank" style="font-family: "Microsoft YaHei UI", Tahoma; font-size: small; text-decoration-line: none !important;" class="">liuxp11@chinatelecom.cn</a><span style="font-family: "Microsoft YaHei UI", Tahoma; font-size: small;">></span></div><div><br></div><hr style="width: 210px; height: 1px;" color="#b5c4df" size="1" align="left">
<div><span><div style="MARGIN: 10px; FONT-FAMILY: verdana; FONT-SIZE: 10pt"><p class="MsoNormal" style="margin: 0cm; font-size: 10.5pt; font-family: 等线; line-height: normal; text-align: justify;"><span lang="EN-US" style="font-family: 微软雅黑, sans-serif;">Thanks!</span></p><p class="MsoNormal" style="margin: 0cm; font-size: 10.5pt; font-family: 等线; line-height: normal; text-align: justify;"><br></p></div></span></div>
<blockquote style="margin-Top: 0px; margin-Bottom: 0px; margin-Left: 0.5em; margin-Right: inherit"><div> </div><div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm"><div style="PADDING-RIGHT: 8px; PADDING-LEFT: 8px; FONT-SIZE: 12px;FONT-FAMILY:tahoma;COLOR:#000000; BACKGROUND: #efefef; PADDING-BOTTOM: 8px; PADDING-TOP: 8px"><div><b>From:</b> <a href="mailto:krzysztof.kozlowski@canonical.com">Krzysztof Kozlowski</a></div><div><b>Date:</b> 2021-10-19 23:02</div><div><b>To:</b> <a href="mailto:ltp@lists.linux.it">ltp</a></div><div><b>Subject:</b> [LTP] [PATCH] lib: memutils: respect minimum memory watermark when polluting memory</div></div></div><div><div>Previous fix for an out-of-memory killer killing ioctl_sg01 process</div>
<div>in commit 4d2e3d44fad5 ("lib: memutils: don't pollute</div>
<div>entire system memory to avoid OoM") was not fully effective.  While it</div>
<div>covers most of the cases, an ARM64 machine with 128 GB of memory, 64 kB</div>
<div>page size and v5.11 kernel hit it again.  Polluting the memory fails</div>
<div>with OoM:</div>
<div> </div>
<div>  LTP: starting ioctl_sg01</div>
<div>  ioctl_sg01 invoked oom-killer: gfp_mask=0x100dca(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), order=0, oom_score_adj=0</div>
<div>  ...</div>
<div>  Mem-Info:</div>
<div>  active_anon:309 inactive_anon:1964781 isolated_anon:0</div>
<div>                  active_file:94 inactive_file:0 isolated_file:0</div>
<div>                  unevictable:305 dirty:0 writeback:0</div>
<div>                  slab_reclaimable:1510 slab_unreclaimable:5012</div>
<div>                  mapped:115 shmem:339 pagetables:463 bounce:0</div>
<div>                  free:112043 free_pcp:1 free_cma:3159</div>
<div>  Node 0 active_anon:19776kB inactive_anon:125745984kB active_file:6016kB inactive_file:0kB unevictable:19520kB ...</div>
<div>  Node 0 DMA free:710656kB min:205120kB low:256384kB high:307648kB reserved_highatomic:0KB active_anon:0kB inactive_anon:3332032kB ...</div>
<div>  lowmem_reserve[]: 0 0 7908 7908 7908</div>
<div>  Node 0 Normal free:6460096kB min:6463168kB low:8078912kB high:9694656kB reserved_highatomic:0KB active_anon:19776kB inactive_anon:122413952kB ...</div>
<div>  lowmem_reserve[]: 0 0 0 0 0</div>
<div> </div>
<div>The important part are details of memory on Node 0 in Normal zone:</div>
<div>1. free memory: 6460096 kB</div>
<div>2. min (minimum watermark): 6463168 kB</div>
<div> </div>
<div>Parse the /proc/zoneinfo and include the "min" data when counting safety</div>
<div>(free memory which should not be polluted).  This way we also include</div>
<div>minimum memory for DMA zones and all nodes.</div>
<div> </div>
<div>Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com></div>
<div>---</div>
<div> lib/tst_memutils.c | 31 +++++++++++++++++++++++++++++--</div>
<div> 1 file changed, 29 insertions(+), 2 deletions(-)</div>
<div> </div>
<div>diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c</div>
<div>index af132bcc6c24..f34ba582ec93 100644</div>
<div>--- a/lib/tst_memutils.c</div>
<div>+++ b/lib/tst_memutils.c</div>
<div>@@ -6,22 +6,49 @@</div>
<div> #include <unistd.h></div>
<div> #include <limits.h></div>
<div> #include <sys/sysinfo.h></div>
<div>+#include <stdio.h></div>
<div> #include <stdlib.h></div>
<div> </div>
<div> #define TST_NO_DEFAULT_MAIN</div>
<div> #include "tst_test.h"</div>
<div>+#include "tst_safe_stdio.h"</div>
<div> </div>
<div> #define BLOCKSIZE (16 * 1024 * 1024)</div>
<div> </div>
<div>+unsigned long tst_min_memory(void)</div>
<div>+{</div>
<div>+    FILE *fp;</div>
<div>+    int ret;</div>
<div>+    unsigned long total_pages = 0;</div>
<div>+    unsigned long pages;</div>
<div>+    char line[BUFSIZ];</div>
<div>+</div>
<div>+    fp = SAFE_FOPEN("/proc/zoneinfo", "r");</div>
<div>+</div>
<div>+    while (fgets(line, BUFSIZ, fp) != NULL) {</div>
<div>+            ret = sscanf(line, " min %lu", &pages);</div>
<div>+            if (ret == 1)</div>
<div>+                    total_pages += pages;</div>
<div>+    }</div>
<div>+</div>
<div>+    SAFE_FCLOSE(fp);</div>
<div>+</div>
<div>+    /* Apply a margin because we cannot get below "min" watermark */</div>
<div>+    total_pages += (total_pages / 10);</div>
<div>+</div>
<div>+    return total_pages;</div>
<div>+}</div>
<div>+</div>
<div> void tst_pollute_memory(size_t maxsize, int fillchar)</div>
<div> {</div>
<div>     size_t i, map_count = 0, safety = 0, blocksize = BLOCKSIZE;</div>
<div>+    long pagesize = SAFE_SYSCONF(_SC_PAGESIZE);</div>
<div>     void **map_blocks;</div>
<div>     struct sysinfo info;</div>
<div> </div>
<div>     SAFE_SYSINFO(&info);</div>
<div>-    safety = MAX(4096 * SAFE_SYSCONF(_SC_PAGESIZE), 128 * 1024 * 1024);</div>
<div>-    safety = MAX(safety, (info.freeram / 64));</div>
<div>+    safety = MAX(4096 * pagesize, 128 * 1024 * 1024);</div>
<div>+    safety = MAX(safety, tst_min_memory() * pagesize);</div>
<div>     safety /= info.mem_unit;</div>
<div> </div>
<div>     if (info.freeswap > safety)</div>
<div>-- </div>
<div>2.30.2</div>
<div> </div>
<div> </div>
<div>-- </div>
<div>Mailing list info: https://lists.linux.it/listinfo/ltp</div>
</div></blockquote>
</body></html>