Skip to contentSkip to conversation

syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

PATCH Superseded xiao yang 3 participants 10 messages Dec 27, 2017 – Jan 16, 2018

lore
Share & tools
lore

xiao yang

author
#0 lore raw

PATCH 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted
on /sys/fs/cgroup/memory:
------------------------------------------------------------
safe_macros.c:169: BROK: madvise09.c:175: mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
 testcases/kernel/syscalls/madvise/madvise09.c | 29 +++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +25 -4
index f744405..ef0fa3b 100644
@@ -53,12 +53,14 @@
 #include <errno.h>
 #include <stdio.h>
 #include <ctype.h>
+#include <sys/mount.h>
 
 #include "tst_test.h"
 #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
 static char cgroup_path[PATH_MAX];
 static char tasks_path[PATH_MAX];
 static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
 {
 	if (cgroup_path[0] && !access(cgroup_path, F_OK))
 		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK) && rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
 }
 
 static void run(void)
@@ -316,10 +327,20 @@ static void setup(void)
 {
 	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			if (rmdir(MEMCG_PATH) == -1)
+				tst_res(TWARN | TERRNO, "Rmdir %s failed",
+					 MEMCG_PATH);
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
 	}
+	memcg_mounted = 1;
 
 	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
 		swap_accounting_enabled = 1;
Signature · 1 line
1.8.3.1
author
#1 lore raw

PATCH 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

Hi,

There is duplicate code with this patch. So i will remove it and send v2 patch.

Thanks,
Xiao Yang

Quoted 78 lines · xiao yang

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted
on /sys/fs/cgroup/memory:
------------------------------------------------------------
safe_macros.c:169: BROK: madvise09.c:175: mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
 testcases/kernel/syscalls/madvise/madvise09.c | 29 +++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +25 -4
index f744405..ef0fa3b 100644
@@ -53,12 +53,14 @@
 #include <errno.h>
 #include <stdio.h>
 #include <ctype.h>
+#include <sys/mount.h>
 
 #include "tst_test.h"
 #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
 static char cgroup_path[PATH_MAX];
 static char tasks_path[PATH_MAX];
 static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
 {
 	if (cgroup_path[0] && !access(cgroup_path, F_OK))
 		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK) && rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
 }
 
 static void run(void)
@@ -316,10 +327,20 @@ static void setup(void)
 {
 	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			if (rmdir(MEMCG_PATH) == -1)
+				tst_res(TWARN | TERRNO, "Rmdir %s failed",
+					 MEMCG_PATH);
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
 	}
+	memcg_mounted = 1;
 
 	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
 		swap_accounting_enabled = 1;
author
#2 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted
on /sys/fs/cgroup/memory:
------------------------------------------------------------
safe_macros.c:169: BROK: madvise09.c:175: mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
 testcases/kernel/syscalls/madvise/madvise09.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +22 -4
index f744405..25cf81f 100644
@@ -53,12 +53,14 @@
 #include <errno.h>
 #include <stdio.h>
 #include <ctype.h>
+#include <sys/mount.h>
 
 #include "tst_test.h"
 #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
 static char cgroup_path[PATH_MAX];
 static char tasks_path[PATH_MAX];
 static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
 {
 	if (cgroup_path[0] && !access(cgroup_path, F_OK))
 		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK) && rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
 }
 
 static void run(void)
@@ -316,10 +327,17 @@ static void setup(void)
 {
 	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
 	}
+	memcg_mounted = 1;
 
 	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
 		swap_accounting_enabled = 1;
Signature · 1 line
1.8.3.1
author
#3 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

Hi Jan,

Could you help me review this patch.

Thanks,
Xiao Yang

Quoted 75 lines · xiao yang

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted on /sys/fs/cgroup/memory:

   ------------------------------------------------------------
   safe_macros.c:169: BROK: madvise09.c:175: mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
   ------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
 testcases/kernel/syscalls/madvise/madvise09.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +22 -4
index f744405..25cf81f 100644
@@ -53,12 +53,14 @@
 #include <errno.h>
 #include <stdio.h>
 #include <ctype.h>
+#include <sys/mount.h>
 
 #include "tst_test.h"
 #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
 static char cgroup_path[PATH_MAX];
 static char tasks_path[PATH_MAX];
 static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
 {
 	if (cgroup_path[0] && !access(cgroup_path, F_OK))
 		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK) && rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
 }
 
 static void run(void)
@@ -316,10 +327,17 @@ static void setup(void)
 {
 	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
 	}
+	memcg_mounted = 1;
 
 	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
 		swap_accounting_enabled = 1;
#4 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

----- Original Message -----

Quoted 3 lines

Hi Jan,

Could you help me review this patch.

Hi,

I think it would be better to use existing mount, if it's already mounted. umount may fail with -EBUSY if the subsystem is already part of existing hierarchy.

Regards,
Jan

Quoted 86 lines

Thanks,
Xiao Yang

Quoted 78 lines · xiao yang

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted on /sys/fs/cgroup/memory:

   ------------------------------------------------------------
   safe_macros.c:169: BROK: madvise09.c:175:
   mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
   ------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
 testcases/kernel/syscalls/madvise/madvise09.c | 26
 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +22 -4
index f744405..25cf81f 100644
@@ -53,12 +53,14 @@
 #include <errno.h>
 #include <stdio.h>
 #include <ctype.h>
+#include <sys/mount.h>
 
 #include "tst_test.h"
 #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
 static char cgroup_path[PATH_MAX];
 static char tasks_path[PATH_MAX];
 static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
 {
 	if (cgroup_path[0] && !access(cgroup_path, F_OK))
 		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK) && rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
 }
 
 static void run(void)
@@ -316,10 +327,17 @@ static void setup(void)
 {
 	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
 	}
+	memcg_mounted = 1;
 
 	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
 		swap_accounting_enabled = 1;
author
#5 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

Quoted 10 lines · Jan Stancek

----- Original Message -----

Quoted 3 lines

Hi Jan,

Could you help me review this patch.

Hi,

I think it would be better to use existing mount, if it's already mounted. umount may fail with -EBUSY if the subsystem is already part of existing hierarchy.

Hi Jan,

1) I want to run madvise09 on as many distros supporting memcg as possible.

2) The custom mount point is just created and mounted for running madvise09, and will be
released after finishing madvise09, so i think it doesn't affect
existing hierarchy. Additionally,
i use custom mount point according to some tests(oom03, oom05,
cpuset01, etc.) on LTP.

Thanks,
Xiao Yang

Quoted 90 lines

Regards,
Jan

Quoted 79 lines

Thanks,
Xiao Yang

Quoted 76 lines · xiao yang

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted

    on /sys/fs/cgroup/memory:
    ------------------------------------------------------------
    safe_macros.c:169: BROK: madvise09.c:175:
    mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
    ------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
  testcases/kernel/syscalls/madvise/madvise09.c | 26
  ++++++++++++++++++++++----
  1 file changed, 22 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +22 -4
index f744405..25cf81f 100644
@@ -53,12 +53,14 @@
  #include<errno.h>
  #include<stdio.h>
  #include<ctype.h>
+#include<sys/mount.h>
 
  #include "tst_test.h"
  #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
  static char cgroup_path[PATH_MAX];
  static char tasks_path[PATH_MAX];
  static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
  {
  	if (cgroup_path[0]&&  !access(cgroup_path, F_OK))
  		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK)&&  rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
  }
 
  static void run(void)
@@ -316,10 +327,17 @@ static void setup(void)
  {
  	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
  	}
+	memcg_mounted = 1;
 
Quoted 5 lines

testcases/kernel/syscalls/madvise/madvise09.c static void setup(void) · line 343

Quoted 2 lines
testcases/kernel/syscalls/madvise/madvise09.c +0 -0
  	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
  		swap_accounting_enabled = 1;

.

#6 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

----- Original Message -----

Quoted 11 lines · Jan Stancek
Quoted 10 lines

----- Original Message -----

Quoted 3 lines

Hi Jan,

Could you help me review this patch.

Hi,

I think it would be better to use existing mount, if it's already mounted. umount may fail with -EBUSY if the subsystem is already part of existing hierarchy.

Quoted 8 lines

Hi Jan,

1) I want to run madvise09 on as many distros supporting memcg as possible.

2) The custom mount point is just created and mounted for running madvise09, and will be
released after finishing madvise09, so i think it doesn't affect
existing hierarchy.

Here's example:

This is state of the system prior to madvise09:

# mkdir -p /tmp/1; mount -t cgroup -o memory,hugetlb none /tmp/1; echo $?
0

And now you run madvise09, that tries to mount "memory" cgroup, which is going to fail:

# mkdir -p /tmp/2; mount -t cgroup -o memory none /tmp/2; echo $?
mount: none is already mounted or /tmp/2 busy
       none is already mounted on /tmp/1
32
Quoted 3 lines

Additionally,
i use custom mount point according to some tests(oom03, oom05,
cpuset01, etc.) on LTP.

OK, so my example, though possible is likely not very common.

We are close to next LTP release, can this wait or is this a regression that should be addressed before release? (Adding Cyril to CC)

Regards,
Jan

Quoted 97 lines

Thanks,
Xiao Yang

Quoted 90 lines

Regards,
Jan

Quoted 79 lines

Thanks,
Xiao Yang

Quoted 76 lines · xiao yang

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted

    on /sys/fs/cgroup/memory:
    ------------------------------------------------------------
    safe_macros.c:169: BROK: madvise09.c:175:
    mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
    ------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
  testcases/kernel/syscalls/madvise/madvise09.c | 26
  ++++++++++++++++++++++----
  1 file changed, 22 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +22 -4
index f744405..25cf81f 100644
@@ -53,12 +53,14 @@
  #include<errno.h>
  #include<stdio.h>
  #include<ctype.h>
+#include<sys/mount.h>
 
  #include "tst_test.h"
  #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
  static char cgroup_path[PATH_MAX];
  static char tasks_path[PATH_MAX];
  static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
  {
  	if (cgroup_path[0]&&  !access(cgroup_path, F_OK))
  		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK)&&  rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
  }
 
  static void run(void)
@@ -316,10 +327,17 @@ static void setup(void)
  {
  	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
  	}
+	memcg_mounted = 1;
 
Quoted 5 lines

testcases/kernel/syscalls/madvise/madvise09.c static void setup(void) · line 343

Quoted 2 lines
testcases/kernel/syscalls/madvise/madvise09.c +0 -0
  	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
  		swap_accounting_enabled = 1;

.

author
#7 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

Quoted 22 lines · Jan Stancek

----- Original Message -----

Quoted 10 lines · Jan Stancek
Quoted 9 lines

----- Original Message -----

Quoted 3 lines

Hi Jan,

Could you help me review this patch.

Hi,

I think it would be better to use existing mount, if it's already mounted. umount may fail with -EBUSY if the subsystem is already part of existing hierarchy.

Quoted 8 lines

Hi Jan,

1) I want to run madvise09 on as many distros supporting memcg as possible.

2) The custom mount point is just created and mounted for running madvise09, and will be
released after finishing madvise09, so i think it doesn't affect
existing hierarchy.

Here's example:

This is state of the system prior to madvise09:

Quoted 8 lines
# mkdir -p /tmp/1; mount -t cgroup -o memory,hugetlb none /tmp/1; echo $?
0

And now you run madvise09, that tries to mount "memory" cgroup, which is going to fail:

# mkdir -p /tmp/2; mount -t cgroup -o memory none /tmp/2; echo $?
mount: none is already mounted or /tmp/2 busy
        none is already mounted on /tmp/1
32

Hi Jan,

Thanks for your detailed explanation.

According to documented behavior of cgroups [1], it seems that only a new cgroup hierarchy with the same options of the existing hierarchy can be mounted sucessfully, and mount with different options will fail and return EBUSY as expected.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/cgroup-v1/cgroups.txt

Combinations of sucess:
-----------------------------------------------------------------------------
1) # mkdir -p /tmp/1; mount -t cgroup -o memory,hugetlb none /tmp/1; echo $?

    0
    # mkdir -p /tmp/2; mount -t cgroup -o memory,hugetlb none /tmp/2; echo $?
    0
2) # mkdir -p /tmp/1; mount -t cgroup -o memory none /tmp/1; echo $?
    0
    # mkdir -p /tmp/2; mount -t cgroup -o memory none /tmp/2; echo $?
    0

-----------------------------------------------------------------------------

Combinations of failure:
-----------------------------------------------------------------------------
3) # mkdir -p /tmp/1; mount -t cgroup -o memory,hugetlb none /tmp/1; echo $? 0
# mkdir -p /tmp/2; mount -t cgroup -o memory none /tmp/2; echo $?
mount: none is already mounted or /tmp/2 busy
none is already mounted on /tmp/1
32

4) # mkdir -p /tmp/1; mount -t cgroup -o memory none /tmp/1; echo $? 0
# mkdir -p /tmp/2; mount -t cgroup -o memory,hugetlb none /tmp/2; echo $?
mount: none is already mounted or /tmp/2 busy
none is already mounted on /tmp/1
32
-----------------------------------------------------------------------------

I am not sure how to fix all errors.

Quoted 7 lines
Quoted 3 lines

Additionally,
i use custom mount point according to some tests(oom03, oom05,
cpuset01, etc.) on LTP.

OK, so my example, though possible is likely not very common.

We are close to next LTP release, can this wait or is this a regression that should be addressed before release? (Adding Cyril to CC)

I think we can hold it until LTP is released.

Thanks,
Xiao Yang.

Quoted 99 lines

Regards,
Jan

Quoted 93 lines

Thanks,
Xiao Yang

Quoted 88 lines

Regards,
Jan

Quoted 79 lines

Thanks,
Xiao Yang

Quoted 76 lines · xiao yang

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted

     on /sys/fs/cgroup/memory:
     ------------------------------------------------------------
     safe_macros.c:169: BROK: madvise09.c:175:
     mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) failed: EROFS
     ------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
   testcases/kernel/syscalls/madvise/madvise09.c | 26
   ++++++++++++++++++++++----
   1 file changed, 22 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +22 -4
index f744405..25cf81f 100644
@@ -53,12 +53,14 @@
   #include<errno.h>
   #include<stdio.h>
   #include<ctype.h>
+#include<sys/mount.h>
 
   #include "tst_test.h"
   #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
   static char cgroup_path[PATH_MAX];
   static char tasks_path[PATH_MAX];
   static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
   {
   	if (cgroup_path[0]&&   !access(cgroup_path, F_OK))
   		rmdir(cgroup_path);
+
+	if (memcg_mounted) {
+		tst_res(TINFO, "Umount memory cgroup after testing");
+		SAFE_UMOUNT(MEMCG_PATH);
+		memcg_mounted = 0;
+	}
+
+	if (!access(MEMCG_PATH, F_OK)&&   rmdir(MEMCG_PATH))
+		tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
   }
 
   static void run(void)
@@ -316,10 +327,17 @@ static void setup(void)
   {
   	long int swap_total;
 
-	if (access(MEMCG_PATH, F_OK)) {
-		tst_brk(TCONF, "'" MEMCG_PATH
-			"' not present, CONFIG_MEMCG missing?");
+	SAFE_MKDIR(MEMCG_PATH, 0777);
+
+	tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+	if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+		if (errno == ENODEV) {
+			tst_brk(TCONF,
+				 "Memory cgroup was not configured in kernel");
+		}
+		tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
   	}
+	memcg_mounted = 1;
 
Quoted 4 lines

testcases/kernel/syscalls/madvise/madvise09.c static void setup(void) · line 343

Quoted 2 lines
testcases/kernel/syscalls/madvise/madvise09.c +0 -0
   	if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
   		swap_accounting_enabled = 1;

.

.

author
#8 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

Hi,

Adding Cyril to CC. :-)

Thanks,
Xiao Yang

Quoted 204 lines · Xiao Yang
Quoted 29 lines · Jan Stancek

----- Original Message -----

Quoted 14 lines · Jan Stancek
Quoted 11 lines

----- Original Message -----

Quoted 3 lines

Hi Jan,

Could you help me review this patch.

Hi,

I think it would be better to use existing mount, if it's already mounted.
umount may fail with -EBUSY if the subsystem is already part of existing
hierarchy.

Hi Jan,

Quoted 7 lines

1) I want to run madvise09 on as many distros supporting memcg as possible.

2) The custom mount point is just created and mounted for running madvise09, and will be
released after finishing madvise09, so i think it doesn't affect
existing hierarchy.

Here's example:

This is state of the system prior to madvise09:

# mkdir -p /tmp/1; mount -t cgroup -o memory,hugetlb none /tmp/1; 
echo $?
0
Quoted 6 lines

And now you run madvise09, that tries to mount "memory" cgroup, which is going to fail:

# mkdir -p /tmp/2; mount -t cgroup -o memory none /tmp/2; echo $?
mount: none is already mounted or /tmp/2 busy
        none is already mounted on /tmp/1
32

Hi Jan,

Thanks for your detailed explanation.

According to documented behavior of cgroups [1], it seems that only a new cgroup
hierarchy with the same options of the existing hierarchy can be mounted sucessfully,
and mount with different options will fail and return EBUSY as expected.

[1]
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/cgroup-v1/cgroups.txt

Combinations of sucess:
-----------------------------------------------------------------------------

1) # mkdir -p /tmp/1; mount -t cgroup -o memory,hugetlb none /tmp/1; echo $?
0

   # mkdir -p /tmp/2; mount -t cgroup -o memory,hugetlb none /tmp/2; 
echo $?
   0
2) # mkdir -p /tmp/1; mount -t cgroup -o memory none /tmp/1; echo $?
   0
   # mkdir -p /tmp/2; mount -t cgroup -o memory none /tmp/2; echo $?
   0
----------------------------------------------------------------------------- 

Combinations of failure:
-----------------------------------------------------------------------------

3) # mkdir -p /tmp/1; mount -t cgroup -o memory,hugetlb none /tmp/1; echo $?
0

   # mkdir -p /tmp/2; mount -t cgroup -o memory none /tmp/2; echo $?
     mount: none is already mounted or /tmp/2 busy
            none is already mounted on /tmp/1
   32

4) # mkdir -p /tmp/1; mount -t cgroup -o memory none /tmp/1; echo $? 0

   # mkdir -p /tmp/2; mount -t cgroup -o memory,hugetlb none /tmp/2; 
echo $?
     mount: none is already mounted or /tmp/2 busy
            none is already mounted on /tmp/1
   32
----------------------------------------------------------------------------- 

I am not sure how to fix all errors.

Quoted 7 lines
Quoted 3 lines

Additionally,
i use custom mount point according to some tests(oom03, oom05,
cpuset01, etc.) on LTP.

OK, so my example, though possible is likely not very common.

We are close to next LTP release, can this wait or is this a regression that should be addressed before release? (Adding Cyril to CC)

I think we can hold it until LTP is released.

Thanks,
Xiao Yang.

Quoted 100 lines

Regards,
Jan

Quoted 94 lines

Thanks,
Xiao Yang

Quoted 89 lines

Regards,
Jan

Quoted 80 lines

Thanks,
Xiao Yang

Quoted 77 lines · xiao yang

1) on some distros(e.g. RHEL6), memory cgroup was supported and mounted on /cgroup/memory by default, but the test was skipped if /sys/fs/cgroup/memory did not exist.

2) We got the following error if memory cgroup wasn't mounted

     on /sys/fs/cgroup/memory:
     ------------------------------------------------------------
     safe_macros.c:169: BROK: madvise09.c:175:
     mkdir(/sys/fs/cgroup/memory/ltp_madvise09_16386/,0777) 
failed: EROFS
     ------------------------------------------------------------

We use custom mount point and mount memory cgroup on it manually to fix these issues.

---
   testcases/kernel/syscalls/madvise/madvise09.c | 26
   ++++++++++++++++++++++----
   1 file changed, 22 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/madvise/madvise09.c +22 -4
index f744405..25cf81f 100644
@@ -53,12 +53,14 @@
   #include<errno.h>
   #include<stdio.h>
   #include<ctype.h>
+#include<sys/mount.h>
 
   #include "tst_test.h"
   #include "lapi/mmap.h"
 
-#define MEMCG_PATH "/sys/fs/cgroup/memory/"
+#define MEMCG_PATH "/dev/memcg_madvise09/"
 
+static int memcg_mounted;
   static char cgroup_path[PATH_MAX];
   static char tasks_path[PATH_MAX];
   static char limit_in_bytes_path[PATH_MAX];
@@ -277,6 +279,15 @@ static void cleanup(void)
   {
       if (cgroup_path[0]&&   !access(cgroup_path, F_OK))
           rmdir(cgroup_path);
+
+    if (memcg_mounted) {
+        tst_res(TINFO, "Umount memory cgroup after testing");
+        SAFE_UMOUNT(MEMCG_PATH);
+        memcg_mounted = 0;
+    }
+
+    if (!access(MEMCG_PATH, F_OK)&&   rmdir(MEMCG_PATH))
+        tst_res(TWARN | TERRNO, "Rmdir %s failed", MEMCG_PATH);
   }
 
   static void run(void)
@@ -316,10 +327,17 @@ static void setup(void)
   {
       long int swap_total;
 
-    if (access(MEMCG_PATH, F_OK)) {
-        tst_brk(TCONF, "'" MEMCG_PATH
-            "' not present, CONFIG_MEMCG missing?");
+    SAFE_MKDIR(MEMCG_PATH, 0777);
+
+    tst_res(TINFO, "Mount memory cgroup on %s", MEMCG_PATH);
+    if (mount("memcg", MEMCG_PATH, "cgroup", 0, "memory") == -1) {
+        if (errno == ENODEV) {
+            tst_brk(TCONF,
+                 "Memory cgroup was not configured in kernel");
+        }
+        tst_brk(TBROK | TERRNO, "Failed to mount memory cgroup");
       }
+    memcg_mounted = 1;
 
Quoted 4 lines

testcases/kernel/syscalls/madvise/madvise09.c static void setup(void) · line 343

Quoted 2 lines
testcases/kernel/syscalls/madvise/madvise09.c +0 -0
       if (!access(MEMCG_PATH "memory.memsw.limit_in_bytes", F_OK))
           swap_accounting_enabled = 1;

.

.

#9 lore raw

PATCH v2 1/1 syscalls/madvise09.c: Use custom mount point instead of /sys/fs/cgroup/memory

Hi!

Quoted 1 line

Adding Cyril to CC. :-)

I guess that it's time to create some kind of libary API for initializing cgroups since we have various fallbacks etc. scattered all around the place. I.e. something where we request the type of cgroup and get back a path to use.

Let's look into that once we are done with the release.

Signature · 2 lines
Cyril Hrubis
[email protected]