blob: f9b62326098476e37ab4af1fd250fe8f31a1529c [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
60
61#include "usctest.h"
62#include "test.h"
yaberauneyac6fed3d2009-12-23 00:05:33 +000063#include "linux_syscall_numbers.h"
64#include "include_j_h.h"
65#include "common_j_h.c"
Jan Stancekd537be82012-06-28 11:03:17 +020066#include "numa_helper.h"
yaberauneyac6fed3d2009-12-23 00:05:33 +000067
Wanlong Gao354ebb42012-12-07 10:10:04 +080068char *TCID = "get_mempolicy01"; /* Test program identifier. */
69int TST_TOTAL = 1; /* total number of tests in this file. */
subrata_modake63f96b2009-05-29 10:29:58 +000070
Caspar Zhangdaad27e2012-03-09 14:42:49 +080071#if HAVE_NUMA_H && HAVE_NUMAIF_H && HAVE_MPOL_CONSTANTS
Garrett Cooper2c282152010-12-16 00:55:50 -080072
Caspar Zhangdaad27e2012-03-09 14:42:49 +080073#define MEM_LENGTH (4 * 1024 * 1024)
subrata_modake63f96b2009-05-29 10:29:58 +000074
Wanlong Gao354ebb42012-12-07 10:10:04 +080075static int testno;
subrata_modake63f96b2009-05-29 10:29:58 +000076
77enum test_type {
Wanlong Gao354ebb42012-12-07 10:10:04 +080078 DEFAULT, /* get default policy */
79 ADDR, /* get policy of memory which include mapped address */
yaberauneyaa95028f2009-11-04 04:28:20 +000080 INVALID_POINTER,
81 INVALID_FLAGS,
subrata_modake63f96b2009-05-29 10:29:58 +000082};
83
84enum from_node {
yaberauneyaa95028f2009-11-04 04:28:20 +000085 NONE,
86 SELF,
subrata_modake63f96b2009-05-29 10:29:58 +000087};
88
subrata_modake63f96b2009-05-29 10:29:58 +000089struct test_case {
yaberauneyaa95028f2009-11-04 04:28:20 +000090 int ttype;
91 int policy;
92 int from_node;
93 int ret;
94 int err;
subrata_modake63f96b2009-05-29 10:29:58 +000095};
96
97/* Test cases
98 *
99 * test status of errors on man page
100 *
yaberauneyaa95028f2009-11-04 04:28:20 +0000101 * (NONE) man page hadn't been completed.
subrata_modake63f96b2009-05-29 10:29:58 +0000102 *
103 * test status of errors NOT on man page
104 *
yaberauneyaa95028f2009-11-04 04:28:20 +0000105 * EFAULT v (invalid address)
106 * EINVAL v (invalid parameters)
subrata_modake63f96b2009-05-29 10:29:58 +0000107 */
subrata_modake63f96b2009-05-29 10:29:58 +0000108static struct test_case tcase[] = {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800109 { /* case00 */
110 .ttype = DEFAULT,
111 .policy = MPOL_DEFAULT,
112 .from_node = NONE,
113 .ret = 0,
114 .err = 0,
115 },
116 { /* case01 */
117 .ttype = DEFAULT,
118 .policy = MPOL_BIND,
119 .from_node = SELF,
120 .ret = 0,
121 .err = 0,
122 },
123 { /* case02 */
124 .ttype = DEFAULT,
125 .policy = MPOL_INTERLEAVE,
126 .from_node = SELF,
127 .ret = 0,
128 .err = 0,
129 },
130 { /* case03 */
131 .ttype = DEFAULT,
132 .policy = MPOL_PREFERRED,
133 .from_node = NONE,
134 .ret = 0,
135 .err = 0,
136 },
137 { /* case04 */
138 .ttype = DEFAULT,
139 .policy = MPOL_PREFERRED,
140 .from_node = SELF,
141 .ret = 0,
142 .err = 0,
143 },
144 { /* case05 */
145 .ttype = ADDR,
146 .policy = MPOL_DEFAULT,
147 .from_node = NONE,
148 .ret = 0,
149 .err = 0,
150 },
151 { /* case06 */
152 .ttype = ADDR,
153 .policy = MPOL_BIND,
154 .from_node = SELF,
155 .ret = 0,
156 .err = 0,
157 },
158 { /* case07 */
159 .ttype = ADDR,
160 .policy = MPOL_INTERLEAVE,
161 .from_node = SELF,
162 .ret = 0,
163 .err = 0,
164 },
165 { /* case08 */
166 .ttype = ADDR,
167 .policy = MPOL_PREFERRED,
168 .from_node = NONE,
169 .ret = 0,
170 .err = 0,
171 },
172 { /* case09 */
173 .ttype = ADDR,
174 .policy = MPOL_PREFERRED,
175 .from_node = SELF,
176 .ret = 0,
177 .err = 0,
178 },
179 { /* case10 */
180 .ttype = INVALID_POINTER,
181 .policy = MPOL_DEFAULT,
182 .from_node = NONE,
183 .ret = -1,
184 .err = EFAULT,
185 },
186 { /* case11 */
187 .ttype = INVALID_FLAGS,
188 .policy = MPOL_DEFAULT,
189 .from_node = NONE,
190 .ret = -1,
191 .err = EINVAL,
192 },
subrata_modake63f96b2009-05-29 10:29:58 +0000193};
194
Wanlong Gao354ebb42012-12-07 10:10:04 +0800195static int do_test(struct test_case *tc);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800196static void setup(void);
197static void cleanup(void);
198
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800199int main(int argc, char **argv)
subrata_modake63f96b2009-05-29 10:29:58 +0000200{
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800201 int i, ret, lc;
yaberauneyac6fed3d2009-12-23 00:05:33 +0000202
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800203 setup();
204
205 ret = 0;
206 testno = (int)(sizeof(tcase) / sizeof(*tcase));
207 for (lc = 0; TEST_LOOPING(lc); lc++) {
208 Tst_count = 0;
209
210 for (i = 0; i < testno; i++) {
211 tst_resm(TINFO, "(case%02d) START", i);
212 ret = do_test(&tcase[i]);
Wanlong Gao354ebb42012-12-07 10:10:04 +0800213 tst_resm((ret == 0 ? TPASS : TFAIL | TERRNO),
214 "(case%02d) END", i);
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800215 }
216 }
217
218 cleanup();
219 tst_exit();
220}
221
222static int do_test(struct test_case *tc)
223{
224 int ret, err, result, cmp_ok;
225 int policy, flags;
Caspar Zhangf8576b12012-03-09 16:46:21 +0800226#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
227 nodemask_t *nodemask, *getnodemask;
yaberauneyaa95028f2009-11-04 04:28:20 +0000228 unsigned long maxnode = NUMA_NUM_NODES;
Caspar Zhangf8576b12012-03-09 16:46:21 +0800229#else
230 struct bitmask *nodemask = numa_allocate_nodemask();
231 struct bitmask *getnodemask = numa_allocate_nodemask();
232#endif
yaberauneyaa95028f2009-11-04 04:28:20 +0000233 char *p = NULL;
234 unsigned long len = MEM_LENGTH;
Jan Stancekd537be82012-06-28 11:03:17 +0200235 int test_node = -1;
subrata_modake63f96b2009-05-29 10:29:58 +0000236
Jan Stancekd534a442012-08-09 14:15:38 +0800237 ret = get_allowed_nodes(NH_MEMS, 1, &test_node);
238 if (ret < 0)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800239 tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800240#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
241 nodemask = malloc(sizeof(nodemask_t));
242 nodemask_zero(nodemask);
Jan Stancekd537be82012-06-28 11:03:17 +0200243 nodemask_set(nodemask, test_node);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800244 getnodemask = malloc(sizeof(nodemask_t));
245 nodemask_zero(getnodemask);
246#else
Jan Stancekd537be82012-06-28 11:03:17 +0200247 numa_bitmask_setbit(nodemask, test_node);
Caspar Zhangf8576b12012-03-09 16:46:21 +0800248#endif
yaberauneyaa95028f2009-11-04 04:28:20 +0000249 switch (tc->ttype) {
250 case DEFAULT:
251 flags = 0;
252 p = NULL;
yaberauneyaa95028f2009-11-04 04:28:20 +0000253 if (tc->from_node == NONE)
Jan Stancek359980f2013-02-15 10:16:05 +0100254 TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
255 NULL, 0));
yaberauneyaa95028f2009-11-04 04:28:20 +0000256 else
Caspar Zhangf8576b12012-03-09 16:46:21 +0800257#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100258 TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
259 nodemask, maxnode));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800260#else
Jan Stancek359980f2013-02-15 10:16:05 +0100261 TEST(ltp_syscall(__NR_set_mempolicy, tc->policy,
262 nodemask->maskp, nodemask->size));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800263#endif
264 if (TEST_RETURN < 0) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800265 tst_resm(TBROK | TERRNO, "set_mempolicy");
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800266 return -1;
yaberauneyaa95028f2009-11-04 04:28:20 +0000267 }
Caspar Zhangf8576b12012-03-09 16:46:21 +0800268
yaberauneyaa95028f2009-11-04 04:28:20 +0000269 break;
270 default:
271 flags = MPOL_F_ADDR;
Wanlong Gao354ebb42012-12-07 10:10:04 +0800272 p = mmap(NULL, len, PROT_READ | PROT_WRITE,
273 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800274 if (p == MAP_FAILED)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800275 tst_brkm(TBROK | TERRNO, cleanup, "mmap");
yaberauneyaa95028f2009-11-04 04:28:20 +0000276 if (tc->from_node == NONE)
Jan Stancek359980f2013-02-15 10:16:05 +0100277 TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
278 NULL, 0, 0));
yaberauneyaa95028f2009-11-04 04:28:20 +0000279 else
Caspar Zhangf8576b12012-03-09 16:46:21 +0800280#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100281 TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
282 nodemask, maxnode, 0));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800283#else
Jan Stancek359980f2013-02-15 10:16:05 +0100284 TEST(ltp_syscall(__NR_mbind, p, len, tc->policy,
285 nodemask->maskp, nodemask->size, 0));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800286#endif
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800287 if (TEST_RETURN < 0) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800288 tst_resm(TBROK | TERRNO, "mbind");
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800289 return -1;
290 }
291
yaberauneyaa95028f2009-11-04 04:28:20 +0000292 if (tc->ttype == INVALID_POINTER)
Caspar Zhanga4bf0032012-03-09 23:24:05 +0800293#ifdef __ia64__
294 p = (char *)0x8000000000000000UL;
295#else
Caspar Zhangf8576b12012-03-09 16:46:21 +0800296 p = 0;
Caspar Zhanga4bf0032012-03-09 23:24:05 +0800297#endif
subrata_modake63f96b2009-05-29 10:29:58 +0000298
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800299 if (tc->ttype == INVALID_FLAGS)
yaberauneyaa95028f2009-11-04 04:28:20 +0000300 flags = -1;
subrata_modake63f96b2009-05-29 10:29:58 +0000301 }
Wanlong Gao354ebb42012-12-07 10:10:04 +0800302 errno = 0;
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800303 cmp_ok = 1;
Caspar Zhangf8576b12012-03-09 16:46:21 +0800304#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100305 TEST(ret = ltp_syscall(__NR_get_mempolicy, &policy, getnodemask,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800306 maxnode, p, flags));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800307#else
Jan Stancek359980f2013-02-15 10:16:05 +0100308 TEST(ret = ltp_syscall(__NR_get_mempolicy, &policy, getnodemask->maskp,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800309 getnodemask->size, p, flags));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800310#endif
311 err = TEST_ERRNO;
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800312 if (ret < 0)
yaberauneyaa95028f2009-11-04 04:28:20 +0000313 goto TEST_END;
subrata_modake63f96b2009-05-29 10:29:58 +0000314
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800315 /* if policy == MPOL_DEFAULT, get_mempolicy doesn't return nodemask */
yaberauneyaa95028f2009-11-04 04:28:20 +0000316 if (tc->policy == MPOL_DEFAULT)
Caspar Zhangf8576b12012-03-09 16:46:21 +0800317#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
318 nodemask_zero(nodemask);
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800319 cmp_ok = (tc->policy == policy && (tc->from_node == NONE ||
Wanlong Gao354ebb42012-12-07 10:10:04 +0800320 nodemask_equal(nodemask,
321 getnodemask)));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800322#else
323 numa_bitmask_clearall(nodemask);
324 cmp_ok = (tc->policy == policy && (tc->from_node == NONE ||
Wanlong Gao354ebb42012-12-07 10:10:04 +0800325 numa_bitmask_equal(nodemask,
326 getnodemask)));
Caspar Zhangf8576b12012-03-09 16:46:21 +0800327#endif
subrata_modake63f96b2009-05-29 10:29:58 +0000328TEST_END:
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800329 result = (err != tc->err) || !cmp_ok;
330 PRINT_RESULT_CMP(0, tc->ret, tc->err, ret, err, cmp_ok);
yaberauneyaa95028f2009-11-04 04:28:20 +0000331 return result;
subrata_modake63f96b2009-05-29 10:29:58 +0000332}
333
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800334static void cleanup(void)
335{
336 TEST_CLEANUP;
337 tst_rmdir();
338}
subrata_modake63f96b2009-05-29 10:29:58 +0000339
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800340static void setup(void)
341{
Caspar Zhang07e750a2012-08-09 18:31:56 +0800342 /* check syscall availability */
Jan Stancek359980f2013-02-15 10:16:05 +0100343 ltp_syscall(__NR_get_mempolicy, NULL, NULL, 0, NULL, 0);
Caspar Zhang07e750a2012-08-09 18:31:56 +0800344
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800345 TEST_PAUSE;
346 tst_tmpdir();
subrata_modake63f96b2009-05-29 10:29:58 +0000347}
yaberauneyac6fed3d2009-12-23 00:05:33 +0000348#else
Caspar Zhangdaad27e2012-03-09 14:42:49 +0800349int main(void)
350{
Garrett Cooper53740502010-12-16 00:04:01 -0800351 tst_brkm(TCONF, NULL, "System doesn't have required numa support");
yaberauneyac6fed3d2009-12-23 00:05:33 +0000352}
Garrett Coopere683a862010-12-20 12:51:50 -0800353#endif