blob: 84937cbc9688db34fb59538b9e546cfcaf4f4e7f [file] [log] [blame]
subrata_modakfa09c3a2009-06-15 18:36:14 +00001/******************************************************************************/
yaberauneya6eb4bde2009-11-04 04:59:44 +00002/* Copyright (c) Crackerjack Project., 2007-2008 */
Caspar Zhang459abbd2012-03-09 17:40:43 +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> */
yaberauneya6eb4bde2009-11-04 04:59:44 +00006/* */
subrata_modakfa09c3a2009-06-15 18:36:14 +00007/* This program is free software; you can redistribute it and/or modify */
Caspar Zhang459abbd2012-03-09 17:40:43 +08008/* it under the terms of the GNU General Public License as published by */
yaberauneya6eb4bde2009-11-04 04:59:44 +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 Zhang459abbd2012-03-09 17:40:43 +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 */
yaberauneya6eb4bde2009-11-04 04:59:44 +000020/* */
subrata_modakfa09c3a2009-06-15 18:36:14 +000021/******************************************************************************/
22/******************************************************************************/
yaberauneya6eb4bde2009-11-04 04:59:44 +000023/* */
Caspar Zhang459abbd2012-03-09 17:40:43 +080024/* File: mbind01.c */
yaberauneya6eb4bde2009-11-04 04:59:44 +000025/* */
Caspar Zhang459abbd2012-03-09 17:40:43 +080026/* Description: This tests the mbind() syscall */
yaberauneya6eb4bde2009-11-04 04:59:44 +000027/* */
Caspar Zhang459abbd2012-03-09 17:40:43 +080028/* Usage: <for command-line> */
29/* mbind01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */
30/* 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. */
yaberauneya6eb4bde2009-11-04 04:59:44 +000036/* */
37/* Total Tests: 1 */
38/* */
Caspar Zhang459abbd2012-03-09 17:40:43 +080039/* Test Name: mbind01 */
40/* History: Porting from Crackerjack to LTP is done by */
41/* Manas Kumar Nayak maknayak@in.ibm.com> */
subrata_modakfa09c3a2009-06-15 18:36:14 +000042/******************************************************************************/
43
yaberauneyab8b35642009-12-23 00:13:20 +000044#include "config.h"
subrata_modakfa09c3a2009-06-15 18:36:14 +000045#include <sys/types.h>
46#include <sys/mman.h>
Caspar Zhang459abbd2012-03-09 17:40:43 +080047#include <sys/syscall.h>
subrata_modakfa09c3a2009-06-15 18:36:14 +000048#include <errno.h>
Caspar Zhang459abbd2012-03-09 17:40:43 +080049#include <getopt.h>
50#include <libgen.h>
Caspar Zhang6e914e02012-03-09 17:51:35 +080051#if HAVE_NUMA_H
52#include <numa.h>
53#endif
Caspar Zhang459abbd2012-03-09 17:40:43 +080054#if HAVE_NUMAIF_H
55#include <numaif.h>
56#endif
subrata_modakfa09c3a2009-06-15 18:36:14 +000057#include <stdio.h>
Caspar Zhang459abbd2012-03-09 17:40:43 +080058#include <stdlib.h>
59#include <string.h>
subrata_modakfa09c3a2009-06-15 18:36:14 +000060#include <unistd.h>
Caspar Zhang459abbd2012-03-09 17:40:43 +080061
62#include "test.h"
63#include "usctest.h"
Caspar Zhang6e914e02012-03-09 17:51:35 +080064#include "linux_syscall_numbers.h"
yaberauneya6eb4bde2009-11-04 04:59:44 +000065#include "include_j_h.h"
Jan Stanceka03a9d92012-06-28 11:03:16 +020066#include "numa_helper.h"
yaberauneya6eb4bde2009-11-04 04:59:44 +000067
Caspar Zhang459abbd2012-03-09 17:40:43 +080068char *TCID = "mbind01";
Wanlong Gao354ebb42012-12-07 10:10:04 +080069int TST_TOTAL = 2;
yaberauneya6eb4bde2009-11-04 04:59:44 +000070
Caspar Zhang459abbd2012-03-09 17:40:43 +080071#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H && \
72 HAVE_MPOL_CONSTANTS
Garrett Cooper2c282152010-12-16 00:55:50 -080073
Caspar Zhang459abbd2012-03-09 17:40:43 +080074#define MEM_LENGTH (4 * 1024 * 1024)
subrata_modakfa09c3a2009-06-15 18:36:14 +000075
Wanlong Gao354ebb42012-12-07 10:10:04 +080076static int testno;
subrata_modakfa09c3a2009-06-15 18:36:14 +000077
78enum test_type {
yaberauneya6eb4bde2009-11-04 04:59:44 +000079 NORMAL,
80 INVALID_POINTER,
subrata_modakfa09c3a2009-06-15 18:36:14 +000081};
82
83enum from_node {
yaberauneya6eb4bde2009-11-04 04:59:44 +000084 NONE,
85 SELF,
subrata_modakfa09c3a2009-06-15 18:36:14 +000086};
87
subrata_modakfa09c3a2009-06-15 18:36:14 +000088struct test_case {
yaberauneya6eb4bde2009-11-04 04:59:44 +000089 int ttype;
90 int policy;
91 int from_node;
92 unsigned flags;
93 int ret;
94 int err;
subrata_modakfa09c3a2009-06-15 18:36:14 +000095};
96
97/* Test cases
98 *
99 * test status of errors on man page
100 *
Caspar Zhang459abbd2012-03-09 17:40:43 +0800101 * EFAULT v (detect unmapped hole or invalid pointer)
102 * EINVAL v (invalid arguments)
103 * ENOMEM can't check because it's difficult to create no-memory
104 * EIO can't check because we don't have N-node NUMA system
105 * (only we can do is simulate 1-node NUMA)
subrata_modakfa09c3a2009-06-15 18:36:14 +0000106 */
subrata_modakfa09c3a2009-06-15 18:36:14 +0000107static struct test_case tcase[] = {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800108 { /* case00 */
109 .policy = MPOL_DEFAULT,
110 .from_node = NONE,
111 .ret = 0,
112 .err = 0,
113 },
114 { /* case01 */
115 .policy = MPOL_DEFAULT,
116 .from_node = SELF, /* target exists */
117 .ret = -1,
118 .err = EINVAL,
119 },
120 { /* case02 */
121 .policy = MPOL_BIND,
122 .from_node = NONE, /* no target */
123 .ret = -1,
124 .err = EINVAL,
125 },
126 { /* case03 */
127 .policy = MPOL_BIND,
128 .from_node = SELF,
129 .ret = 0,
130 .err = 0,
131 },
132 { /* case04 */
133 .policy = MPOL_INTERLEAVE,
134 .from_node = NONE, /* no target */
135 .ret = -1,
136 .err = EINVAL,
137 },
138 { /* case05 */
139 .policy = MPOL_INTERLEAVE,
140 .from_node = SELF,
141 .ret = 0,
142 .err = 0,
143 },
144 { /* case06 */
145 .policy = MPOL_PREFERRED,
146 .from_node = NONE,
147 .ret = 0,
148 .err = 0,
149 },
150 { /* case07 */
151 .policy = MPOL_PREFERRED,
152 .from_node = SELF,
153 .ret = 0,
154 .err = 0,
155 },
156 { /* case08 */
157 .policy = -1, /* unknown policy */
158 .from_node = NONE,
159 .ret = -1,
160 .err = EINVAL,
161 },
162 { /* case09 */
163 .policy = MPOL_DEFAULT,
164 .from_node = NONE,
165 .flags = -1, /* invalid flags */
166 .ret = -1,
167 .err = EINVAL,
168 },
169 { /* case10 */
170 .ttype = INVALID_POINTER,
171 .policy = MPOL_PREFERRED,
172 .from_node = SELF,
173 .ret = -1,
174 .err = EFAULT,
175 },
subrata_modakfa09c3a2009-06-15 18:36:14 +0000176};
177
Wanlong Gao354ebb42012-12-07 10:10:04 +0800178static int do_test(struct test_case *tc);
Caspar Zhang459abbd2012-03-09 17:40:43 +0800179static void setup(void);
180static void cleanup(void);
subrata_modakfa09c3a2009-06-15 18:36:14 +0000181
Caspar Zhang459abbd2012-03-09 17:40:43 +0800182int main(int argc, char **argv)
183{
184 char *msg;
185 int lc, i, ret;
186
187 msg = parse_opts(argc, argv, NULL, NULL);
188 if (msg != NULL)
189 tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
190
191 setup();
192 testno = (int)(sizeof(tcase) / sizeof(tcase[0]));
193
194 for (lc = 0; TEST_LOOPING(lc); ++lc) {
195 Tst_count = 0;
196 for (i = 0; i < testno; i++) {
197 tst_resm(TINFO, "(case%02d) START", i);
198 ret = do_test(&tcase[i]);
Wanlong Gao354ebb42012-12-07 10:10:04 +0800199 tst_resm((ret == 0 ? TPASS : TFAIL | TERRNO),
200 "(case%02d) END", i);
Caspar Zhang459abbd2012-03-09 17:40:43 +0800201 }
202 }
203 cleanup();
204 tst_exit();
205}
206
207static int do_test(struct test_case *tc)
208{
209 int ret, err, result, cmp_ok = 1;
210 int policy;
yaberauneya6eb4bde2009-11-04 04:59:44 +0000211 char *p = NULL;
Caspar Zhang6e914e02012-03-09 17:51:35 +0800212#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
213 nodemask_t *nodemask, *getnodemask;
214#else
215 struct bitmask *nodemask = numa_allocate_nodemask();
216 struct bitmask *getnodemask = numa_allocate_nodemask();
217#endif
yaberauneya6eb4bde2009-11-04 04:59:44 +0000218 unsigned long maxnode = NUMA_NUM_NODES;
219 unsigned long len = MEM_LENGTH;
subrata_modak2130b5e2009-09-07 09:28:08 +0000220 unsigned long *invalid_nodemask;
Jan Stanceka03a9d92012-06-28 11:03:16 +0200221 int test_node = -1;
222
Jan Stancekd534a442012-08-09 14:15:38 +0800223 ret = get_allowed_nodes(NH_MEMS, 1, &test_node);
224 if (ret < 0)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800225 tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret);
subrata_modakfa09c3a2009-06-15 18:36:14 +0000226
Caspar Zhang6e914e02012-03-09 17:51:35 +0800227#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
228 nodemask = malloc(sizeof(nodemask_t));
229 nodemask_zero(nodemask);
Jan Stanceka03a9d92012-06-28 11:03:16 +0200230 nodemask_set(nodemask, test_node);
Caspar Zhang6e914e02012-03-09 17:51:35 +0800231 getnodemask = malloc(sizeof(nodemask_t));
232 nodemask_zero(getnodemask);
233#else
Jan Stanceka03a9d92012-06-28 11:03:16 +0200234 numa_bitmask_setbit(nodemask, test_node);
Caspar Zhang6e914e02012-03-09 17:51:35 +0800235#endif
Wanlong Gao354ebb42012-12-07 10:10:04 +0800236 p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
237 0, 0);
Caspar Zhang459abbd2012-03-09 17:40:43 +0800238 if (p == MAP_FAILED)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800239 tst_brkm(TBROK | TERRNO, cleanup, "mmap");
Caspar Zhang459abbd2012-03-09 17:40:43 +0800240
Garrett Cooperdf3eb162010-11-28 22:44:32 -0800241 if (tc->ttype == INVALID_POINTER)
subrata_modak2130b5e2009-09-07 09:28:08 +0000242 invalid_nodemask = (unsigned long *)0xc0000000;
Caspar Zhang459abbd2012-03-09 17:40:43 +0800243
yaberauneya6eb4bde2009-11-04 04:59:44 +0000244 errno = 0;
245 if (tc->from_node == NONE)
Jan Stancek359980f2013-02-15 10:16:05 +0100246 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800247 NULL, 0, tc->flags));
subrata_modak2130b5e2009-09-07 09:28:08 +0000248 else if (tc->ttype == INVALID_POINTER)
Jan Stancek359980f2013-02-15 10:16:05 +0100249 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800250 invalid_nodemask, maxnode, tc->flags));
yaberauneya6eb4bde2009-11-04 04:59:44 +0000251 else
Caspar Zhang6e914e02012-03-09 17:51:35 +0800252#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100253 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800254 nodemask, maxnode, tc->flags));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800255#else
Jan Stancek359980f2013-02-15 10:16:05 +0100256 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800257 nodemask->maskp, nodemask->size, tc->flags));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800258#endif
259
260 err = TEST_ERRNO;
Caspar Zhang459abbd2012-03-09 17:40:43 +0800261 if (ret < 0)
yaberauneya6eb4bde2009-11-04 04:59:44 +0000262 goto TEST_END;
subrata_modakfa09c3a2009-06-15 18:36:14 +0000263
Caspar Zhang459abbd2012-03-09 17:40:43 +0800264 /* Check policy of the allocated memory */
Caspar Zhang6e914e02012-03-09 17:51:35 +0800265#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100266 TEST(ltp_syscall(__NR_get_mempolicy, &policy, getnodemask,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800267 maxnode, p, MPOL_F_ADDR));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800268#else
Jan Stancek359980f2013-02-15 10:16:05 +0100269 TEST(ltp_syscall(__NR_get_mempolicy, &policy, getnodemask->maskp,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800270 getnodemask->size, p, MPOL_F_ADDR));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800271#endif
Caspar Zhang459abbd2012-03-09 17:40:43 +0800272 if (TEST_RETURN < 0) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800273 tst_resm(TFAIL | TERRNO, "get_mempolicy failed");
Caspar Zhang459abbd2012-03-09 17:40:43 +0800274 return -1;
yaberauneya6eb4bde2009-11-04 04:59:44 +0000275 }
subrata_modakfa09c3a2009-06-15 18:36:14 +0000276
Caspar Zhang459abbd2012-03-09 17:40:43 +0800277 /* If policy == MPOL_DEFAULT, get_mempolicy doesn't return nodemask */
yaberauneya6eb4bde2009-11-04 04:59:44 +0000278 if (tc->policy == MPOL_DEFAULT)
Caspar Zhang6e914e02012-03-09 17:51:35 +0800279#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
280 nodemask_zero(nodemask);
281#else
282 numa_bitmask_clearall(nodemask);
283#endif
284
subrata_modak3c2d60d2009-09-07 09:26:42 +0000285 if ((tc->policy == MPOL_PREFERRED) && (tc->from_node == NONE))
286 cmp_ok = (tc->policy == policy);
287 else
Caspar Zhang459abbd2012-03-09 17:40:43 +0800288 cmp_ok = ((tc->policy == policy) &&
Caspar Zhang6e914e02012-03-09 17:51:35 +0800289#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Wanlong Gao354ebb42012-12-07 10:10:04 +0800290 nodemask_equal(nodemask, getnodemask));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800291#else
Wanlong Gao354ebb42012-12-07 10:10:04 +0800292 numa_bitmask_equal(nodemask, getnodemask));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800293#endif
subrata_modakfa09c3a2009-06-15 18:36:14 +0000294TEST_END:
Caspar Zhang459abbd2012-03-09 17:40:43 +0800295 result = ((err != tc->err) || (!cmp_ok));
296 PRINT_RESULT_CMP(0, tc->ret, tc->err, ret, err, cmp_ok);
yaberauneya6eb4bde2009-11-04 04:59:44 +0000297 return result;
subrata_modakfa09c3a2009-06-15 18:36:14 +0000298}
299
Caspar Zhang459abbd2012-03-09 17:40:43 +0800300static void setup(void)
301{
Caspar Zhang07e750a2012-08-09 18:31:56 +0800302 /* check syscall availability */
Jan Stancek359980f2013-02-15 10:16:05 +0100303 ltp_syscall(__NR_mbind, NULL, 0, 0, NULL, 0, 0);
Caspar Zhang07e750a2012-08-09 18:31:56 +0800304
Caspar Zhang459abbd2012-03-09 17:40:43 +0800305 TEST_PAUSE;
306 tst_tmpdir();
subrata_modakfa09c3a2009-06-15 18:36:14 +0000307}
308
Caspar Zhang459abbd2012-03-09 17:40:43 +0800309static void cleanup(void)
310{
311 TEST_CLEANUP;
312 tst_rmdir();
subrata_modakfa09c3a2009-06-15 18:36:14 +0000313}
Caspar Zhang459abbd2012-03-09 17:40:43 +0800314#else /* no NUMA */
315int main(void)
316{
317 tst_brkm(TCONF, NULL, "System doesn't have required numa support");
yaberauneyab8b35642009-12-23 00:13:20 +0000318}
Caspar Zhang384b3f52011-04-25 09:07:37 +0800319#endif