<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><style>body { line-height: 1.5; }blockquote { margin-top: 0px; margin-bottom: 0px; margin-left: 0.5em; }body { font-size: 14px; font-family: 'Microsoft YaHei UI'; color: rgb(0, 0, 0); line-height: 1.5; }</style></head><body>
<div><span></span><div>available memory can avoid to oom-killer.</div><div><br></div><div>#man free</div><div>available</div><div>              <b>Estimation of how much memory is available for starting new applications, without swapping. </b>Unlike the data provided by  the  cache  or</div><div>              free  fields,  this  field  takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items</div><div>              being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)</div></div><div><br></div><div><br></div><div><div>[root@bogon ltp]# cat my.diff</div><div>commit eb28176a3351c6854620aaa8248bf17edea210ae</div><div>Author: Xinpeng Liu <liuxp11@chinatelecom.cn></div><div>Date:   Mon Jan 25 20:58:20 2021 +0800</div><div><br></div><div>    syscalls/ioctl: ioctl_sg01.c: ioctl_sg01 invoked oom-killer</div><div><br></div><div>    Kernel version is 5.4.81+,the available RAM is less than free,as follow:</div><div>    [root@liuxp mywork]# head /proc/meminfo</div><div>    MemTotal:       198101744 kB</div><div>    MemFree:        189303148 kB</div><div>    MemAvailable:   188566732 kB</div><div><br></div><div>    So use available RAM to avoid OOM killer.</div><div><br></div><div>diff --git a/include/tst_memutils.h b/include/tst_memutils.h</div><div>index 91dad07..3fd70b2 100644</div><div>--- a/include/tst_memutils.h</div><div>+++ b/include/tst_memutils.h</div><div>@@ -6,6 +6,8 @@</div><div> #ifndef TST_MEMUTILS_H__</div><div> #define TST_MEMUTILS_H__</div><div><br></div><div>+unsigned long tst_get_mem_available(void);</div><div>+</div><div> /*</div><div>  * Fill up to maxsize physical memory with fillchar, then free it for reuse.</div><div>  * If maxsize is zero, fill as much memory as possible. This function is</div><div>diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c</div><div>index dd09db4..9408b37 100644</div><div>--- a/lib/tst_memutils.c</div><div>+++ b/lib/tst_memutils.c</div><div>@@ -13,11 +13,21 @@</div><div><br></div><div> #define BLOCKSIZE (16 * 1024 * 1024)</div><div><br></div><div>+unsigned long tst_get_mem_available(void)</div><div>+{</div><div>+       unsigned long available_kb = 0;</div><div>+</div><div>+       FILE_LINES_SCANF("/proc/meminfo", "MemAvailable: %lu", &available_kb);</div><div>+</div><div>+       return available_kb;</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>        void **map_blocks;</div><div>        struct sysinfo info;</div><div>+       unsigned long available_ram;</div><div><br></div><div>        SAFE_SYSINFO(&info);</div><div>        safety = MAX(4096 * SAFE_SYSCONF(_SC_PAGESIZE), 128 * 1024 * 1024);</div><div>@@ -26,15 +36,22 @@ void tst_pollute_memory(size_t maxsize, int fillchar)</div><div>        if (info.freeswap > safety)</div><div>                safety = 0;</div><div><br></div><div>+       available_ram = 1024 * tst_get_mem_available();</div><div>+       available_ram /= info.mem_unit;</div><div>+</div><div>+       /*"MemAvailable" field maybe not exist, or freeram less than available_ram*/</div><div>+       if(available_ram == 0 || info.freeram < available_ram)</div><div>+               available_ram = info.freeram;</div><div>+</div><div>        /* Not enough free memory to avoid invoking OOM killer */</div><div>-       if (info.freeram <= safety)</div><div>+       if (available_ram <= safety)</div><div>                return;</div><div><br></div><div>        if (!maxsize)</div><div>                maxsize = SIZE_MAX;</div><div><br></div><div>-       if (info.freeram - safety < maxsize / info.mem_unit)</div><div>-               maxsize = (info.freeram - safety) * info.mem_unit;</div><div>+       if (available_ram - safety < maxsize / info.mem_unit)</div><div>+               maxsize = (available_ram - safety) * info.mem_unit;</div><div><br></div><div>        blocksize = MIN(maxsize, blocksize);</div><div>        map_count = maxsize / blocksize;</div></div><div><br></div><div><br></div>
<div><br></div><blockquote style="margin-Top: 0px; margin-Bottom: 0px; margin-Left: 0.5em; margin-Right: inherit"><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:mdoucha@suse.cz">Martin Doucha</a></div><div><b>Date:</b> 2021-01-27 19:46</div><div><b>To:</b> <a href="mailto:liuxp11@chinatelecom.cn">liuxp11@chinatelecom.cn</a>; <a href="mailto:chrubis@suse.cz">Cyril Hrubis</a></div><div><b>CC:</b> <a href="mailto:ltp@lists.linux.it">ltp</a></div><div><b>Subject:</b> Re: [LTP] [PATCH 1/2] syscalls/ioctl: ioctl_sg01.c: ioctl_sg01 invoked oom-killer</div></div></div><div><div>On 27. 01. 21 12:41, liuxp11@chinatelecom.cn wrote:</div>
<div>>     safety = MAX(4096 * SAFE_SYSCONF(_SC_PAGESIZE), 128 * 1024 * 1024);</div>
<div>>     now safety margin is 128MB,not 64MB. Right?</div>
<div> </div>
<div>Yes, right, sorry.</div>
<div> </div>
<div>-- </div>
<div>Martin Doucha   mdoucha@suse.cz</div>
<div>QA Engineer for Software Maintenance</div>
<div>SUSE LINUX, s.r.o.</div>
<div>CORSO IIa</div>
<div>Krizikova 148/34</div>
<div>186 00 Prague 8</div>
<div>Czech Republic</div>
</div></blockquote>
</body></html>