* [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API
@ 2020-12-08 13:28 Petr Vorel
2020-12-08 13:54 ` Petr Vorel
2020-12-09 13:19 ` Cyril Hrubis
0 siblings, 2 replies; 5+ messages in thread
From: Petr Vorel @ 2020-12-08 13:28 UTC (permalink / raw)
To: ltp
Also finally remove common_j_h.c and include_j_h.h,
which are no longer needed.
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
Hi,
not sure if invalid address is no longer meaningful (after removing
fix for ia64 and use NULL).
I also removed check for __NR_get_mempolicy. Originally added in LTP in
07e750af6 (2012), but that was added in kernel before 2.6.12-rc2.
Kind regards,
Petr
.../syscalls/get_mempolicy/get_mempolicy01.c | 489 ++++++++----------
testcases/kernel/syscalls/utils/common_j_h.c | 260 ----------
testcases/kernel/syscalls/utils/include_j_h.h | 143 -----
3 files changed, 216 insertions(+), 676 deletions(-)
delete mode 100644 testcases/kernel/syscalls/utils/common_j_h.c
delete mode 100644 testcases/kernel/syscalls/utils/include_j_h.h
diff --git a/testcases/kernel/syscalls/get_mempolicy/get_mempolicy01.c b/testcases/kernel/syscalls/get_mempolicy/get_mempolicy01.c
index fcb677986..d530e2bad 100644
--- a/testcases/kernel/syscalls/get_mempolicy/get_mempolicy01.c
+++ b/testcases/kernel/syscalls/get_mempolicy/get_mempolicy01.c
@@ -1,320 +1,263 @@
-/******************************************************************************/
-/* Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd */
-/* Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>, */
-/* Yumiko Sugita <yumiko.sugita.yf@hitachi.com>, */
-/* Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp> */
-/* */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
-/* the GNU General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU General Public License */
-/* along with this program; if not, write to the Free Software */
-/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-/* */
-/******************************************************************************/
-/******************************************************************************/
-/* */
-/* File: get_mempolicy01.c */
-/* */
-/* Description: This tests the get_mempolicy() syscall */
-/* */
-/* Usage: <for command-line> */
-/* get_mempolicy01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */
-/* where, -c n : Run n copies concurrently. */
-/* -e : Turn on errno logging. */
-/* -i n : Execute test n times. */
-/* -I x : Execute test for x seconds. */
-/* -P x : Pause for x seconds between iterations. */
-/* -t : Turn on syscall timing. */
-/* */
-/* Total Tests: 1 */
-/* */
-/* Test Name: get_mempolicy01 */
-/* History: Porting from Crackerjack to LTP is done by */
-/* Manas Kumar Nayak maknayak@in.ibm.com> */
-/******************************************************************************/
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
+ * Copyright (c) Linux Test Project, 2009-2020
+ * Copyright (c) Crackerjack Project, 2007-2008, Hitachi, Ltd
+ *
+ * Authors:
+ * Takahiro Yasui <takahiro.yasui.mp@hitachi.com>
+ * Yumiko Sugita <yumiko.sugita.yf@hitachi.com>
+ * Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp>
+ * Manas Kumar Nayak <maknayak@in.ibm.com> (original port to the legacy API)
+ */
#include "config.h"
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <getopt.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <libgen.h>
-#if HAVE_NUMA_H
+#include "tst_test.h"
+
+#ifdef HAVE_NUMA_V2
#include <numa.h>
-#endif
-#if HAVE_NUMAIF_H
#include <numaif.h>
-#endif
-#include "test.h"
-#include "lapi/syscalls.h"
-#include "include_j_h.h"
-#include "common_j_h.c"
+#include <errno.h>
#include "numa_helper.h"
-
-char *TCID = "get_mempolicy01";
-int TST_TOTAL = 1;
-
-#ifdef HAVE_NUMA_V2
+#include "tst_numa.h"
+#include "lapi/syscalls.h"
#define MEM_LENGTH (4 * 1024 * 1024)
-static int testno;
+#define POLICY_DESC(x) .policy = x, .desc = "policy: "#x
+#define POLICY_DESC_TEXT(x, y) .policy = x, .desc = "policy: "#x", "y
+#define POLICY_DESC_FLAGS(x, y) .policy = x, .flags = y, .desc = "policy: "#x", flags: "#y
+#define POLICY_DESC_FLAGS_TEXT(x, y, z) .policy = x, .flags = y, .desc = "policy: "#x", flags: "#y", "z
-enum test_type {
- DEFAULT, /* get default policy */
- ADDR, /* get policy of memory which include mapped address */
- INVALID_POINTER,
- INVALID_FLAGS,
-};
+static struct bitmask *nodemask, *getnodemask, *empty_nodemask;
-enum from_node {
- NONE,
- SELF,
-};
+static void test_set_mempolicy_default(unsigned int i);
+static void test_set_mempolicy_none(unsigned int i);
+static int test_mbind_none(unsigned int i);
+static int test_mbind_default(unsigned int i);
+static int set_invalid_addr(unsigned int i);
struct test_case {
- int ttype;
int policy;
- int from_node;
+ const char *desc;
+ unsigned int flags;
int ret;
int err;
+ char *addr;
+ int (*pre_test)(unsigned int i);
+ void (*test)(unsigned int i);
+ struct bitmask **exp_nodemask;
};
-/* Test cases
- *
- * test status of errors on man page
- *
- * (NONE) man page hadn't been completed.
- *
- * test status of errors NOT on man page
- *
- * EFAULT v (invalid address)
- * EINVAL v (invalid parameters)
- */
static struct test_case tcase[] = {
- { /* case00 */
- .ttype = DEFAULT,
- .policy = MPOL_DEFAULT,
- .from_node = NONE,
- .ret = 0,
- .err = 0,
- },
- { /* case01 */
- .ttype = DEFAULT,
- .policy = MPOL_BIND,
- .from_node = SELF,
- .ret = 0,
- .err = 0,
- },
- { /* case02 */
- .ttype = DEFAULT,
- .policy = MPOL_INTERLEAVE,
- .from_node = SELF,
- .ret = 0,
- .err = 0,
- },
- { /* case03 */
- .ttype = DEFAULT,
- .policy = MPOL_PREFERRED,
- .from_node = NONE,
- .ret = 0,
- .err = 0,
- },
- { /* case04 */
- .ttype = DEFAULT,
- .policy = MPOL_PREFERRED,
- .from_node = SELF,
- .ret = 0,
- .err = 0,
- },
- { /* case05 */
- .ttype = ADDR,
- .policy = MPOL_DEFAULT,
- .from_node = NONE,
- .ret = 0,
- .err = 0,
- },
- { /* case06 */
- .ttype = ADDR,
- .policy = MPOL_BIND,
- .from_node = SELF,
- .ret = 0,
- .err = 0,
- },
- { /* case07 */
- .ttype = ADDR,
- .policy = MPOL_INTERLEAVE,
- .from_node = SELF,
- .ret = 0,
- .err = 0,
- },
- { /* case08 */
- .ttype = ADDR,
- .policy = MPOL_PREFERRED,
- .from_node = NONE,
- .ret = 0,
- .err = 0,
- },
- { /* case09 */
- .ttype = ADDR,
- .policy = MPOL_PREFERRED,
- .from_node = SELF,
- .ret = 0,
- .err = 0,
- },
- { /* case10 */
- .ttype = INVALID_POINTER,
- .policy = MPOL_DEFAULT,
- .from_node = NONE,
- .ret = -1,
- .err = EFAULT,
- },
- { /* case11 */
- .ttype = INVALID_FLAGS,
- .policy = MPOL_DEFAULT,
- .from_node = NONE,
- .ret = -1,
- .err = EINVAL,
- },
+ {
+ POLICY_DESC_TEXT(MPOL_DEFAULT, "no target"),
+ .ret = 0,
+ .err = 0,
+ .test = test_set_mempolicy_none,
+ .exp_nodemask = &empty_nodemask,
+ },
+ {
+ POLICY_DESC(MPOL_BIND),
+ .ret = 0,
+ .err = 0,
+ .test = test_set_mempolicy_default,
+ },
+ {
+ POLICY_DESC(MPOL_INTERLEAVE),
+ .ret = 0,
+ .err = 0,
+ .test = test_set_mempolicy_default,
+ .exp_nodemask = &nodemask,
+ },
+ {
+ POLICY_DESC_TEXT(MPOL_PREFERRED, "no target"),
+ .ret = 0,
+ .err = 0,
+ .test = test_set_mempolicy_none,
+ .exp_nodemask = &nodemask,
+ },
+ {
+ .test = test_set_mempolicy_default,
+ POLICY_DESC(MPOL_PREFERRED),
+ .ret = 0,
+ .err = 0,
+ },
+ {
+ POLICY_DESC_FLAGS_TEXT(MPOL_DEFAULT, MPOL_F_ADDR, "no target"),
+ .ret = 0,
+ .err = 0,
+ .pre_test = test_mbind_none,
+ .test = test_set_mempolicy_none,
+ .exp_nodemask = &nodemask,
+ },
+ {
+ POLICY_DESC_FLAGS(MPOL_BIND, MPOL_F_ADDR),
+ .pre_test = test_mbind_default,
+ .ret = 0,
+ .err = 0,
+ },
+ {
+ POLICY_DESC_FLAGS(MPOL_INTERLEAVE, MPOL_F_ADDR),
+ .ret = 0,
+ .err = 0,
+ .pre_test = test_mbind_default,
+ .test = test_set_mempolicy_default,
+ .exp_nodemask = &nodemask,
+ },
+ {
+ POLICY_DESC_FLAGS_TEXT(MPOL_PREFERRED, MPOL_F_ADDR, "no target"),
+ .ret = 0,
+ .err = 0,
+ .pre_test = test_mbind_none,
+ .test = test_set_mempolicy_none,
+ .exp_nodemask = &nodemask,
+ },
+ {
+ POLICY_DESC_FLAGS(MPOL_PREFERRED, MPOL_F_ADDR),
+ .ret = 0,
+ .err = 0,
+ .pre_test = test_mbind_default,
+ .test = test_set_mempolicy_default,
+ },
+ {
+ .flags = MPOL_F_ADDR,
+ POLICY_DESC_TEXT(MPOL_DEFAULT, "invalid address"),
+ .ret = -1,
+ .err = EFAULT,
+ .pre_test = set_invalid_addr,
+ .exp_nodemask = &nodemask,
+ },
+ {
+ POLICY_DESC_TEXT(MPOL_DEFAULT, "invalid flags, no target"),
+ .flags = -1,
+ .ret = -1,
+ .err = EINVAL,
+ .test = test_set_mempolicy_none,
+ .exp_nodemask = &nodemask,
+ },
};
-static int do_test(struct test_case *tc);
-static void setup(void);
-static void cleanup(void);
+static void test_set_mempolicy_default(unsigned int i)
+{
+ struct test_case *tc = &tcase[i];
+
+ TEST(set_mempolicy(tc->policy, nodemask->maskp, nodemask->size));
+}
-int main(int argc, char **argv)
+static void test_set_mempolicy_none(unsigned int i)
{
- int i, ret, lc;
+ struct test_case *tc = &tcase[i];
- setup();
+ TEST(set_mempolicy(tc->policy, NULL, 0));
+}
+
+static int test_mbind(unsigned int i, unsigned long *maskp, unsigned long size)
+{
+ struct test_case *tc = &tcase[i];
- ret = 0;
- testno = (int)ARRAY_SIZE(tcase);
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
+ tc->addr = SAFE_MMAP(NULL, MEM_LENGTH, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
- for (i = 0; i < testno; i++) {
- tst_resm(TINFO, "(case%02d) START", i);
- ret = do_test(&tcase[i]);
- tst_resm((ret == 0 ? TPASS : TFAIL | TERRNO),
- "(case%02d) END", i);
- }
+ TEST(mbind(tc->addr, MEM_LENGTH, tc->policy, maskp, size, 0));
+
+ if (TST_RET < 0) {
+ tst_res(TFAIL | TERRNO, "mbind() failed");
+ return -1;
}
- cleanup();
- tst_exit();
+ return 0;
}
-static int do_test(struct test_case *tc)
+static int test_mbind_none(unsigned int i)
{
- int ret, err, result, cmp_ok;
- int policy, flags;
- struct bitmask *nodemask = numa_allocate_nodemask();
- struct bitmask *getnodemask = numa_allocate_nodemask();
- char *p = NULL;
- unsigned long len = MEM_LENGTH;
- int test_node = -1;
+ return test_mbind(i, NULL, 0);
+}
- ret = get_allowed_nodes(NH_MEMS, 1, &test_node);
- if (ret < 0)
- tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret);
- numa_bitmask_setbit(nodemask, test_node);
- switch (tc->ttype) {
- case DEFAULT:
- flags = 0;
- p = NULL;
- if (tc->from_node == NONE)
- TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
- NULL, 0));
- else
- TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
- nodemask->maskp, nodemask->size));
- if (TEST_RETURN < 0) {
- tst_resm(TBROK | TERRNO, "set_mempolicy");
- return -1;
- }
+static int test_mbind_default(unsigned int i)
+{
+ return test_mbind(i, nodemask->maskp, nodemask->size);
+}
- break;
- default:
- flags = MPOL_F_ADDR;
- p = mmap(NULL, len, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
- if (p == MAP_FAILED)
- tst_brkm(TBROK | TERRNO, cleanup, "mmap");
- if (tc->from_node == NONE)
- TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
- NULL, 0, 0));
- else
- TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
- nodemask->maskp, nodemask->size, 0));
- if (TEST_RETURN < 0) {
- tst_resm(TBROK | TERRNO, "mbind");
- return -1;
- }
+static int set_invalid_addr(unsigned int i)
+{
+ struct test_case *tc = &tcase[i];
+ int ret;
- if (tc->ttype == INVALID_POINTER)
-#ifdef __ia64__
- p = (char *)0x8000000000000000UL;
-#else
- p = 0;
-#endif
+ ret = test_mbind_none(i);
+ tc->addr = NULL;
- if (tc->ttype == INVALID_FLAGS)
- flags = -1;
- }
- errno = 0;
- cmp_ok = 1;
- TEST(ret = ltp_syscall(__NR_get_mempolicy, &policy, getnodemask->maskp,
- getnodemask->size, p, flags));
- err = TEST_ERRNO;
- if (ret < 0)
- goto TEST_END;
-
- /* if policy == MPOL_DEFAULT, get_mempolicy doesn't return nodemask */
- if (tc->policy == MPOL_DEFAULT)
- numa_bitmask_clearall(nodemask);
- cmp_ok = (tc->policy == policy && (tc->from_node == NONE ||
- numa_bitmask_equal(nodemask,
- getnodemask)));
-TEST_END:
- result = (err != tc->err) || !cmp_ok;
- PRINT_RESULT_CMP(0, tc->ret, tc->err, ret, err, cmp_ok);
- return result;
+ return ret;
}
-static void cleanup(void)
+
+static void setup(void)
{
- tst_rmdir();
+ if (!is_numa(NULL, NH_MEMS, 1))
+ tst_brk(TCONF, "requires NUMA with at least 1 node");
}
-static void setup(void)
+static void setup_node(void)
{
- /* check syscall availability */
- ltp_syscall(__NR_get_mempolicy, NULL, NULL, 0, NULL, 0);
+ int test_node = -1;
- if (!is_numa(NULL, NH_MEMS, 1))
- tst_brkm(TCONF, NULL, "requires NUMA with at least 1 node");
+ if (get_allowed_nodes(NH_MEMS, 1, &test_node) < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes failed");
- TEST_PAUSE;
- tst_tmpdir();
+ nodemask = numa_allocate_nodemask();
+ getnodemask = numa_allocate_nodemask();
+ numa_bitmask_setbit(nodemask, test_node);
}
-#else
-int main(void)
+static void do_test(unsigned int i)
{
- tst_brkm(TCONF, NULL, NUMA_ERROR_MSG);
+ struct test_case *tc = &tcase[i];
+ int policy;
+
+ tst_res(TINFO, "test #%d: %s", (i+1), tc->desc);
+
+ setup_node();
+
+ if (tc->pre_test)
+ if (tc->pre_test(i) == -1)
+ return;
+
+ if (tc->test) {
+ tc->test(i);
+
+ if (TST_RET < 0) {
+ tst_res(TFAIL | TERRNO, ".test failed");
+ return;
+ }
+ }
+
+ TEST(get_mempolicy(&policy, getnodemask->maskp, getnodemask->size,
+ tc->addr, tc->flags));
+
+ if (TST_RET == -1 && tc->policy == MPOL_DEFAULT)
+ numa_bitmask_clearall(nodemask);
+
+ if (tc->ret != TST_RET) {
+ tst_res(TFAIL, "wrong return code: %ld, expected: %d",
+ TST_RET, tc->ret);
+ return;
+ }
+ if (TST_RET == -1 && TST_ERR != tc->err) {
+ tst_res(TFAIL | TTERRNO, "expected errno: %s, got",
+ tst_strerrno(tc->err));
+ return;
+ }
+
+ tst_res(TPASS, "Test passed");
}
-#endif
+
+static struct tst_test test = {
+ .tcnt = ARRAY_SIZE(tcase),
+ .test = do_test,
+ .setup = setup,
+};
+
+#else
+TST_TEST_TCONF(NUMA_ERROR_MSG);
+#endif /* HAVE_NUMA_V2 */
diff --git a/testcases/kernel/syscalls/utils/common_j_h.c b/testcases/kernel/syscalls/utils/common_j_h.c
deleted file mode 100644
index dbdbc117a..000000000
--- a/testcases/kernel/syscalls/utils/common_j_h.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Crackerjack Project
- *
- * Copyright (C) 2007-2008, Hitachi, Ltd.
- * Author(s): Yumiko Sugita <yumiko.sugita.yf@hitachi.com>,
- * Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $Id: common_j_h.c,v 1.5 2009/11/20 06:48:31 yaberauneya Exp $
- *
- */
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <fcntl.h>
-#include <pwd.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <mqueue.h>
-#include "include_j_h.h"
-#include "test.h"
-
-#define barrier() __asm__ __volatile__("": : :"memory")
-#define WITH_SIGNALS_BLOCKED(code) { \
- sigset_t held_sigs_; \
- sigfillset(&held_sigs_); \
- sigprocmask(SIG_SETMASK, &held_sigs_, &held_sigs_); \
- barrier(); \
- code; \
- barrier(); \
- sigprocmask(SIG_SETMASK, &held_sigs_, NULL); \
- }
-
-/*
- * Change user ID
- *
- * We assume 'test' executable is executed with 'root' permission.
- * So, if you use this function, you can not return 'root' uid.
- */
-int setup_uid(char *uname)
-{
- struct passwd *pw;
- int rc;
-
- pw = getpwnam(uname);
- if (!pw) {
- EPRINTF("getpwnam failed.\n");
- return -1;
- }
- rc = setuid(pw->pw_uid);
- if (rc < 0) {
- EPRINTF("setuid failed.\n");
- return -1;
- }
- return 0;
-}
-
-/*
- * Change effective user ID
- */
-int setup_euid(char *uname, uid_t * old_uid)
-{
- struct passwd *pw;
- int rc;
-
- *old_uid = geteuid();
- pw = getpwnam(uname);
- if (!pw) {
- EPRINTF("getpwnam failed.\n");
- return -1;
- }
- rc = seteuid(pw->pw_uid);
- if (rc < 0) {
- EPRINTF("seteuid failed.\n");
- return -1;
- }
- return 0;
-}
-
-int cleanup_euid(uid_t old_uid)
-{
- int rc;
-
- rc = seteuid(old_uid);
- if (rc < 0) {
- EPRINTF("seteuid failed.\n");
- return -1;
- }
- return 0;
-}
-
-static void sigterm_handler(int sig)
-{
- _exit(0);
-}
-
-/*
- * Generate a child process which will send a signal
- */
-pid_t create_sig_proc(unsigned long usec, int sig, unsigned count)
-{
- pid_t pid, cpid;
-
- pid = getpid();
- WITH_SIGNALS_BLOCKED(if ((cpid = fork()) == 0) {
- tst_sig(NOFORK, SIG_DFL, NULL);
- signal(SIGTERM, sigterm_handler);}
- ) ;
- switch (cpid) {
- case 0:
- while (count-- > 0) {
- usleep(usec);
- if (kill(pid, sig) == -1)
- break;
- }
- _exit(0);
- break;
- case -1:
- EPRINTF("fork failed.\n");
- return cpid;
- default:
- return cpid;
- }
-}
-
-/*
- * Create and delete test file
- */
-int setup_file(char *testdir, char *fname, char *path)
-{
- return _setup_file(testdir, fname, path,
- O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR);
-}
-
-int _setup_file(char *testdir, char *fname, char *path, int flags, mode_t mode)
-{
- int rc;
-
- sprintf(path, "%s/%s", testdir, fname);
- rc = open(path, flags, mode);
- if (rc < 0) {
- EPRINTF("open failed.\n");
- return -1;
- }
- return rc;
-}
-
-int cleanup_file(char *path)
-{
- unlink(path);
- return 0;
-}
-
-/*
- * Create and delete swap file
- */
-/* swap file needs to be more than 40KB */
-#define MIN_SWAPFILE_SIZE (64 * 1024)
-int setup_swapfile(char *testdir, char *fname, char *path, size_t size)
-{
- int fd = -1, rc;
- size_t r_sz;
- int cmdlen = 256;
- char cmd[cmdlen];
- char *p = NULL;
-
- sprintf(path, "%s/%s", testdir, fname);
- fd = open(path, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR);
- if (fd < 0) {
- EPRINTF("open failed.\n");
- goto ERR_EXIT;
- }
- if (size < MIN_SWAPFILE_SIZE) {
- EPRINTF("size too short.\n");
- goto ERR_EXIT;
- }
- p = malloc(size);
- if (!p) {
- EPRINTF("malloc failed.\n");
- goto ERR_EXIT;
- }
- /* Swap file must not have hole area */
- memset(p, 0x5a, size);
- r_sz = (size_t) write(fd, p, size);
- if (r_sz != size) {
- EPRINTF("write failed.\n");
- goto ERR_EXIT;
- }
- snprintf(cmd, cmdlen, "/sbin/mkswap %s > /dev/null 2>&1", path);
- rc = system(cmd);
- if (rc != 0) {
- EPRINTF("system(%s) failed.\n", cmd);
- goto ERR_EXIT;
- }
- return fd;
-
-ERR_EXIT:
- if (fd >= 0)
- close(fd);
- if (p)
- free(p);
- return -1;
-}
-
-int cleanup_swapfile(char *path)
-{
- unlink(path);
- return 0;
-}
-
-#if 0
-/*
- * Check max nodes from /sys/devices/system/node/node* files (for NUMA)
- */
-int get_max_nodes(void)
-{
- /* We assume that there is only one node */
- return 1;
-}
-#endif
-
-/*
- * Get unexist pid
- */
-pid_t get_unexist_pid(void)
-{
- pid_t pid;
- int st;
-
- pid = fork();
- switch (pid) {
- case -1:
- EPRINTF("fork failed.\n");
- return -1;
- case 0:
- _exit(0);
- default:
- wait(&st);
- return pid;
- }
-}
diff --git a/testcases/kernel/syscalls/utils/include_j_h.h b/testcases/kernel/syscalls/utils/include_j_h.h
deleted file mode 100644
index 742d96401..000000000
--- a/testcases/kernel/syscalls/utils/include_j_h.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Crackerjack Project
- *
- * Copyright (C) 2007-2008, Hitachi, Ltd.
- * Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>,
- * Yumiko Sugita <yumiko.sugita.yf@hitachi.com>,
- * Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $Id: include_j_h.h,v 1.2 2009/09/27 17:34:22 subrata_modak Exp $
- *
- */
-#ifndef __CJK_SYSCALL_J_H__
-#define __CJK_SYSCALL_J_H__
-
-#include <sys/time.h>
-#include <sys/resource.h>
-
-
-#define REG_RESULT_LOG_FP stdout
-#define REG_DETAIL_LOG_FP stderr
-
-
-/*
- * RPRINTF : macro to output test result
- */
-#define RPRINTF(...) \
- do { \
- fprintf(REG_RESULT_LOG_FP, __VA_ARGS__); \
- } while (0)
-
-
-/*
- * PRINTF : macro to output detail log
- */
-#define PRINTF(...) \
- do { \
- fprintf(REG_DETAIL_LOG_FP, __VA_ARGS__); \
- } while (0)
-
-
-/*
- * EPRINTF : macro to output error message
- */
-#define EPRINTF(...) \
- do { \
- fprintf(REG_DETAIL_LOG_FP, __VA_ARGS__); \
- } while (0)
-
-/*
- * PRINT_XXX : macro to output test result and expect
- */
-#define __PRINT_EXPECT(rc_has_range, rc, errno) \
- do { \
- if (rc_has_range) \
- PRINTF("EXPECT: return value(ret)=%s", \
- (rc) >= 0 ? "(N >= 0)" : "(N < 0)"); \
- else \
- PRINTF("EXPECT: return value(ret)=%d", rc); \
- PRINTF(" errno=%d (%s)", errno, strerror(errno)); \
- } while (0)
-
-#define __PRINT_RESULT(rc_has_range, rc, errno) \
- do { \
- if (rc_has_range) \
- PRINTF("RESULT: return value(ret)=%8d", rc); \
- else \
- PRINTF("RESULT: return value(ret)=%d", rc); \
- PRINTF(" errno=%d (%s)", errno, strerror(errno)); \
- } while (0)
-
-#define PRINT_RESULT(rc_has_range, e_rc, e_errno, r_rc, r_errno) \
- do { \
- __PRINT_EXPECT(rc_has_range, e_rc, e_errno); \
- PRINTF("\n"); \
- __PRINT_RESULT(rc_has_range, r_rc, r_errno); \
- PRINTF("\n"); \
- } while (0)
-
-#define PRINT_RESULT_EXTRA(rc_has_range, e_rc, e_errno, r_rc, r_errno, \
- str, extra_ok) \
- do { \
- __PRINT_EXPECT(rc_has_range, e_rc, e_errno); \
- if ((extra_ok)) \
- PRINTF("\n"); \
- else \
- PRINTF(", %s=OK\n", str); \
- __PRINT_RESULT(rc_has_range, r_rc, r_errno); \
- if ((extra_ok)) \
- PRINTF("\n"); \
- else \
- PRINTF(", %s=NG\n", str); \
- } while (0)
-
-#define PRINT_RESULT_CMP(rc_has_range, e_rc, e_errno, r_rc, r_errno, cmp_ok) \
- PRINT_RESULT_EXTRA(rc_has_range, e_rc, e_errno, r_rc, r_errno, \
- "r/w check", cmp_ok)
-
-
-/*
- * Definitions
- */
-enum result_val {
- RESULT_OK,
- RESULT_NG
-};
-
-
-/*
- * Prototype
- */
-int setup_uid(char *uname);
-int setup_euid(char *uname, uid_t *old_uid);
-int cleanup_euid(uid_t old_uid);
-
-pid_t create_sig_proc(unsigned long usec, int sig, unsigned count);
-
-int _setup_file(char *testdir, char *fname, char *path, int flags, mode_t mode);
-int setup_file(char *testdir, char *fname, char *path);
-int cleanup_file(char *path);
-
-int setup_swapfile(char *testdir, char *fname, char *path, size_t size);
-int cleanup_swapfile(char *path);
-
-#define QUEUE_NAME "/test_mqueue"
-pid_t create_echo_msg_proc(void);
-
-pid_t get_unexist_pid(void);
-
-#endif /* __CJK_SYSCALL_J_H__ */
--
2.29.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API
2020-12-08 13:28 [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API Petr Vorel
@ 2020-12-08 13:54 ` Petr Vorel
2020-12-09 13:19 ` Cyril Hrubis
1 sibling, 0 replies; 5+ messages in thread
From: Petr Vorel @ 2020-12-08 13:54 UTC (permalink / raw)
To: ltp
Hi,
> not sure if invalid address is no longer meaningful (after removing
> fix for ia64 and use NULL).
FYI tst_get_bad_addr(), which would be more portable, didn't work.
Test is designed to use NULL to get EFAULT.
Kind regards,
Petr
^ permalink raw reply [flat|nested] 5+ messages in thread
* [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API
2020-12-08 13:28 [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API Petr Vorel
2020-12-08 13:54 ` Petr Vorel
@ 2020-12-09 13:19 ` Cyril Hrubis
2020-12-09 22:10 ` Petr Vorel
2021-01-06 11:23 ` Petr Vorel
1 sibling, 2 replies; 5+ messages in thread
From: Cyril Hrubis @ 2020-12-09 13:19 UTC (permalink / raw)
To: ltp
Hi!
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
> + * Copyright (c) Linux Test Project, 2009-2020
> + * Copyright (c) Crackerjack Project, 2007-2008, Hitachi, Ltd
> + *
> + * Authors:
> + * Takahiro Yasui <takahiro.yasui.mp@hitachi.com>
> + * Yumiko Sugita <yumiko.sugita.yf@hitachi.com>
> + * Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp>
> + * Manas Kumar Nayak <maknayak@in.ibm.com> (original port to the legacy API)
> + */
Missing test description?
> #include "config.h"
> -#include <sys/types.h>
> -#include <sys/mman.h>
> -#include <getopt.h>
> -#include <string.h>
> -#include <stdlib.h>
> -#include <errno.h>
> -#include <stdio.h>
> -#include <unistd.h>
> -#include <libgen.h>
> -#if HAVE_NUMA_H
> +#include "tst_test.h"
> +
> +#ifdef HAVE_NUMA_V2
> #include <numa.h>
> -#endif
> -#if HAVE_NUMAIF_H
> #include <numaif.h>
> -#endif
>
> -#include "test.h"
> -#include "lapi/syscalls.h"
> -#include "include_j_h.h"
> -#include "common_j_h.c"
> +#include <errno.h>
> #include "numa_helper.h"
> -
> -char *TCID = "get_mempolicy01";
> -int TST_TOTAL = 1;
> -
> -#ifdef HAVE_NUMA_V2
> +#include "tst_numa.h"
> +#include "lapi/syscalls.h"
>
> #define MEM_LENGTH (4 * 1024 * 1024)
>
> -static int testno;
> +#define POLICY_DESC(x) .policy = x, .desc = "policy: "#x
> +#define POLICY_DESC_TEXT(x, y) .policy = x, .desc = "policy: "#x", "y
> +#define POLICY_DESC_FLAGS(x, y) .policy = x, .flags = y, .desc = "policy: "#x", flags: "#y
> +#define POLICY_DESC_FLAGS_TEXT(x, y, z) .policy = x, .flags = y, .desc = "policy: "#x", flags: "#y", "z
>
> -enum test_type {
> - DEFAULT, /* get default policy */
> - ADDR, /* get policy of memory which include mapped address */
> - INVALID_POINTER,
> - INVALID_FLAGS,
> -};
> +static struct bitmask *nodemask, *getnodemask, *empty_nodemask;
>
> -enum from_node {
> - NONE,
> - SELF,
> -};
> +static void test_set_mempolicy_default(unsigned int i);
> +static void test_set_mempolicy_none(unsigned int i);
> +static int test_mbind_none(unsigned int i);
> +static int test_mbind_default(unsigned int i);
> +static int set_invalid_addr(unsigned int i);
>
> struct test_case {
> - int ttype;
> int policy;
> - int from_node;
> + const char *desc;
> + unsigned int flags;
> int ret;
> int err;
> + char *addr;
> + int (*pre_test)(unsigned int i);
> + void (*test)(unsigned int i);
> + struct bitmask **exp_nodemask;
> };
>
> -/* Test cases
> - *
> - * test status of errors on man page
> - *
> - * (NONE) man page hadn't been completed.
> - *
> - * test status of errors NOT on man page
> - *
> - * EFAULT v (invalid address)
> - * EINVAL v (invalid parameters)
> - */
> static struct test_case tcase[] = {
> - { /* case00 */
> - .ttype = DEFAULT,
> - .policy = MPOL_DEFAULT,
> - .from_node = NONE,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case01 */
> - .ttype = DEFAULT,
> - .policy = MPOL_BIND,
> - .from_node = SELF,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case02 */
> - .ttype = DEFAULT,
> - .policy = MPOL_INTERLEAVE,
> - .from_node = SELF,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case03 */
> - .ttype = DEFAULT,
> - .policy = MPOL_PREFERRED,
> - .from_node = NONE,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case04 */
> - .ttype = DEFAULT,
> - .policy = MPOL_PREFERRED,
> - .from_node = SELF,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case05 */
> - .ttype = ADDR,
> - .policy = MPOL_DEFAULT,
> - .from_node = NONE,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case06 */
> - .ttype = ADDR,
> - .policy = MPOL_BIND,
> - .from_node = SELF,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case07 */
> - .ttype = ADDR,
> - .policy = MPOL_INTERLEAVE,
> - .from_node = SELF,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case08 */
> - .ttype = ADDR,
> - .policy = MPOL_PREFERRED,
> - .from_node = NONE,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case09 */
> - .ttype = ADDR,
> - .policy = MPOL_PREFERRED,
> - .from_node = SELF,
> - .ret = 0,
> - .err = 0,
> - },
> - { /* case10 */
> - .ttype = INVALID_POINTER,
> - .policy = MPOL_DEFAULT,
> - .from_node = NONE,
> - .ret = -1,
> - .err = EFAULT,
> - },
> - { /* case11 */
> - .ttype = INVALID_FLAGS,
> - .policy = MPOL_DEFAULT,
> - .from_node = NONE,
> - .ret = -1,
> - .err = EINVAL,
> - },
> + {
> + POLICY_DESC_TEXT(MPOL_DEFAULT, "no target"),
> + .ret = 0,
> + .err = 0,
> + .test = test_set_mempolicy_none,
> + .exp_nodemask = &empty_nodemask,
> + },
> + {
> + POLICY_DESC(MPOL_BIND),
> + .ret = 0,
> + .err = 0,
> + .test = test_set_mempolicy_default,
> + },
> + {
> + POLICY_DESC(MPOL_INTERLEAVE),
> + .ret = 0,
> + .err = 0,
> + .test = test_set_mempolicy_default,
> + .exp_nodemask = &nodemask,
> + },
> + {
> + POLICY_DESC_TEXT(MPOL_PREFERRED, "no target"),
> + .ret = 0,
> + .err = 0,
> + .test = test_set_mempolicy_none,
> + .exp_nodemask = &nodemask,
> + },
> + {
> + .test = test_set_mempolicy_default,
> + POLICY_DESC(MPOL_PREFERRED),
> + .ret = 0,
> + .err = 0,
> + },
> + {
> + POLICY_DESC_FLAGS_TEXT(MPOL_DEFAULT, MPOL_F_ADDR, "no target"),
> + .ret = 0,
> + .err = 0,
> + .pre_test = test_mbind_none,
> + .test = test_set_mempolicy_none,
> + .exp_nodemask = &nodemask,
> + },
> + {
> + POLICY_DESC_FLAGS(MPOL_BIND, MPOL_F_ADDR),
> + .pre_test = test_mbind_default,
> + .ret = 0,
> + .err = 0,
> + },
> + {
> + POLICY_DESC_FLAGS(MPOL_INTERLEAVE, MPOL_F_ADDR),
> + .ret = 0,
> + .err = 0,
> + .pre_test = test_mbind_default,
> + .test = test_set_mempolicy_default,
> + .exp_nodemask = &nodemask,
> + },
> + {
> + POLICY_DESC_FLAGS_TEXT(MPOL_PREFERRED, MPOL_F_ADDR, "no target"),
> + .ret = 0,
> + .err = 0,
> + .pre_test = test_mbind_none,
> + .test = test_set_mempolicy_none,
> + .exp_nodemask = &nodemask,
> + },
> + {
> + POLICY_DESC_FLAGS(MPOL_PREFERRED, MPOL_F_ADDR),
> + .ret = 0,
> + .err = 0,
> + .pre_test = test_mbind_default,
> + .test = test_set_mempolicy_default,
> + },
> + {
> + .flags = MPOL_F_ADDR,
> + POLICY_DESC_TEXT(MPOL_DEFAULT, "invalid address"),
> + .ret = -1,
> + .err = EFAULT,
> + .pre_test = set_invalid_addr,
> + .exp_nodemask = &nodemask,
> + },
> + {
> + POLICY_DESC_TEXT(MPOL_DEFAULT, "invalid flags, no target"),
> + .flags = -1,
> + .ret = -1,
> + .err = EINVAL,
> + .test = test_set_mempolicy_none,
> + .exp_nodemask = &nodemask,
> + },
> };
>
> -static int do_test(struct test_case *tc);
> -static void setup(void);
> -static void cleanup(void);
> +static void test_set_mempolicy_default(unsigned int i)
> +{
> + struct test_case *tc = &tcase[i];
> +
> + TEST(set_mempolicy(tc->policy, nodemask->maskp, nodemask->size));
> +}
>
> -int main(int argc, char **argv)
> +static void test_set_mempolicy_none(unsigned int i)
> {
> - int i, ret, lc;
> + struct test_case *tc = &tcase[i];
>
> - setup();
> + TEST(set_mempolicy(tc->policy, NULL, 0));
> +}
> +
> +static int test_mbind(unsigned int i, unsigned long *maskp, unsigned long size)
> +{
> + struct test_case *tc = &tcase[i];
>
> - ret = 0;
> - testno = (int)ARRAY_SIZE(tcase);
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> - tst_count = 0;
> + tc->addr = SAFE_MMAP(NULL, MEM_LENGTH, PROT_READ | PROT_WRITE,
> + MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
>
> - for (i = 0; i < testno; i++) {
> - tst_resm(TINFO, "(case%02d) START", i);
> - ret = do_test(&tcase[i]);
> - tst_resm((ret == 0 ? TPASS : TFAIL | TERRNO),
> - "(case%02d) END", i);
> - }
> + TEST(mbind(tc->addr, MEM_LENGTH, tc->policy, maskp, size, 0));
> +
> + if (TST_RET < 0) {
> + tst_res(TFAIL | TERRNO, "mbind() failed");
> + return -1;
> }
>
> - cleanup();
> - tst_exit();
> + return 0;
> }
>
> -static int do_test(struct test_case *tc)
> +static int test_mbind_none(unsigned int i)
> {
> - int ret, err, result, cmp_ok;
> - int policy, flags;
> - struct bitmask *nodemask = numa_allocate_nodemask();
> - struct bitmask *getnodemask = numa_allocate_nodemask();
> - char *p = NULL;
> - unsigned long len = MEM_LENGTH;
> - int test_node = -1;
> + return test_mbind(i, NULL, 0);
> +}
>
> - ret = get_allowed_nodes(NH_MEMS, 1, &test_node);
> - if (ret < 0)
> - tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret);
> - numa_bitmask_setbit(nodemask, test_node);
> - switch (tc->ttype) {
> - case DEFAULT:
> - flags = 0;
> - p = NULL;
> - if (tc->from_node == NONE)
> - TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
> - NULL, 0));
> - else
> - TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
> - nodemask->maskp, nodemask->size));
> - if (TEST_RETURN < 0) {
> - tst_resm(TBROK | TERRNO, "set_mempolicy");
> - return -1;
> - }
> +static int test_mbind_default(unsigned int i)
> +{
> + return test_mbind(i, nodemask->maskp, nodemask->size);
> +}
>
> - break;
> - default:
> - flags = MPOL_F_ADDR;
> - p = mmap(NULL, len, PROT_READ | PROT_WRITE,
> - MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
> - if (p == MAP_FAILED)
> - tst_brkm(TBROK | TERRNO, cleanup, "mmap");
> - if (tc->from_node == NONE)
> - TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
> - NULL, 0, 0));
> - else
> - TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
> - nodemask->maskp, nodemask->size, 0));
> - if (TEST_RETURN < 0) {
> - tst_resm(TBROK | TERRNO, "mbind");
> - return -1;
> - }
> +static int set_invalid_addr(unsigned int i)
> +{
> + struct test_case *tc = &tcase[i];
> + int ret;
>
> - if (tc->ttype == INVALID_POINTER)
> -#ifdef __ia64__
> - p = (char *)0x8000000000000000UL;
> -#else
> - p = 0;
> -#endif
> + ret = test_mbind_none(i);
> + tc->addr = NULL;
>
> - if (tc->ttype == INVALID_FLAGS)
> - flags = -1;
> - }
> - errno = 0;
> - cmp_ok = 1;
> - TEST(ret = ltp_syscall(__NR_get_mempolicy, &policy, getnodemask->maskp,
> - getnodemask->size, p, flags));
> - err = TEST_ERRNO;
> - if (ret < 0)
> - goto TEST_END;
> -
> - /* if policy == MPOL_DEFAULT, get_mempolicy doesn't return nodemask */
> - if (tc->policy == MPOL_DEFAULT)
> - numa_bitmask_clearall(nodemask);
> - cmp_ok = (tc->policy == policy && (tc->from_node == NONE ||
> - numa_bitmask_equal(nodemask,
> - getnodemask)));
> -TEST_END:
> - result = (err != tc->err) || !cmp_ok;
> - PRINT_RESULT_CMP(0, tc->ret, tc->err, ret, err, cmp_ok);
> - return result;
> + return ret;
> }
>
> -static void cleanup(void)
> +
> +static void setup(void)
> {
> - tst_rmdir();
> + if (!is_numa(NULL, NH_MEMS, 1))
> + tst_brk(TCONF, "requires NUMA with at least 1 node");
> }
>
> -static void setup(void)
> +static void setup_node(void)
> {
> - /* check syscall availability */
> - ltp_syscall(__NR_get_mempolicy, NULL, NULL, 0, NULL, 0);
> + int test_node = -1;
>
> - if (!is_numa(NULL, NH_MEMS, 1))
> - tst_brkm(TCONF, NULL, "requires NUMA with at least 1 node");
> + if (get_allowed_nodes(NH_MEMS, 1, &test_node) < 0)
> + tst_brk(TBROK | TERRNO, "get_allowed_nodes failed");
The is_numa() and get_allowed_nodes() is deprecated API, we do have new
tst_get_nodemap() function that replaces them. See set_mempolicy()
testcases for reference.
> - TEST_PAUSE;
> - tst_tmpdir();
> + nodemask = numa_allocate_nodemask();
> + getnodemask = numa_allocate_nodemask();
> + numa_bitmask_setbit(nodemask, test_node);
> }
>
> -#else
> -int main(void)
> +static void do_test(unsigned int i)
> {
> - tst_brkm(TCONF, NULL, NUMA_ERROR_MSG);
> + struct test_case *tc = &tcase[i];
> + int policy;
> +
> + tst_res(TINFO, "test #%d: %s", (i+1), tc->desc);
> +
> + setup_node();
> +
> + if (tc->pre_test)
> + if (tc->pre_test(i) == -1)
> + return;
> +
> + if (tc->test) {
> + tc->test(i);
> +
> + if (TST_RET < 0) {
> + tst_res(TFAIL | TERRNO, ".test failed");
> + return;
> + }
> + }
We call test_mbind() here for each iteration which calls mmap()
and the memory is never freed. Which means that this will fail sooner or
later with the -i option.
Why can't we allocate all the blocks with different mempolicy and
or/bind the memory once in the test setup instead? We can keep the
callback in-place as they are we just need to loop over them in the
setup() instead. Also I would rename them to alloc, setup, or something
like that so that it's clear that they are just preparing the
environment and not doing the actuall test.
Also I would pass the struct test_case pointer to these instead of i
since they convert the i to the testcase pointer as the first thing
anyways.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 5+ messages in thread
* [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API
2020-12-09 13:19 ` Cyril Hrubis
@ 2020-12-09 22:10 ` Petr Vorel
2021-01-06 11:23 ` Petr Vorel
1 sibling, 0 replies; 5+ messages in thread
From: Petr Vorel @ 2020-12-09 22:10 UTC (permalink / raw)
To: ltp
Hi Cyril,
...
> > - if (!is_numa(NULL, NH_MEMS, 1))
> > - tst_brkm(TCONF, NULL, "requires NUMA with at least 1 node");
> > + if (get_allowed_nodes(NH_MEMS, 1, &test_node) < 0)
> > + tst_brk(TBROK | TERRNO, "get_allowed_nodes failed");
> The is_numa() and get_allowed_nodes() is deprecated API, we do have new
> tst_get_nodemap() function that replaces them. See set_mempolicy()
> testcases for reference.
Thanks!
> > - TEST_PAUSE;
> > - tst_tmpdir();
> > + nodemask = numa_allocate_nodemask();
> > + getnodemask = numa_allocate_nodemask();
> > + numa_bitmask_setbit(nodemask, test_node);
> > }
> > -#else
> > -int main(void)
> > +static void do_test(unsigned int i)
> > {
> > - tst_brkm(TCONF, NULL, NUMA_ERROR_MSG);
> > + struct test_case *tc = &tcase[i];
> > + int policy;
> > +
> > + tst_res(TINFO, "test #%d: %s", (i+1), tc->desc);
> > +
> > + setup_node();
> > +
> > + if (tc->pre_test)
> > + if (tc->pre_test(i) == -1)
> > + return;
> > +
> > + if (tc->test) {
> > + tc->test(i);
> > +
> > + if (TST_RET < 0) {
> > + tst_res(TFAIL | TERRNO, ".test failed");
> > + return;
> > + }
> > + }
> We call test_mbind() here for each iteration which calls mmap()
> and the memory is never freed. Which means that this will fail sooner or
> later with the -i option.
> Why can't we allocate all the blocks with different mempolicy and
> or/bind the memory once in the test setup instead? We can keep the
> callback in-place as they are we just need to loop over them in the
> setup() instead. Also I would rename them to alloc, setup, or something
> like that so that it's clear that they are just preparing the
> environment and not doing the actuall test.
Thanks for catching this. I actually run it more with -i500,
but it looks laptop has enough memory :). Anyway, what you suggest is obviously
much better solution, thanks!
> Also I would pass the struct test_case pointer to these instead of i
> since they convert the i to the testcase pointer as the first thing
> anyways.
+1
Kind regards,
Petr
^ permalink raw reply [flat|nested] 5+ messages in thread
* [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API
2020-12-09 13:19 ` Cyril Hrubis
2020-12-09 22:10 ` Petr Vorel
@ 2021-01-06 11:23 ` Petr Vorel
1 sibling, 0 replies; 5+ messages in thread
From: Petr Vorel @ 2021-01-06 11:23 UTC (permalink / raw)
To: ltp
Hi Cyril,
...
> > +static void do_test(unsigned int i)
> > {
> > - tst_brkm(TCONF, NULL, NUMA_ERROR_MSG);
> > + struct test_case *tc = &tcase[i];
> > + int policy;
> > +
> > + tst_res(TINFO, "test #%d: %s", (i+1), tc->desc);
> > +
> > + setup_node();
> > +
> > + if (tc->pre_test)
> > + if (tc->pre_test(i) == -1)
> > + return;
> > +
> > + if (tc->test) {
> > + tc->test(i);
> > +
> > + if (TST_RET < 0) {
> > + tst_res(TFAIL | TERRNO, ".test failed");
> > + return;
> > + }
> > + }
> We call test_mbind() here for each iteration which calls mmap()
> and the memory is never freed. Which means that this will fail sooner or
> later with the -i option.
> Why can't we allocate all the blocks with different mempolicy and
> or/bind the memory once in the test setup instead? We can keep the
> callback in-place as they are we just need to loop over them in the
> setup() instead. Also I would rename them to alloc, setup, or something
> like that so that it's clear that they are just preparing the
> environment and not doing the actuall test.
OK, I'll loop over ARRAY_SIZE(tcase) in the setup().
But the original code first set NUMA node (setup_node()), then did the
preparation (SAFE_MMAP() and mbind()) and then call set_mempolicy().
Do you suggest instead of testing just take "safe" approach - tst_brk(TBROK)
on any failure as it's in the setup?
Kind regards,
Petr
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-01-06 11:23 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-08 13:28 [LTP] [PATCH 1/1] syscalls/get_mempolicy01: Rewrite to new API Petr Vorel
2020-12-08 13:54 ` Petr Vorel
2020-12-09 13:19 ` Cyril Hrubis
2020-12-09 22:10 ` Petr Vorel
2021-01-06 11:23 ` Petr Vorel
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.