[LTP] [PATCH 1/2] syscalls/ioctl: ioctl_sg01.c: ioctl_sg01 invoked oom-killer
liuxp11@chinatelecom.cn
liuxp11@chinatelecom.cn
Wed Jan 27 12:50:02 CET 2021
available memory can avoid to oom-killer.
#man free
available
Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or
free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items
being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)
[root@bogon ltp]# cat my.diff
commit eb28176a3351c6854620aaa8248bf17edea210ae
Author: Xinpeng Liu <liuxp11@chinatelecom.cn>
Date: Mon Jan 25 20:58:20 2021 +0800
syscalls/ioctl: ioctl_sg01.c: ioctl_sg01 invoked oom-killer
Kernel version is 5.4.81+,the available RAM is less than free,as follow:
[root@liuxp mywork]# head /proc/meminfo
MemTotal: 198101744 kB
MemFree: 189303148 kB
MemAvailable: 188566732 kB
So use available RAM to avoid OOM killer.
diff --git a/include/tst_memutils.h b/include/tst_memutils.h
index 91dad07..3fd70b2 100644
--- a/include/tst_memutils.h
+++ b/include/tst_memutils.h
@@ -6,6 +6,8 @@
#ifndef TST_MEMUTILS_H__
#define TST_MEMUTILS_H__
+unsigned long tst_get_mem_available(void);
+
/*
* Fill up to maxsize physical memory with fillchar, then free it for reuse.
* If maxsize is zero, fill as much memory as possible. This function is
diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c
index dd09db4..9408b37 100644
--- a/lib/tst_memutils.c
+++ b/lib/tst_memutils.c
@@ -13,11 +13,21 @@
#define BLOCKSIZE (16 * 1024 * 1024)
+unsigned long tst_get_mem_available(void)
+{
+ unsigned long available_kb = 0;
+
+ FILE_LINES_SCANF("/proc/meminfo", "MemAvailable: %lu", &available_kb);
+
+ return available_kb;
+}
+
void tst_pollute_memory(size_t maxsize, int fillchar)
{
size_t i, map_count = 0, safety = 0, blocksize = BLOCKSIZE;
void **map_blocks;
struct sysinfo info;
+ unsigned long available_ram;
SAFE_SYSINFO(&info);
safety = MAX(4096 * SAFE_SYSCONF(_SC_PAGESIZE), 128 * 1024 * 1024);
@@ -26,15 +36,22 @@ void tst_pollute_memory(size_t maxsize, int fillchar)
if (info.freeswap > safety)
safety = 0;
+ available_ram = 1024 * tst_get_mem_available();
+ available_ram /= info.mem_unit;
+
+ /*"MemAvailable" field maybe not exist, or freeram less than available_ram*/
+ if(available_ram == 0 || info.freeram < available_ram)
+ available_ram = info.freeram;
+
/* Not enough free memory to avoid invoking OOM killer */
- if (info.freeram <= safety)
+ if (available_ram <= safety)
return;
if (!maxsize)
maxsize = SIZE_MAX;
- if (info.freeram - safety < maxsize / info.mem_unit)
- maxsize = (info.freeram - safety) * info.mem_unit;
+ if (available_ram - safety < maxsize / info.mem_unit)
+ maxsize = (available_ram - safety) * info.mem_unit;
blocksize = MIN(maxsize, blocksize);
map_count = maxsize / blocksize;
From: Martin Doucha
Date: 2021-01-27 19:46
To: liuxp11@chinatelecom.cn; Cyril Hrubis
CC: ltp
Subject: Re: [LTP] [PATCH 1/2] syscalls/ioctl: ioctl_sg01.c: ioctl_sg01 invoked oom-killer
On 27. 01. 21 12:41, liuxp11@chinatelecom.cn wrote:
> safety = MAX(4096 * SAFE_SYSCONF(_SC_PAGESIZE), 128 * 1024 * 1024);
> now safety margin is 128MB,not 64MB. Right?
Yes, right, sorry.
--
Martin Doucha mdoucha@suse.cz
QA Engineer for Software Maintenance
SUSE LINUX, s.r.o.
CORSO IIa
Krizikova 148/34
186 00 Prague 8
Czech Republic
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20210127/182cafa3/attachment.htm>
More information about the ltp
mailing list