blob: c4c71acd4692a833ac134d832c30670e6c0b2269 [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"
Caspar Zhang6e914e02012-03-09 17:51:35 +080063#include "linux_syscall_numbers.h"
yaberauneya6eb4bde2009-11-04 04:59:44 +000064#include "include_j_h.h"
Jan Stanceka03a9d92012-06-28 11:03:16 +020065#include "numa_helper.h"
yaberauneya6eb4bde2009-11-04 04:59:44 +000066
Caspar Zhang459abbd2012-03-09 17:40:43 +080067char *TCID = "mbind01";
Wanlong Gao354ebb42012-12-07 10:10:04 +080068int TST_TOTAL = 2;
yaberauneya6eb4bde2009-11-04 04:59:44 +000069
Caspar Zhang459abbd2012-03-09 17:40:43 +080070#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H && \
71 HAVE_MPOL_CONSTANTS
Garrett Cooper2c282152010-12-16 00:55:50 -080072
Caspar Zhang459abbd2012-03-09 17:40:43 +080073#define MEM_LENGTH (4 * 1024 * 1024)
subrata_modakfa09c3a2009-06-15 18:36:14 +000074
Wanlong Gao354ebb42012-12-07 10:10:04 +080075static int testno;
subrata_modakfa09c3a2009-06-15 18:36:14 +000076
77enum test_type {
yaberauneya6eb4bde2009-11-04 04:59:44 +000078 NORMAL,
79 INVALID_POINTER,
subrata_modakfa09c3a2009-06-15 18:36:14 +000080};
81
82enum from_node {
yaberauneya6eb4bde2009-11-04 04:59:44 +000083 NONE,
84 SELF,
subrata_modakfa09c3a2009-06-15 18:36:14 +000085};
86
subrata_modakfa09c3a2009-06-15 18:36:14 +000087struct test_case {
yaberauneya6eb4bde2009-11-04 04:59:44 +000088 int ttype;
89 int policy;
90 int from_node;
91 unsigned flags;
92 int ret;
93 int err;
subrata_modakfa09c3a2009-06-15 18:36:14 +000094};
95
96/* Test cases
97 *
98 * test status of errors on man page
99 *
Caspar Zhang459abbd2012-03-09 17:40:43 +0800100 * EFAULT v (detect unmapped hole or invalid pointer)
101 * EINVAL v (invalid arguments)
102 * ENOMEM can't check because it's difficult to create no-memory
103 * EIO can't check because we don't have N-node NUMA system
104 * (only we can do is simulate 1-node NUMA)
subrata_modakfa09c3a2009-06-15 18:36:14 +0000105 */
subrata_modakfa09c3a2009-06-15 18:36:14 +0000106static struct test_case tcase[] = {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800107 { /* case00 */
108 .policy = MPOL_DEFAULT,
109 .from_node = NONE,
110 .ret = 0,
111 .err = 0,
112 },
113 { /* case01 */
114 .policy = MPOL_DEFAULT,
115 .from_node = SELF, /* target exists */
116 .ret = -1,
117 .err = EINVAL,
118 },
119 { /* case02 */
120 .policy = MPOL_BIND,
121 .from_node = NONE, /* no target */
122 .ret = -1,
123 .err = EINVAL,
124 },
125 { /* case03 */
126 .policy = MPOL_BIND,
127 .from_node = SELF,
128 .ret = 0,
129 .err = 0,
130 },
131 { /* case04 */
132 .policy = MPOL_INTERLEAVE,
133 .from_node = NONE, /* no target */
134 .ret = -1,
135 .err = EINVAL,
136 },
137 { /* case05 */
138 .policy = MPOL_INTERLEAVE,
139 .from_node = SELF,
140 .ret = 0,
141 .err = 0,
142 },
143 { /* case06 */
144 .policy = MPOL_PREFERRED,
145 .from_node = NONE,
146 .ret = 0,
147 .err = 0,
148 },
149 { /* case07 */
150 .policy = MPOL_PREFERRED,
151 .from_node = SELF,
152 .ret = 0,
153 .err = 0,
154 },
155 { /* case08 */
156 .policy = -1, /* unknown policy */
157 .from_node = NONE,
158 .ret = -1,
159 .err = EINVAL,
160 },
161 { /* case09 */
162 .policy = MPOL_DEFAULT,
163 .from_node = NONE,
164 .flags = -1, /* invalid flags */
165 .ret = -1,
166 .err = EINVAL,
167 },
168 { /* case10 */
169 .ttype = INVALID_POINTER,
170 .policy = MPOL_PREFERRED,
171 .from_node = SELF,
172 .ret = -1,
173 .err = EFAULT,
174 },
subrata_modakfa09c3a2009-06-15 18:36:14 +0000175};
176
Wanlong Gao354ebb42012-12-07 10:10:04 +0800177static int do_test(struct test_case *tc);
Caspar Zhang459abbd2012-03-09 17:40:43 +0800178static void setup(void);
179static void cleanup(void);
subrata_modakfa09c3a2009-06-15 18:36:14 +0000180
Caspar Zhang459abbd2012-03-09 17:40:43 +0800181int main(int argc, char **argv)
182{
Cyril Hrubis0b9589f2014-05-27 17:40:33 +0200183 const char *msg;
Caspar Zhang459abbd2012-03-09 17:40:43 +0800184 int lc, i, ret;
185
186 msg = parse_opts(argc, argv, NULL, NULL);
187 if (msg != NULL)
188 tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
189
190 setup();
191 testno = (int)(sizeof(tcase) / sizeof(tcase[0]));
192
193 for (lc = 0; TEST_LOOPING(lc); ++lc) {
Caspar Zhangd59a6592013-03-07 14:59:12 +0800194 tst_count = 0;
Caspar Zhang459abbd2012-03-09 17:40:43 +0800195 for (i = 0; i < testno; i++) {
196 tst_resm(TINFO, "(case%02d) START", i);
197 ret = do_test(&tcase[i]);
Wanlong Gao354ebb42012-12-07 10:10:04 +0800198 tst_resm((ret == 0 ? TPASS : TFAIL | TERRNO),
199 "(case%02d) END", i);
Caspar Zhang459abbd2012-03-09 17:40:43 +0800200 }
201 }
202 cleanup();
203 tst_exit();
204}
205
206static int do_test(struct test_case *tc)
207{
208 int ret, err, result, cmp_ok = 1;
209 int policy;
yaberauneya6eb4bde2009-11-04 04:59:44 +0000210 char *p = NULL;
Caspar Zhang6e914e02012-03-09 17:51:35 +0800211#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
212 nodemask_t *nodemask, *getnodemask;
213#else
214 struct bitmask *nodemask = numa_allocate_nodemask();
215 struct bitmask *getnodemask = numa_allocate_nodemask();
216#endif
yaberauneya6eb4bde2009-11-04 04:59:44 +0000217 unsigned long maxnode = NUMA_NUM_NODES;
218 unsigned long len = MEM_LENGTH;
subrata_modak2130b5e2009-09-07 09:28:08 +0000219 unsigned long *invalid_nodemask;
Jan Stanceka03a9d92012-06-28 11:03:16 +0200220 int test_node = -1;
221
Jan Stancekd534a442012-08-09 14:15:38 +0800222 ret = get_allowed_nodes(NH_MEMS, 1, &test_node);
223 if (ret < 0)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800224 tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret);
subrata_modakfa09c3a2009-06-15 18:36:14 +0000225
Caspar Zhang6e914e02012-03-09 17:51:35 +0800226#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
227 nodemask = malloc(sizeof(nodemask_t));
228 nodemask_zero(nodemask);
Jan Stanceka03a9d92012-06-28 11:03:16 +0200229 nodemask_set(nodemask, test_node);
Caspar Zhang6e914e02012-03-09 17:51:35 +0800230 getnodemask = malloc(sizeof(nodemask_t));
231 nodemask_zero(getnodemask);
232#else
Jan Stanceka03a9d92012-06-28 11:03:16 +0200233 numa_bitmask_setbit(nodemask, test_node);
Caspar Zhang6e914e02012-03-09 17:51:35 +0800234#endif
Wanlong Gao354ebb42012-12-07 10:10:04 +0800235 p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
236 0, 0);
Caspar Zhang459abbd2012-03-09 17:40:43 +0800237 if (p == MAP_FAILED)
Wanlong Gao354ebb42012-12-07 10:10:04 +0800238 tst_brkm(TBROK | TERRNO, cleanup, "mmap");
Caspar Zhang459abbd2012-03-09 17:40:43 +0800239
Garrett Cooperdf3eb162010-11-28 22:44:32 -0800240 if (tc->ttype == INVALID_POINTER)
subrata_modak2130b5e2009-09-07 09:28:08 +0000241 invalid_nodemask = (unsigned long *)0xc0000000;
Caspar Zhang459abbd2012-03-09 17:40:43 +0800242
yaberauneya6eb4bde2009-11-04 04:59:44 +0000243 errno = 0;
244 if (tc->from_node == NONE)
Jan Stancek359980f2013-02-15 10:16:05 +0100245 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800246 NULL, 0, tc->flags));
subrata_modak2130b5e2009-09-07 09:28:08 +0000247 else if (tc->ttype == INVALID_POINTER)
Jan Stancek359980f2013-02-15 10:16:05 +0100248 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800249 invalid_nodemask, maxnode, tc->flags));
yaberauneya6eb4bde2009-11-04 04:59:44 +0000250 else
Caspar Zhang6e914e02012-03-09 17:51:35 +0800251#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100252 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800253 nodemask, maxnode, tc->flags));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800254#else
Jan Stancek359980f2013-02-15 10:16:05 +0100255 TEST(ret = ltp_syscall(__NR_mbind, p, len, tc->policy,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800256 nodemask->maskp, nodemask->size, tc->flags));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800257#endif
258
259 err = TEST_ERRNO;
Caspar Zhang459abbd2012-03-09 17:40:43 +0800260 if (ret < 0)
yaberauneya6eb4bde2009-11-04 04:59:44 +0000261 goto TEST_END;
subrata_modakfa09c3a2009-06-15 18:36:14 +0000262
Caspar Zhang459abbd2012-03-09 17:40:43 +0800263 /* Check policy of the allocated memory */
Caspar Zhang6e914e02012-03-09 17:51:35 +0800264#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Jan Stancek359980f2013-02-15 10:16:05 +0100265 TEST(ltp_syscall(__NR_get_mempolicy, &policy, getnodemask,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800266 maxnode, p, MPOL_F_ADDR));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800267#else
Jan Stancek359980f2013-02-15 10:16:05 +0100268 TEST(ltp_syscall(__NR_get_mempolicy, &policy, getnodemask->maskp,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800269 getnodemask->size, p, MPOL_F_ADDR));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800270#endif
Caspar Zhang459abbd2012-03-09 17:40:43 +0800271 if (TEST_RETURN < 0) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800272 tst_resm(TFAIL | TERRNO, "get_mempolicy failed");
Caspar Zhang459abbd2012-03-09 17:40:43 +0800273 return -1;
yaberauneya6eb4bde2009-11-04 04:59:44 +0000274 }
subrata_modakfa09c3a2009-06-15 18:36:14 +0000275
Caspar Zhang459abbd2012-03-09 17:40:43 +0800276 /* If policy == MPOL_DEFAULT, get_mempolicy doesn't return nodemask */
yaberauneya6eb4bde2009-11-04 04:59:44 +0000277 if (tc->policy == MPOL_DEFAULT)
Caspar Zhang6e914e02012-03-09 17:51:35 +0800278#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
279 nodemask_zero(nodemask);
280#else
281 numa_bitmask_clearall(nodemask);
282#endif
283
subrata_modak3c2d60d2009-09-07 09:26:42 +0000284 if ((tc->policy == MPOL_PREFERRED) && (tc->from_node == NONE))
285 cmp_ok = (tc->policy == policy);
286 else
Caspar Zhang459abbd2012-03-09 17:40:43 +0800287 cmp_ok = ((tc->policy == policy) &&
Caspar Zhang6e914e02012-03-09 17:51:35 +0800288#if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2
Wanlong Gao354ebb42012-12-07 10:10:04 +0800289 nodemask_equal(nodemask, getnodemask));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800290#else
Wanlong Gao354ebb42012-12-07 10:10:04 +0800291 numa_bitmask_equal(nodemask, getnodemask));
Caspar Zhang6e914e02012-03-09 17:51:35 +0800292#endif
subrata_modakfa09c3a2009-06-15 18:36:14 +0000293TEST_END:
Caspar Zhang459abbd2012-03-09 17:40:43 +0800294 result = ((err != tc->err) || (!cmp_ok));
295 PRINT_RESULT_CMP(0, tc->ret, tc->err, ret, err, cmp_ok);
yaberauneya6eb4bde2009-11-04 04:59:44 +0000296 return result;
subrata_modakfa09c3a2009-06-15 18:36:14 +0000297}
298
Caspar Zhang459abbd2012-03-09 17:40:43 +0800299static void setup(void)
300{
Caspar Zhang07e750a2012-08-09 18:31:56 +0800301 /* check syscall availability */
Jan Stancek359980f2013-02-15 10:16:05 +0100302 ltp_syscall(__NR_mbind, NULL, 0, 0, NULL, 0, 0);
Caspar Zhang07e750a2012-08-09 18:31:56 +0800303
Caspar Zhang459abbd2012-03-09 17:40:43 +0800304 TEST_PAUSE;
305 tst_tmpdir();
subrata_modakfa09c3a2009-06-15 18:36:14 +0000306}
307
Caspar Zhang459abbd2012-03-09 17:40:43 +0800308static void cleanup(void)
309{
Caspar Zhang459abbd2012-03-09 17:40:43 +0800310 tst_rmdir();
subrata_modakfa09c3a2009-06-15 18:36:14 +0000311}
Caspar Zhang459abbd2012-03-09 17:40:43 +0800312#else /* no NUMA */
313int main(void)
314{
315 tst_brkm(TCONF, NULL, "System doesn't have required numa support");
yaberauneyab8b35642009-12-23 00:13:20 +0000316}
Caspar Zhang384b3f52011-04-25 09:07:37 +0800317#endif