blob: e4cff88a5b6d4d9cc28555ae4197aff7c5154510 [file] [log] [blame]
subrata_modake63f96b2009-05-29 10:29:58 +00001/******************************************************************************/
yaberauneyac2365082009-11-04 06:18:27 +00002/* Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd */
Caspar Zhangdaad27e2012-03-09 14:42:49 +08003/* Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>, */
4/* Yumiko Sugita <yumiko.sugita.yf@hitachi.com>, */
5/* Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp> */
6/* */
subrata_modake63f96b2009-05-29 10:29:58 +00007/* This program is free software; you can redistribute it and/or modify */
Caspar Zhangdaad27e2012-03-09 14:42:49 +08008/* it under the terms of the GNU General Public License as published by */
yaberauneyac2365082009-11-04 06:18:27 +00009/* the Free Software Foundation; either version 2 of the License, or */
10/* (at your option) any later version. */
11/* */
12/* This program is distributed in the hope that it will be useful, */
13/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
14/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
15/* the GNU General Public License for more details. */
16/* */
17/* You should have received a copy of the GNU General Public License */
Caspar Zhangdaad27e2012-03-09 14:42:49 +080018/* along with this program; if not, write to the Free Software */
Wanlong Gao4548c6c2012-10-19 18:03:36 +080019/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
yaberauneyac2365082009-11-04 06:18:27 +000020/* */
subrata_modake63f96b2009-05-29 10:29:58 +000021/******************************************************************************/
22/******************************************************************************/
yaberauneyac2365082009-11-04 06:18:27 +000023/* */
24/* File: get_mempolicy01.c */
25/* */
26/* Description: This tests the get_mempolicy() syscall */
subrata_modake63f96b2009-05-29 10:29:58 +000027/* */
yaberauneyac2365082009-11-04 06:18:27 +000028/* Usage: <for command-line> */
29/* get_mempolicy01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */
Caspar Zhangdaad27e2012-03-09 14:42:49 +080030/* where, -c n : Run n copies concurrently. */
31/* -e : Turn on errno logging. */
32/* -i n : Execute test n times. */
33/* -I x : Execute test for x seconds. */
34/* -P x : Pause for x seconds between iterations. */
35/* -t : Turn on syscall timing. */
yaberauneyac2365082009-11-04 06:18:27 +000036/* */
37/* Total Tests: 1 */
38/* */
Caspar Zhangdaad27e2012-03-09 14:42:49 +080039/* Test Name: get_mempolicy01 */
40/* History: Porting from Crackerjack to LTP is done by */
41/* Manas Kumar Nayak maknayak@in.ibm.com> */
subrata_modake63f96b2009-05-29 10:29:58 +000042/******************************************************************************/
subrata_modake63f96b2009-05-29 10:29:58 +000043
yaberauneyac6fed3d2009-12-23 00:05:33 +000044#include "config.h"
yaberauneyac6fed3d2009-12-23 00:05:33 +000045#include <sys/types.h>
46#include <sys/mman.h>
47#include <getopt.h>
48#include <string.h>
49#include <stdlib.h>
50#include <errno.h>
51#include <stdio.h>
52#include <unistd.h>
53#include <libgen.h>
Caspar Zhangdaad27e2012-03-09 14:42:49 +080054#if HAVE_NUMA_H
yaberauneyac6fed3d2009-12-23 00:05:33 +000055#include <numa.h>
Caspar Zhangdaad27e2012-03-09 14:42:49 +080056#endif
57#if HAVE_NUMAIF_H
yaberauneyac6fed3d2009-12-23 00:05:33 +000058#include <numaif.h>
Caspar Zhangdaad27e2012-03-09 14:42:49 +080059#endif
Caspar Zhangdaad27e2012-03-09 14:42:49 +080060#include "test.h"
yaberauneyac6fed3d2009-12-23 00:05:33 +000061#include "linux_syscall_numbers.h"
62#include "include_j_h.h"
63#include "common_j_h.c"
Jan Stancekd537be82012-06-28 11:03:17 +020064#include "numa_helper.h"
yaberauneyac6fed3d2009-12-23 00:05:33 +000065
Cyril Hrubisfdce7d52013-04-04 18:35:48 +020066char *TCID = "get_mempolicy01";
67int TST_TOTAL = 1;
subrata_modake63f96b2009-05-29 10:29:58 +000068
Caspar Zhangdaad27e2012-03-09 14:42:49 +080069#if HAVE_NUMA_H && HAVE_NUMAIF_H && HAVE_MPOL_CONSTANTS
Garrett Cooper2c282152010-12-16 00:55:50 -080070
Caspar Zhangdaad27e2012-03-09 14:42:49 +080071#define MEM_LENGTH (4 * 1024 * 1024)
subrata_modake63f96b2009-05-29 10:29:58 +000072
Wanlong Gao354ebb42012-12-07 10:10:04 +080073static int testno;
subrata_modake63f96b2009-05-29 10:29:58 +000074
75enum test_type {
Wanlong Gao354ebb42012-12-07 10:10:04 +080076 DEFAULT, /* get default policy */
77 ADDR, /* get policy of memory which include mapped address */
yaberauneyaa95028f2009-11-04 04:28:20 +000078 INVALID_POINTER,
79 INVALID_FLAGS,
subrata_modake63f96b2009-05-29 10:29:58 +000080};
81
82enum from_node {
yaberauneyaa95028f2009-11-04 04:28:20 +000083 NONE,
84 SELF,
subrata_modake63f96b2009-05-29 10:29:58 +000085};
86
subrata_modake63f96b2009-05-29 10:29:58 +000087struct test_case {
yaberauneyaa95028f2009-11-04 04:28:20 +000088 int ttype;
89 int policy;
90 int from_node;
91 int ret;
92 int err;
subrata_modake63f96b2009-05-29 10:29:58 +000093};
94
95/* Test cases
96 *
97 * test status of errors on man page
98 *
yaberauneyaa95028f2009-11-04 04:28:20 +000099 * (NONE) man page hadn't been completed.
subrata_modake63f96b2009-05-29 10:29:58 +0000100 *
101 * test status of errors NOT on man page
102 *
yaberauneyaa95028f2009-11-04 04:28:20 +0000103 * EFAULT v (invalid address)
104 * EINVAL v (invalid parameters)
subrata_modake63f96b2009-05-29 10:29:58 +0000105 */
subrata_modake63f96b2009-05-29 10:29:58 +0000106static struct test_case tcase[] = {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800107 { /* case00 */
108 .ttype = DEFAULT,
109 .policy = MPOL_DEFAULT,
110 .from_node = NONE,
111 .ret = 0,
112 .err = 0,
113 },
114 { /* case01 */
115 .ttype = DEFAULT,
116 .policy = MPOL_BIND,
117 .from_node = SELF,
118 .ret = 0,
119 .err = 0,
120 },
121 { /* case02 */
122 .ttype = DEFAULT,
123 .policy = MPOL_INTERLEAVE,
124 .from_node = SELF,
125 .ret = 0,
126 .err = 0,
127 },
128 { /* case03 */
129 .ttype = DEFAULT,
130 .policy = MPOL_PREFERRED,
131 .from_node = NONE,
132 .ret = 0,
133 .err = 0,
134 },
135 { /* case04 */
136 .ttype = DEFAULT,
137 .policy = MPOL_PREFERRED,
138 .from_node = SELF,
139 .ret = 0,
140 .err = 0,
141 },
142 { /* case05 */
143 .ttype = ADDR,
144 .policy = MPOL_DEFAULT,
145 .from_node = NONE,
146 .ret = 0,
147 .err = 0,
148 },
149 { /* case06 */
150 .ttype = ADDR,
151 .policy = MPOL_BIND,
152 .from_node = SELF,
153 .ret = 0,
154 .err = 0,
155 },
156 { /* case07 */
157 .ttype = ADDR,
158 .policy = MPOL_INTERLEAVE,
159 .from_node = SELF,
160 .ret = 0,
161 .err = 0,
162 },
163 { /* case08 */
164 .ttype = ADDR,
165 .policy = MPOL_PREFERRED,
166 .from_node = NONE,
167 .ret = 0,
168 .err = 0,
169 },
170 { /* case09 */
171 .ttype = ADDR,
172 .policy = MPOL_PREFERRED,
173 .from_node = SELF,
174 .ret = 0,
175 .err = 0,
176 },
177 { /* case10 */
178 .ttype = INVALID_POINTER,
179 .policy = MPOL_DEFAULT,
180 .from_node = NONE,
181 .ret = -1,
182 .err = EFAULT,
183 },
184 { /* case11 */
185 .ttype = INVALID_FLAGS,
186 .policy = MPOL_DEFAULT,
187 .from_node = NONE,
188 .ret = -1,
189 .err = EINVAL,
190 },
subrata_modake63f96b2009-05-29 10:29:58 +0000191};
192
Wanlong Gao354ebb42012-12-07 10:10:04 +0800193static int do_test(struct test_case *tc);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800194static void setup(void);
195static void cleanup(void);
196
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800197int main(int argc, char **argv)
subrata_modake63f96b2009-05-29 10:29:58 +0000198{
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800199 int i, ret, lc;
yaberauneyac6fed3d2009-12-23 00:05:33 +0000200
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800201 setup();
202
203 ret = 0;
Cyril Hrubisb863a0b2014-09-24 13:15:29 +0200204 testno = (int)ARRAY_SIZE(tcase);
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800205 for (lc = 0; TEST_LOOPING(lc); lc++) {
Caspar Zhangd59a6592013-03-07 14:59:12 +0800206 tst_count = 0;
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800207
208 for (i = 0; i < testno; i++) {
209 tst_resm(TINFO, "(case%02d) START", i);
210 ret = do_test(&tcase[i]);
Wanlong Gao354ebb42012-12-07 10:10:04 +0800211 tst_resm((ret == 0 ? TPASS : TFAIL | TERRNO),
212 "(case%02d) END", i);
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800213 }
214 }
215
216 cleanup();
217 tst_exit();
218}
219
220static int do_test(struct test_case *tc)
221{
222 int ret, err, result, cmp_ok;
223 int policy, flags;
Caspar Zhangf8576b12012-03-09 16:46:21 +0800224#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
225 nodemask_t *nodemask, *getnodemask;
yaberauneyaa95028f2009-11-04 04:28:20 +0000226 unsigned long maxnode = NUMA_NUM_NODES;
Caspar Zhangf8576b12012-03-09 16:46:21 +0800227#else
228 struct bitmask *nodemask = numa_allocate_nodemask();
229 struct bitmask *getnodemask = numa_allocate_nodemask();
230#endif
yaberauneyaa95028f2009-11-04 04:28:20 +0000231 char *p = NULL;
232 unsigned long len = MEM_LENGTH;
Jan Stancekd537be82012-06-28 11:03:17 +0200233 int test_node = -1;
subrata_modake63f96b2009-05-29 10:29:58 +0000234
Jan Stancekd534a442012-08-09 14:15:38 +0800235 ret = get_allowed_nodes(NH_MEMS, 1, &test_node);
236 if (ret < 0)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800237 tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800238#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
239 nodemask = malloc(sizeof(nodemask_t));
240 nodemask_zero(nodemask);
Jan Stancekd537be82012-06-28 11:03:17 +0200241 nodemask_set(nodemask, test_node);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800242 getnodemask = malloc(sizeof(nodemask_t));
243 nodemask_zero(getnodemask);
244#else
Jan Stancekd537be82012-06-28 11:03:17 +0200245 numa_bitmask_setbit(nodemask, test_node);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800246#endif
yaberauneyaa95028f2009-11-04 04:28:20 +0000247 switch (tc->ttype) {
248 case DEFAULT:
249 flags = 0;
250 p = NULL;
yaberauneyaa95028f2009-11-04 04:28:20 +0000251 if (tc->from_node == NONE)
Jan Stancek359980f2013-02-15 10:16:05 +0100252 TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
253 NULL, 0));
yaberauneyaa95028f2009-11-04 04:28:20 +0000254 else
Caspar Zhangf8576b12012-03-09 16:46:21 +0800255#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100256 TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
257 nodemask, maxnode));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800258#else
Jan Stancek359980f2013-02-15 10:16:05 +0100259 TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
260 nodemask->maskp, nodemask->size));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800261#endif
262 if (TEST_RETURN < 0) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800263 tst_resm(TBROK | TERRNO, "set_mempolicy");
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800264 return -1;
yaberauneyaa95028f2009-11-04 04:28:20 +0000265 }
Caspar Zhangf8576b12012-03-09 16:46:21 +0800266
yaberauneyaa95028f2009-11-04 04:28:20 +0000267 break;
268 default:
269 flags = MPOL_F_ADDR;
Wanlong Gao354ebb42012-12-07 10:10:04 +0800270 p = mmap(NULL, len, PROT_READ | PROT_WRITE,
271 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800272 if (p == MAP_FAILED)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800273 tst_brkm(TBROK | TERRNO, cleanup, "mmap");
yaberauneyaa95028f2009-11-04 04:28:20 +0000274 if (tc->from_node == NONE)
Jan Stancek359980f2013-02-15 10:16:05 +0100275 TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
276 NULL, 0, 0));
yaberauneyaa95028f2009-11-04 04:28:20 +0000277 else
Caspar Zhangf8576b12012-03-09 16:46:21 +0800278#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100279 TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
280 nodemask, maxnode, 0));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800281#else
Jan Stancek359980f2013-02-15 10:16:05 +0100282 TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
283 nodemask->maskp, nodemask->size, 0));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800284#endif
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800285 if (TEST_RETURN < 0) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800286 tst_resm(TBROK | TERRNO, "mbind");
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800287 return -1;
288 }
289
yaberauneyaa95028f2009-11-04 04:28:20 +0000290 if (tc->ttype == INVALID_POINTER)
Caspar Zhanga4bf0032012-03-09 23:24:05 +0800291#ifdef __ia64__
292 p = (char *)0x8000000000000000UL;
293#else
Caspar Zhangf8576b12012-03-09 16:46:21 +0800294 p = 0;
Caspar Zhanga4bf0032012-03-09 23:24:05 +0800295#endif
subrata_modake63f96b2009-05-29 10:29:58 +0000296
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800297 if (tc->ttype == INVALID_FLAGS)
yaberauneyaa95028f2009-11-04 04:28:20 +0000298 flags = -1;
subrata_modake63f96b2009-05-29 10:29:58 +0000299 }
Wanlong Gao354ebb42012-12-07 10:10:04 +0800300 errno = 0;
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800301 cmp_ok = 1;
Caspar Zhangf8576b12012-03-09 16:46:21 +0800302#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100303 TEST(ret = ltp_syscall(__NR_get_mempolicy, &policy, getnodemask,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800304 maxnode, p, flags));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800305#else
Jan Stancek359980f2013-02-15 10:16:05 +0100306 TEST(ret = ltp_syscall(__NR_get_mempolicy, &policy, getnodemask->maskp,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800307 getnodemask->size, p, flags));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800308#endif
309 err = TEST_ERRNO;
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800310 if (ret < 0)
yaberauneyaa95028f2009-11-04 04:28:20 +0000311 goto TEST_END;
subrata_modake63f96b2009-05-29 10:29:58 +0000312
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800313 /* if policy == MPOL_DEFAULT, get_mempolicy doesn't return nodemask */
yaberauneyaa95028f2009-11-04 04:28:20 +0000314 if (tc->policy == MPOL_DEFAULT)
Caspar Zhangf8576b12012-03-09 16:46:21 +0800315#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
316 nodemask_zero(nodemask);
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800317 cmp_ok = (tc->policy == policy && (tc->from_node == NONE ||
Wanlong Gao354ebb42012-12-07 10:10:04 +0800318 nodemask_equal(nodemask,
319 getnodemask)));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800320#else
321 numa_bitmask_clearall(nodemask);
322 cmp_ok = (tc->policy == policy && (tc->from_node == NONE ||
Wanlong Gao354ebb42012-12-07 10:10:04 +0800323 numa_bitmask_equal(nodemask,
324 getnodemask)));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800325#endif
subrata_modake63f96b2009-05-29 10:29:58 +0000326TEST_END:
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800327 result = (err != tc->err) || !cmp_ok;
328 PRINT_RESULT_CMP(0, tc->ret, tc->err, ret, err, cmp_ok);
yaberauneyaa95028f2009-11-04 04:28:20 +0000329 return result;
subrata_modake63f96b2009-05-29 10:29:58 +0000330}
331
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800332static void cleanup(void)
333{
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800334 tst_rmdir();
335}
subrata_modake63f96b2009-05-29 10:29:58 +0000336
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800337static void setup(void)
338{
Caspar Zhang07e750a2012-08-09 18:31:56 +0800339 /* check syscall availability */
Jan Stancek359980f2013-02-15 10:16:05 +0100340 ltp_syscall(__NR_get_mempolicy, NULL, NULL, 0, NULL, 0);
Caspar Zhang07e750a2012-08-09 18:31:56 +0800341
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800342 TEST_PAUSE;
343 tst_tmpdir();
subrata_modake63f96b2009-05-29 10:29:58 +0000344}
yaberauneyac6fed3d2009-12-23 00:05:33 +0000345#else
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800346int main(void)
347{
Garrett Cooper53740502010-12-16 00:04:01 -0800348 tst_brkm(TCONF, NULL, "System doesn't have required numa support");
yaberauneyac6fed3d2009-12-23 00:05:33 +0000349}
Garrett Coopere683a862010-12-20 12:51:50 -0800350#endif