Mainly to reduce code duplication. Also, to add an option for ksm01 to
use a different memory allocation unit size to take advantage of
THP. In addition, adjust ksm01 according the latest upstream
development effort,
http://marc.info/?l=linux-mm&m=129473104716901&w=2
http://marc.info/?l=linux-mm&m=129442718808733&w=2
Signed-off-by: CAI Qian <[email protected]>
---
testcases/kernel/mem/ksm/ksm01.c | 448 +------------------------------------
testcases/kernel/mem/oom/oom01.c | 4 +-
testcases/kernel/mem/oom/oom02.c | 4 +-
testcases/kernel/mem/oom/oom03.c | 4 +-
testcases/kernel/mem/oom/oom04.c | 36 +---
5 files changed, 17 insertions(+), 479 deletions(-)
diff --git a/testcases/kernel/mem/ksm/ksm01.c b/testcases/kernel/mem/ksm/ksm01.c
index 09f71d7..26c5aa7 100644
--- a/testcases/kernel/mem/ksm/ksm01.c
+++ b/testcases/kernel/mem/ksm/ksm01.c
@@ -1,5 +1,5 @@
/*
- * functional testing for Kernel Samepage Merging (KSM)
+ * Kernel Samepage Merging (KSM)
*
* Basic tests were to start several programs with same and different
* memory contents and ensure only to merge the ones with the same
@@ -69,9 +69,7 @@
#include <errno.h>
#include "test.h"
#include "usctest.h"
-
-#define _PATH_KSM "/sys/kernel/mm/ksm/"
-#define MB (1024 * 1024)
+#include "../include/mem.h"
char *TCID = "ksm01";
int TST_TOTAL = 1;
@@ -85,455 +83,35 @@ static option_t options[] = {
{ "s:", &opt_size, &opt_sizestr},
{ NULL, NULL, NULL}
};
-static void setup(void);
-static void ksmtest(void);
-static void usage(void);
-static void check(char *path, char *path2, long int value);
-static void verify(char value, int proc, int start, int end, int start2,
- int end2);
-static void group_check(int run, int pages_shared, int pages_sharing,
- int pages_volatile, int pages_unshared,
- int sleep_millisecs, int pages_to_scan);
int main(int argc, char *argv[])
{
int lc;
char *msg;
+ int size = 128, num = 3, unit = 1;
- msg = parse_opts(argc, argv, options, usage);
- if (msg != (char *)NULL)
- tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
+ msg = parse_opts(argc, argv, ksm_options, ksm_usage);
+ if (msg != NULL)
+ tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
setup();
for (lc = 0; TEST_LOOPING(lc); lc++) {
Tst_count = 0;
- ksmtest();
+ check_ksm_options(&size, &num, &unit);
+ create_same_memory(size, num, unit);
}
- tst_exit();
-}
-
-void ksmtest(void)
-{
- char buf[BUFSIZ], buf2[BUFSIZ];
- int i, j, status, k, fd, *child;
- int size = 128, num = 3;
-
- if (opt_size) {
- size = atoi(opt_sizestr);
- if (size < 1)
- tst_brkm(TBROK, NULL,
- "size cannot be less than 1.");
- }
- if (opt_num) {
- num = atoi(opt_numstr);
- if (num < 3)
- tst_brkm(TBROK, NULL,
- "process number cannot be less 3.");
- }
- child = malloc(num);
- if (child == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
-
- memory = malloc(num * sizeof(**memory));
- if (memory == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
-
- switch (child[0] = fork()) {
- case -1:
- tst_brkm(TBROK|TERRNO, NULL, "fork");
- case 0:
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 0 continues...");
-
- /* Avoid TransparentHugePage allocation which can't ksm at the
- moment. */
- tst_resm(TINFO, "child 0 allocates %d MB filled with 'c'.",
- size);
- memory[0] = malloc(size * sizeof(*memory));
- if (memory[0] == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
- for (j = 0; j < size; j++) {
- memory[0][j] = mmap(NULL, MB, PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
- if (memory[0][j] == MAP_FAILED)
- tst_brkm(TBROK|TERRNO, NULL, "mmap");
- if (madvise(memory[0][j], MB, MADV_MERGEABLE) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "madvise");
- for (i = 0; i < MB; i++)
- memory[0][j][i] = 'c';
- }
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 0 continues...");
- verify('c', 0, 0, size, 0, MB);
- tst_resm(TINFO, "child 0 changes memory content to 'd'.");
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[0][j][i] = 'd';
- }
- /* Unmerge. */
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 0 continues...");
- verify('d', 0, 0, size, 0, MB);
- /* Stop. */
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 0 continues...");
- exit(0);
- }
- switch (child[1] = fork()) {
- case -1:
- tst_brkm(TBROK|TERRNO, NULL, "fork");
- case 0:
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- tst_resm(TINFO, "child 1 allocates %d MB filled with 'a'.",
- size);
- memory[1] = malloc(size * sizeof(*memory));
- if (memory[1] == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
- for (j = 0; j < size; j++) {
- memory[1][j] = mmap(NULL, MB, PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
- if (memory[1][j] == MAP_FAILED)
- tst_brkm(TBROK|TERRNO, NULL, "mmap");
- if (madvise(memory[1][j], MB, MADV_MERGEABLE) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "madvise");
- for (i = 0; i < MB; i++)
- memory[1][j][i] = 'a';
- }
-
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- verify('a', 1, 0, size, 0, MB);
- tst_resm(TINFO, "child 1 changes memory content to 'b'.");
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[1][j][i] = 'b';
- }
-
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- verify('b', 1, 0, size, 0, MB);
- tst_resm(TINFO, "child 1 changes memory content to 'd'");
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[1][j][i] = 'd';
- }
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 1 continues...");
- verify('d', 1, 0, size, 0, MB);
- tst_resm(TINFO, "child 1 changes one page to 'e'.");
- memory[1][size - 1][MB - 1] = 'e';
-
- /* Unmerge. */
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- verify('e', 1, size - 1, size, MB - 1, MB);
- verify('d', 1, 0, size - 1, 0, MB - 1);
-
- /* Stop. */
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- exit(0);
- }
- for (k = 2; k < num; k++) {
- switch (child[k] = fork()) {
- case -1:
- tst_brkm(TBROK|TERRNO, NULL, "fork");
- case 0:
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
- tst_resm(TINFO, "child %d allocates %d "
- "MB filled with 'a'.", k, size);
- memory[k] = malloc(size * sizeof(*memory));
- if (memory[k] == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
- for (j = 0; j < size; j++) {
- memory[k][j] = mmap(NULL, MB,
- PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS
- |MAP_PRIVATE, -1, 0);
- if (memory[k][j] == MAP_FAILED)
- tst_brkm(TBROK|TERRNO, NULL,
- "mmap");
- if (madvise(memory[k][j], MB,
- MADV_MERGEABLE) == -1)
- tst_brkm(TBROK|TERRNO, NULL,
- "madvise");
- for (i = 0; i < MB; i++)
- memory[k][j][i] = 'a';
- }
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
- tst_resm(TINFO, "child %d changes memory content to "
- "'d'", k);
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[k][j][i] = 'd';
- }
- /* Unmerge. */
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
-
- /* Stop. */
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
- exit(0);
- }
- }
- tst_resm(TINFO, "KSM merging...");
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "run");
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, "1", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "pages_to_scan");
- snprintf(buf2, BUFSIZ, "%d", size * 256 * num);
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, buf2, strlen(buf2)) != strlen(buf2))
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
-
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "sleep_millisecs");
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, "0", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
-
- tst_resm(TINFO, "wait for all children to stop.");
- for (k = 0; k < num; k++) {
- if (waitpid(child[k], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child %d was not stopped.",
- k);
- }
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- group_check(1, 2, size * num * 256 - 2, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for child 1 to stop.");
- if (waitpid(child[1], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child 1 was not stopped.");
-
- /* Child 1 changes all pages to 'b'. */
- tst_resm(TINFO, "resume child 1.");
- if (kill(child[1], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- group_check(1, 3, size * num * 256 - 3, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for child 1 to stop.");
- if (waitpid(child[1], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child 1 was not stopped.");
-
- /* All children change pages to 'd'. */
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- group_check(1, 1, size * num * 256 - 1, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for all children to stop.");
- for (k = 0; k < num; k++) {
- if (waitpid(child[k], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child %d was not stopped.",
- k);
- }
- /* Child 1 changes pages to 'e'. */
- tst_resm(TINFO, "resume child 1.");
- if (kill(child[1], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- group_check(1, 1, size * num * 256 - 2, 0, 1, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for child 1 to stop.");
- if (waitpid(child[1], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child 1 was not stopped.");
-
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- tst_resm(TINFO, "KSM unmerging...");
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "run");
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, "2", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- group_check(2, 0, 0, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for all children to stop.");
- for (k = 0; k < num; k++) {
- if (waitpid(child[k], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child %d was not stopped.",
- k);
- }
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- tst_resm(TINFO, "stop KSM.");
- if (lseek(fd, 0, SEEK_SET) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "lseek");
- if (write(fd, "0", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
- group_check(0, 0, 0, 0, 0, 0, size * 256 * num);
- while (waitpid(-1, &status, WUNTRACED | WCONTINUED) > 0)
- if (WEXITSTATUS(status) != 0)
- tst_resm(TFAIL, "child exit status is %d",
- WEXITSTATUS(status));
+ cleanup();
}
void setup(void)
{
- char buf[BUFSIZ];
- struct stat new;
+ tst_require_root(tst_exit);
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "run");
- if (stat(buf, &new) == -1) {
- if (errno == ENOENT)
- tst_brkm(TCONF, NULL, "no KSM.");
- else
- tst_brkm(TBROK, NULL, "stat");
- }
- /*
- * setup a default signal hander and a
- * temporary working directory.
- */
tst_sig(FORK, DEF_HANDLER, NULL);
TEST_PAUSE;
}
-void usage(void)
+void cleanup(void)
{
- printf(" -n Number of processes\n");
- printf(" -s Memory allocation size in MB\n");
-}
-
-/* There is currently a bug will cause the test failure - *
- http://marc.info/?l=linux-mm&m=128928530308526&w=2 . Since it has
- still been discussed upstream, the interface here was added some
- flexiblity with path2, so it is possible to make changes here depends
- on the future implementation in kernel. For example, to verify
- (pages_sharing + pages_volatile) instead of a single item. */
-void check(char *path, char *path2, long int value)
-{
- FILE *fp;
- char buf[BUFSIZ], buf2[BUFSIZ];
-
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, path);
- fp = fopen(buf, "r");
- if (fp == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fopen");
- if (fgets(buf, BUFSIZ, fp) == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fgets");
- fclose(fp);
-
- tst_resm(TINFO, "%s is %ld.", path, atol(buf));
- if (path2 != NULL) {
- snprintf(buf2, BUFSIZ, "%s%s", _PATH_KSM, path2);
- fp = fopen(buf2, "r");
- if (fp == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fopen");
- if (fgets(buf2, BUFSIZ, fp) == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fgets");
- fclose(fp);
-
- tst_resm(TINFO, "%s is %ld.", path2, atol(buf2));
- if (atol(buf) + atol(buf2) != value)
- tst_resm(TFAIL, "%s + %s is not %ld.", path, path2,
- value);
- } else
- if (atol(buf) != value)
- tst_resm(TFAIL, "%s is not %ld.", path, value);
-}
-
-void verify(char value, int proc, int start, int end, int start2, int end2)
-{
- int i, j;
- void *s = NULL;
-
- s = malloc((end - start) * (end2 - start2));
- if (s == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
-
- tst_resm(TINFO, "child %d verifies memory content.", proc);
- memset(s, value, (end - start) * (end2 - start2));
- if (memcmp(memory[proc][start], s, (end - start) * (end2 - start2)) !=
0)
- for (j = start; j < end; j++)
- for (i = start2; i < end2; i++)
- if (memory[proc][j][i] != value)
- tst_resm(TFAIL, "child %d has %c at "
- "%d,%d,%d.",
- proc, memory[proc][j][i], proc,
- j, i);
- free(s);
+ TEST_CLEANUP;
+ tst_exit();
}
-
-void group_check(int run, int pages_shared, int pages_sharing,
- int pages_volatile, int pages_unshared,
- int sleep_millisecs, int pages_to_scan)
-{
- /* 5 seconds for ksm to scan pages. */
- sleep(5);
- tst_resm(TINFO, "check!");
- check("run", NULL, run);
- check("pages_shared", NULL, pages_shared);
- check("pages_sharing", NULL, pages_sharing);
- check("pages_volatile", NULL, pages_volatile);
- check("pages_unshared", NULL, pages_unshared);
- check("sleep_millisecs", NULL, sleep_millisecs);
- check("pages_to_scan", NULL, pages_to_scan);
-}
\ No newline at end of file
diff --git a/testcases/kernel/mem/oom/oom01.c b/testcases/kernel/mem/oom/oom01.c
index c670d90..8c31458 100644
--- a/testcases/kernel/mem/oom/oom01.c
+++ b/testcases/kernel/mem/oom/oom01.c
@@ -38,14 +38,12 @@
#include <unistd.h>
#include "test.h"
#include "usctest.h"
-#include "lib/oom.h"
+#include "../include/mem.h"
char *TCID = "oom01";
int TST_TOTAL = 1;
extern int Tst_count;
-static void setup(void);
-
int main(int argc, char *argv[])
{
char *msg;
diff --git a/testcases/kernel/mem/oom/oom02.c b/testcases/kernel/mem/oom/oom02.c
index 68ed1ef..04c6507 100644
--- a/testcases/kernel/mem/oom/oom02.c
+++ b/testcases/kernel/mem/oom/oom02.c
@@ -42,9 +42,7 @@ int TST_TOTAL = 1;
#include <fcntl.h>
#include
#include <errno.h>
-#include "lib/oom.h"
-
-static void setup(void);
+#include "../include/mem.h"
int main(int argc, char *argv[])
{
diff --git a/testcases/kernel/mem/oom/oom03.c b/testcases/kernel/mem/oom/oom03.c
index dd09467..3c16018 100644
--- a/testcases/kernel/mem/oom/oom03.c
+++ b/testcases/kernel/mem/oom/oom03.c
@@ -35,14 +35,12 @@
#include <errno.h>
#include "test.h"
#include "usctest.h"
-#include "lib/oom.h"
+#include "../include/mem.h"
char *TCID = "oom03";
int TST_TOTAL = 1;
extern int Tst_count;
-static void setup(void);
-
int main(int argc, char *argv[])
{
char *msg;
diff --git a/testcases/kernel/mem/oom/oom04.c b/testcases/kernel/mem/oom/oom04.c
index 1dff85e..ce3161c 100644
--- a/testcases/kernel/mem/oom/oom04.c
+++ b/testcases/kernel/mem/oom/oom04.c
@@ -48,41 +48,7 @@ extern int Tst_count;
#include
#include <unistd.h>
#include <errno.h>
-#include <stdlib.h>
-#include
-#include <errno.h>
-#include
-#include <unistd.h>
-#include <stdarg.h>
-
-#define MAXNODES 512
-#define CPATH "/dev/cpuset"
-#define CPATH_NEW CPATH "/1"
-#define MEMCG_PATH "/dev/cgroup"
-#define MEMCG_PATH_NEW MEMCG_PATH "/1"
-#define _PATH_SYS_SYSTEM "/sys/devices/system"
-#define LENGTH (3UL<<30)
-#define TESTMEM (1UL<<30)
-#define MB (1UL<<20)
-#define NORMAL 1
-#define MLOCK 2
-#define KSM 3
-#define SYSFS_OVER "/proc/sys/vm/overcommit_memory"
-
-static char overcommit[BUFSIZ];
-
-static void setup(void);
-static void cleanup(void) LTP_ATTRIBUTE_NORETURN;
-static void oom(int testcase, int mempolicy, int lite);
-static long count_numa(void);
-static int path_exist(const char *path, ...);
-static void testoom(int mempolicy, int lite);
-static void alloc_mem(long int length, int testcase);
-static void test_alloc(int testcase, int lite);
-static void gather_cpus(char *cpus);
-static void umount_mem(char *path, char *path_new);
-static void mount_mem(char *name, char *fs, char *options, char *path,
- char *path_new);
+#include "../include/mem.h"
int main(int argc, char *argv[])
{
--
1.7.3.2From e66709488987a5dfc5c362152933c68796090c07 Mon Sep 17 00:00:00 2001
From: CAI Qian <[email protected]>
Date: Tue, 18 Jan 2011 11:07:44 +0800
Subject: [PATCH 1/3] rework code for oom and ksm tests
Mainly to reduce code duplication. Also, to add an option for ksm01 to
use a different memory allocation unit size to take advantage of
THP. In addition, adjust ksm01 according the latest upstream
development effort,
http://marc.info/?l=linux-mm&m=129473104716901&w=2
http://marc.info/?l=linux-mm&m=129442718808733&w=2
Signed-off-by: CAI Qian <[email protected]>
---
testcases/kernel/mem/ksm/ksm01.c | 448 +------------------------------------
testcases/kernel/mem/oom/oom01.c | 4 +-
testcases/kernel/mem/oom/oom02.c | 4 +-
testcases/kernel/mem/oom/oom03.c | 4 +-
testcases/kernel/mem/oom/oom04.c | 36 +---
5 files changed, 17 insertions(+), 479 deletions(-)
diff --git a/testcases/kernel/mem/ksm/ksm01.c b/testcases/kernel/mem/ksm/ksm01.c
index 09f71d7..26c5aa7 100644
--- a/testcases/kernel/mem/ksm/ksm01.c
+++ b/testcases/kernel/mem/ksm/ksm01.c
@@ -1,5 +1,5 @@
/*
- * functional testing for Kernel Samepage Merging (KSM)
+ * Kernel Samepage Merging (KSM)
*
* Basic tests were to start several programs with same and different
* memory contents and ensure only to merge the ones with the same
@@ -69,9 +69,7 @@
#include <errno.h>
#include "test.h"
#include "usctest.h"
-
-#define _PATH_KSM "/sys/kernel/mm/ksm/"
-#define MB (1024 * 1024)
+#include "../include/mem.h"
char *TCID = "ksm01";
int TST_TOTAL = 1;
@@ -85,455 +83,35 @@ static option_t options[] = {
{ "s:", &opt_size, &opt_sizestr},
{ NULL, NULL, NULL}
};
-static void setup(void);
-static void ksmtest(void);
-static void usage(void);
-static void check(char *path, char *path2, long int value);
-static void verify(char value, int proc, int start, int end, int start2,
- int end2);
-static void group_check(int run, int pages_shared, int pages_sharing,
- int pages_volatile, int pages_unshared,
- int sleep_millisecs, int pages_to_scan);
int main(int argc, char *argv[])
{
int lc;
char *msg;
+ int size = 128, num = 3, unit = 1;
- msg = parse_opts(argc, argv, options, usage);
- if (msg != (char *)NULL)
- tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
+ msg = parse_opts(argc, argv, ksm_options, ksm_usage);
+ if (msg != NULL)
+ tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
setup();
for (lc = 0; TEST_LOOPING(lc); lc++) {
Tst_count = 0;
- ksmtest();
+ check_ksm_options(&size, &num, &unit);
+ create_same_memory(size, num, unit);
}
- tst_exit();
-}
-
-void ksmtest(void)
-{
- char buf[BUFSIZ], buf2[BUFSIZ];
- int i, j, status, k, fd, *child;
- int size = 128, num = 3;
-
- if (opt_size) {
- size = atoi(opt_sizestr);
- if (size < 1)
- tst_brkm(TBROK, NULL,
- "size cannot be less than 1.");
- }
- if (opt_num) {
- num = atoi(opt_numstr);
- if (num < 3)
- tst_brkm(TBROK, NULL,
- "process number cannot be less 3.");
- }
- child = malloc(num);
- if (child == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
-
- memory = malloc(num * sizeof(**memory));
- if (memory == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
-
- switch (child[0] = fork()) {
- case -1:
- tst_brkm(TBROK|TERRNO, NULL, "fork");
- case 0:
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 0 continues...");
-
- /* Avoid TransparentHugePage allocation which can't ksm at the
- moment. */
- tst_resm(TINFO, "child 0 allocates %d MB filled with 'c'.",
- size);
- memory[0] = malloc(size * sizeof(*memory));
- if (memory[0] == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
- for (j = 0; j < size; j++) {
- memory[0][j] = mmap(NULL, MB, PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
- if (memory[0][j] == MAP_FAILED)
- tst_brkm(TBROK|TERRNO, NULL, "mmap");
- if (madvise(memory[0][j], MB, MADV_MERGEABLE) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "madvise");
- for (i = 0; i < MB; i++)
- memory[0][j][i] = 'c';
- }
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 0 continues...");
- verify('c', 0, 0, size, 0, MB);
- tst_resm(TINFO, "child 0 changes memory content to 'd'.");
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[0][j][i] = 'd';
- }
- /* Unmerge. */
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 0 continues...");
- verify('d', 0, 0, size, 0, MB);
- /* Stop. */
- tst_resm(TINFO, "child 0 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 0 continues...");
- exit(0);
- }
- switch (child[1] = fork()) {
- case -1:
- tst_brkm(TBROK|TERRNO, NULL, "fork");
- case 0:
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- tst_resm(TINFO, "child 1 allocates %d MB filled with 'a'.",
- size);
- memory[1] = malloc(size * sizeof(*memory));
- if (memory[1] == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
- for (j = 0; j < size; j++) {
- memory[1][j] = mmap(NULL, MB, PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
- if (memory[1][j] == MAP_FAILED)
- tst_brkm(TBROK|TERRNO, NULL, "mmap");
- if (madvise(memory[1][j], MB, MADV_MERGEABLE) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "madvise");
- for (i = 0; i < MB; i++)
- memory[1][j][i] = 'a';
- }
-
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- verify('a', 1, 0, size, 0, MB);
- tst_resm(TINFO, "child 1 changes memory content to 'b'.");
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[1][j][i] = 'b';
- }
-
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- verify('b', 1, 0, size, 0, MB);
- tst_resm(TINFO, "child 1 changes memory content to 'd'");
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[1][j][i] = 'd';
- }
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
-
- tst_resm(TINFO, "child 1 continues...");
- verify('d', 1, 0, size, 0, MB);
- tst_resm(TINFO, "child 1 changes one page to 'e'.");
- memory[1][size - 1][MB - 1] = 'e';
-
- /* Unmerge. */
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- verify('e', 1, size - 1, size, MB - 1, MB);
- verify('d', 1, 0, size - 1, 0, MB - 1);
-
- /* Stop. */
- tst_resm(TINFO, "child 1 stops.");
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child 1 continues...");
- exit(0);
- }
- for (k = 2; k < num; k++) {
- switch (child[k] = fork()) {
- case -1:
- tst_brkm(TBROK|TERRNO, NULL, "fork");
- case 0:
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
- tst_resm(TINFO, "child %d allocates %d "
- "MB filled with 'a'.", k, size);
- memory[k] = malloc(size * sizeof(*memory));
- if (memory[k] == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
- for (j = 0; j < size; j++) {
- memory[k][j] = mmap(NULL, MB,
- PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS
- |MAP_PRIVATE, -1, 0);
- if (memory[k][j] == MAP_FAILED)
- tst_brkm(TBROK|TERRNO, NULL,
- "mmap");
- if (madvise(memory[k][j], MB,
- MADV_MERGEABLE) == -1)
- tst_brkm(TBROK|TERRNO, NULL,
- "madvise");
- for (i = 0; i < MB; i++)
- memory[k][j][i] = 'a';
- }
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
- tst_resm(TINFO, "child %d changes memory content to "
- "'d'", k);
- for (j = 0; j < size; j++) {
- for (i = 0; i < MB; i++)
- memory[k][j][i] = 'd';
- }
- /* Unmerge. */
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
-
- /* Stop. */
- tst_resm(TINFO, "child %d stops.", k);
- if (raise(SIGSTOP) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- tst_resm(TINFO, "child %d continues...", k);
- exit(0);
- }
- }
- tst_resm(TINFO, "KSM merging...");
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "run");
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, "1", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "pages_to_scan");
- snprintf(buf2, BUFSIZ, "%d", size * 256 * num);
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, buf2, strlen(buf2)) != strlen(buf2))
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
-
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "sleep_millisecs");
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, "0", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
-
- tst_resm(TINFO, "wait for all children to stop.");
- for (k = 0; k < num; k++) {
- if (waitpid(child[k], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child %d was not stopped.",
- k);
- }
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- group_check(1, 2, size * num * 256 - 2, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for child 1 to stop.");
- if (waitpid(child[1], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child 1 was not stopped.");
-
- /* Child 1 changes all pages to 'b'. */
- tst_resm(TINFO, "resume child 1.");
- if (kill(child[1], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- group_check(1, 3, size * num * 256 - 3, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for child 1 to stop.");
- if (waitpid(child[1], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child 1 was not stopped.");
-
- /* All children change pages to 'd'. */
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- group_check(1, 1, size * num * 256 - 1, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for all children to stop.");
- for (k = 0; k < num; k++) {
- if (waitpid(child[k], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child %d was not stopped.",
- k);
- }
- /* Child 1 changes pages to 'e'. */
- tst_resm(TINFO, "resume child 1.");
- if (kill(child[1], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill");
- group_check(1, 1, size * num * 256 - 2, 0, 1, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for child 1 to stop.");
- if (waitpid(child[1], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child 1 was not stopped.");
-
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- tst_resm(TINFO, "KSM unmerging...");
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "run");
- fd = open(buf, O_WRONLY);
- if (fd == -1)
- tst_brkm(TBROK|TERRNO, NULL, "open");
- if (write(fd, "2", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- group_check(2, 0, 0, 0, 0, 0, size * 256 * num);
-
- tst_resm(TINFO, "wait for all children to stop.");
- for (k = 0; k < num; k++) {
- if (waitpid(child[k], &status, WUNTRACED) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "waitpid");
- if (!WIFSTOPPED(status))
- tst_brkm(TBROK, NULL, "child %d was not stopped.",
- k);
- }
- tst_resm(TINFO, "resume all children.");
- for (k = 0; k < num; k++) {
- if (kill(child[k], SIGCONT) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "kill child[%d]", k);
- }
- tst_resm(TINFO, "stop KSM.");
- if (lseek(fd, 0, SEEK_SET) == -1)
- tst_brkm(TBROK|TERRNO, NULL, "lseek");
- if (write(fd, "0", 1) != 1)
- tst_brkm(TBROK|TERRNO, NULL, "write");
- close(fd);
- group_check(0, 0, 0, 0, 0, 0, size * 256 * num);
- while (waitpid(-1, &status, WUNTRACED | WCONTINUED) > 0)
- if (WEXITSTATUS(status) != 0)
- tst_resm(TFAIL, "child exit status is %d",
- WEXITSTATUS(status));
+ cleanup();
}
void setup(void)
{
- char buf[BUFSIZ];
- struct stat new;
+ tst_require_root(tst_exit);
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, "run");
- if (stat(buf, &new) == -1) {
- if (errno == ENOENT)
- tst_brkm(TCONF, NULL, "no KSM.");
- else
- tst_brkm(TBROK, NULL, "stat");
- }
- /*
- * setup a default signal hander and a
- * temporary working directory.
- */
tst_sig(FORK, DEF_HANDLER, NULL);
TEST_PAUSE;
}
-void usage(void)
+void cleanup(void)
{
- printf(" -n Number of processes\n");
- printf(" -s Memory allocation size in MB\n");
-}
-
-/* There is currently a bug will cause the test failure - *
- http://marc.info/?l=linux-mm&m=128928530308526&w=2 . Since it has
- still been discussed upstream, the interface here was added some
- flexiblity with path2, so it is possible to make changes here depends
- on the future implementation in kernel. For example, to verify
- (pages_sharing + pages_volatile) instead of a single item. */
-void check(char *path, char *path2, long int value)
-{
- FILE *fp;
- char buf[BUFSIZ], buf2[BUFSIZ];
-
- snprintf(buf, BUFSIZ, "%s%s", _PATH_KSM, path);
- fp = fopen(buf, "r");
- if (fp == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fopen");
- if (fgets(buf, BUFSIZ, fp) == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fgets");
- fclose(fp);
-
- tst_resm(TINFO, "%s is %ld.", path, atol(buf));
- if (path2 != NULL) {
- snprintf(buf2, BUFSIZ, "%s%s", _PATH_KSM, path2);
- fp = fopen(buf2, "r");
- if (fp == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fopen");
- if (fgets(buf2, BUFSIZ, fp) == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "fgets");
- fclose(fp);
-
- tst_resm(TINFO, "%s is %ld.", path2, atol(buf2));
- if (atol(buf) + atol(buf2) != value)
- tst_resm(TFAIL, "%s + %s is not %ld.", path, path2,
- value);
- } else
- if (atol(buf) != value)
- tst_resm(TFAIL, "%s is not %ld.", path, value);
-}
-
-void verify(char value, int proc, int start, int end, int start2, int end2)
-{
- int i, j;
- void *s = NULL;
-
- s = malloc((end - start) * (end2 - start2));
- if (s == NULL)
- tst_brkm(TBROK|TERRNO, NULL, "malloc");
-
- tst_resm(TINFO, "child %d verifies memory content.", proc);
- memset(s, value, (end - start) * (end2 - start2));
- if (memcmp(memory[proc][start], s, (end - start) * (end2 - start2)) != 0)
- for (j = start; j < end; j++)
- for (i = start2; i < end2; i++)
- if (memory[proc][j][i] != value)
- tst_resm(TFAIL, "child %d has %c at "
- "%d,%d,%d.",
- proc, memory[proc][j][i], proc,
- j, i);
- free(s);
+ TEST_CLEANUP;
+ tst_exit();
}
-
-void group_check(int run, int pages_shared, int pages_sharing,
- int pages_volatile, int pages_unshared,
- int sleep_millisecs, int pages_to_scan)
-{
- /* 5 seconds for ksm to scan pages. */
- sleep(5);
- tst_resm(TINFO, "check!");
- check("run", NULL, run);
- check("pages_shared", NULL, pages_shared);
- check("pages_sharing", NULL, pages_sharing);
- check("pages_volatile", NULL, pages_volatile);
- check("pages_unshared", NULL, pages_unshared);
- check("sleep_millisecs", NULL, sleep_millisecs);
- check("pages_to_scan", NULL, pages_to_scan);
-}
\ No newline at end of file
diff --git a/testcases/kernel/mem/oom/oom01.c b/testcases/kernel/mem/oom/oom01.c
index c670d90..8c31458 100644
--- a/testcases/kernel/mem/oom/oom01.c
+++ b/testcases/kernel/mem/oom/oom01.c
@@ -38,14 +38,12 @@
#include <unistd.h>
#include "test.h"
#include "usctest.h"
-#include "lib/oom.h"
+#include "../include/mem.h"
char *TCID = "oom01";
int TST_TOTAL = 1;
extern int Tst_count;
-static void setup(void);
-
int main(int argc, char *argv[])
{
char *msg;
diff --git a/testcases/kernel/mem/oom/oom02.c b/testcases/kernel/mem/oom/oom02.c
index 68ed1ef..04c6507 100644
--- a/testcases/kernel/mem/oom/oom02.c
+++ b/testcases/kernel/mem/oom/oom02.c
@@ -42,9 +42,7 @@ int TST_TOTAL = 1;
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
-#include "lib/oom.h"
-
-static void setup(void);
+#include "../include/mem.h"
int main(int argc, char *argv[])
{
diff --git a/testcases/kernel/mem/oom/oom03.c b/testcases/kernel/mem/oom/oom03.c
index dd09467..3c16018 100644
--- a/testcases/kernel/mem/oom/oom03.c
+++ b/testcases/kernel/mem/oom/oom03.c
@@ -35,14 +35,12 @@
#include <errno.h>
#include "test.h"
#include "usctest.h"
-#include "lib/oom.h"
+#include "../include/mem.h"
char *TCID = "oom03";
int TST_TOTAL = 1;
extern int Tst_count;
-static void setup(void);
-
int main(int argc, char *argv[])
{
char *msg;
diff --git a/testcases/kernel/mem/oom/oom04.c b/testcases/kernel/mem/oom/oom04.c
index 1dff85e..ce3161c 100644
--- a/testcases/kernel/mem/oom/oom04.c
+++ b/testcases/kernel/mem/oom/oom04.c
@@ -48,41 +48,7 @@ extern int Tst_count;
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-#include <unistd.h>
-#include <stdarg.h>
-
-#define MAXNODES 512
-#define CPATH "/dev/cpuset"
-#define CPATH_NEW CPATH "/1"
-#define MEMCG_PATH "/dev/cgroup"
-#define MEMCG_PATH_NEW MEMCG_PATH "/1"
-#define _PATH_SYS_SYSTEM "/sys/devices/system"
-#define LENGTH (3UL<<30)
-#define TESTMEM (1UL<<30)
-#define MB (1UL<<20)
-#define NORMAL 1
-#define MLOCK 2
-#define KSM 3
-#define SYSFS_OVER "/proc/sys/vm/overcommit_memory"
-
-static char overcommit[BUFSIZ];
-
-static void setup(void);
-static void cleanup(void) LTP_ATTRIBUTE_NORETURN;
-static void oom(int testcase, int mempolicy, int lite);
-static long count_numa(void);
-static int path_exist(const char *path, ...);
-static void testoom(int mempolicy, int lite);
-static void alloc_mem(long int length, int testcase);
-static void test_alloc(int testcase, int lite);
-static void gather_cpus(char *cpus);
-static void umount_mem(char *path, char *path_new);
-static void mount_mem(char *name, char *fs, char *options, char *path,
- char *path_new);
+#include "../include/mem.h"
int main(int argc, char *argv[])
{
--
1.7.3.2
------------------------------------------------------------------------------
Protect Your Site and Customers from Malware Attacks
Learn about various malware tactics and how to avoid them. Understand
malware threats, the impact they can have on your business, and how you
can protect your company and customers by using code signing.
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list