subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 1 | /******************************************************************************/ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 2 | /* Copyright (c) Crackerjack Project., 2007-2008 */ |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 3 | /* 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> */ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 6 | /* */ |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 7 | /* This program is free software; you can redistribute it and/or modify */ |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 8 | /* it under the terms of the GNU General Public License as published by */ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 9 | /* 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 Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 18 | /* along with this program; if not, write to the Free Software */ |
Wanlong Gao | 4548c6c | 2012-10-19 18:03:36 +0800 | [diff] [blame] | 19 | /* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 20 | /* */ |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 21 | /******************************************************************************/ |
| 22 | /******************************************************************************/ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 23 | /* */ |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 24 | /* File: mbind01.c */ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 25 | /* */ |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 26 | /* Description: This tests the mbind() syscall */ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 27 | /* */ |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 28 | /* 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. */ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 36 | /* */ |
| 37 | /* Total Tests: 1 */ |
| 38 | /* */ |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 39 | /* Test Name: mbind01 */ |
| 40 | /* History: Porting from Crackerjack to LTP is done by */ |
| 41 | /* Manas Kumar Nayak maknayak@in.ibm.com> */ |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 42 | /******************************************************************************/ |
| 43 | |
yaberauneya | b8b3564 | 2009-12-23 00:13:20 +0000 | [diff] [blame] | 44 | #include "config.h" |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 45 | #include <sys/types.h> |
| 46 | #include <sys/mman.h> |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 47 | #include <sys/syscall.h> |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 48 | #include <errno.h> |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 49 | #include <getopt.h> |
| 50 | #include <libgen.h> |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 51 | #if HAVE_NUMA_H |
| 52 | #include <numa.h> |
| 53 | #endif |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 54 | #if HAVE_NUMAIF_H |
| 55 | #include <numaif.h> |
| 56 | #endif |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 57 | #include <stdio.h> |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 58 | #include <stdlib.h> |
| 59 | #include <string.h> |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 60 | #include <unistd.h> |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 61 | |
| 62 | #include "test.h" |
| 63 | #include "usctest.h" |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 64 | #include "linux_syscall_numbers.h" |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 65 | #include "include_j_h.h" |
Jan Stancek | a03a9d9 | 2012-06-28 11:03:16 +0200 | [diff] [blame] | 66 | #include "numa_helper.h" |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 67 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 68 | char *TCID = "mbind01"; |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 69 | int TST_TOTAL = 2; |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 70 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 71 | #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H && \ |
| 72 | HAVE_MPOL_CONSTANTS |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 73 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 74 | #define MEM_LENGTH (4 * 1024 * 1024) |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 75 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 76 | static int testno; |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 77 | |
| 78 | enum test_type { |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 79 | NORMAL, |
| 80 | INVALID_POINTER, |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 81 | }; |
| 82 | |
| 83 | enum from_node { |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 84 | NONE, |
| 85 | SELF, |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 86 | }; |
| 87 | |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 88 | struct test_case { |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 89 | int ttype; |
| 90 | int policy; |
| 91 | int from_node; |
| 92 | unsigned flags; |
| 93 | int ret; |
| 94 | int err; |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 95 | }; |
| 96 | |
| 97 | /* Test cases |
| 98 | * |
| 99 | * test status of errors on man page |
| 100 | * |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 101 | * 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_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 106 | */ |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 107 | static struct test_case tcase[] = { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 108 | { /* 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_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 176 | }; |
| 177 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 178 | static int do_test(struct test_case *tc); |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 179 | static void setup(void); |
| 180 | static void cleanup(void); |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 181 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 182 | int 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 Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 199 | tst_resm((ret == 0 ? TPASS : TFAIL | TERRNO), |
| 200 | "(case%02d) END", i); |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 201 | } |
| 202 | } |
| 203 | cleanup(); |
| 204 | tst_exit(); |
| 205 | } |
| 206 | |
| 207 | static int do_test(struct test_case *tc) |
| 208 | { |
| 209 | int ret, err, result, cmp_ok = 1; |
| 210 | int policy; |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 211 | char *p = NULL; |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 212 | #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 |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 218 | unsigned long maxnode = NUMA_NUM_NODES; |
| 219 | unsigned long len = MEM_LENGTH; |
subrata_modak | 2130b5e | 2009-09-07 09:28:08 +0000 | [diff] [blame] | 220 | unsigned long *invalid_nodemask; |
Jan Stancek | a03a9d9 | 2012-06-28 11:03:16 +0200 | [diff] [blame] | 221 | int test_node = -1; |
| 222 | |
Jan Stancek | d534a44 | 2012-08-09 14:15:38 +0800 | [diff] [blame] | 223 | ret = get_allowed_nodes(NH_MEMS, 1, &test_node); |
| 224 | if (ret < 0) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 225 | tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret); |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 226 | |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 227 | #if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2 |
| 228 | nodemask = malloc(sizeof(nodemask_t)); |
| 229 | nodemask_zero(nodemask); |
Jan Stancek | a03a9d9 | 2012-06-28 11:03:16 +0200 | [diff] [blame] | 230 | nodemask_set(nodemask, test_node); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 231 | getnodemask = malloc(sizeof(nodemask_t)); |
| 232 | nodemask_zero(getnodemask); |
| 233 | #else |
Jan Stancek | a03a9d9 | 2012-06-28 11:03:16 +0200 | [diff] [blame] | 234 | numa_bitmask_setbit(nodemask, test_node); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 235 | #endif |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 236 | p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, |
| 237 | 0, 0); |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 238 | if (p == MAP_FAILED) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 239 | tst_brkm(TBROK | TERRNO, cleanup, "mmap"); |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 240 | |
Garrett Cooper | df3eb16 | 2010-11-28 22:44:32 -0800 | [diff] [blame] | 241 | if (tc->ttype == INVALID_POINTER) |
subrata_modak | 2130b5e | 2009-09-07 09:28:08 +0000 | [diff] [blame] | 242 | invalid_nodemask = (unsigned long *)0xc0000000; |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 243 | |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 244 | errno = 0; |
| 245 | if (tc->from_node == NONE) |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 246 | TEST(ret = syscall(__NR_mbind, p, len, tc->policy, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 247 | NULL, 0, tc->flags)); |
subrata_modak | 2130b5e | 2009-09-07 09:28:08 +0000 | [diff] [blame] | 248 | else if (tc->ttype == INVALID_POINTER) |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 249 | TEST(ret = syscall(__NR_mbind, p, len, tc->policy, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 250 | invalid_nodemask, maxnode, tc->flags)); |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 251 | else |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 252 | #if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2 |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 253 | TEST(ret = syscall(__NR_mbind, p, len, tc->policy, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 254 | nodemask, maxnode, tc->flags)); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 255 | #else |
| 256 | TEST(ret = syscall(__NR_mbind, p, len, tc->policy, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 257 | nodemask->maskp, nodemask->size, tc->flags)); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 258 | #endif |
| 259 | |
| 260 | err = TEST_ERRNO; |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 261 | if (ret < 0) |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 262 | goto TEST_END; |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 263 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 264 | /* Check policy of the allocated memory */ |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 265 | #if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2 |
| 266 | TEST(syscall(__NR_get_mempolicy, &policy, getnodemask, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 267 | maxnode, p, MPOL_F_ADDR)); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 268 | #else |
| 269 | TEST(syscall(__NR_get_mempolicy, &policy, getnodemask->maskp, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 270 | getnodemask->size, p, MPOL_F_ADDR)); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 271 | #endif |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 272 | if (TEST_RETURN < 0) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 273 | tst_resm(TFAIL | TERRNO, "get_mempolicy failed"); |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 274 | return -1; |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 275 | } |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 276 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 277 | /* If policy == MPOL_DEFAULT, get_mempolicy doesn't return nodemask */ |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 278 | if (tc->policy == MPOL_DEFAULT) |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 279 | #if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2 |
| 280 | nodemask_zero(nodemask); |
| 281 | #else |
| 282 | numa_bitmask_clearall(nodemask); |
| 283 | #endif |
| 284 | |
subrata_modak | 3c2d60d | 2009-09-07 09:26:42 +0000 | [diff] [blame] | 285 | if ((tc->policy == MPOL_PREFERRED) && (tc->from_node == NONE)) |
| 286 | cmp_ok = (tc->policy == policy); |
| 287 | else |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 288 | cmp_ok = ((tc->policy == policy) && |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 289 | #if !defined(LIBNUMA_API_VERSION) || LIBNUMA_API_VERSION < 2 |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 290 | nodemask_equal(nodemask, getnodemask)); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 291 | #else |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 292 | numa_bitmask_equal(nodemask, getnodemask)); |
Caspar Zhang | 6e914e0 | 2012-03-09 17:51:35 +0800 | [diff] [blame] | 293 | #endif |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 294 | TEST_END: |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 295 | result = ((err != tc->err) || (!cmp_ok)); |
| 296 | PRINT_RESULT_CMP(0, tc->ret, tc->err, ret, err, cmp_ok); |
yaberauneya | 6eb4bde | 2009-11-04 04:59:44 +0000 | [diff] [blame] | 297 | return result; |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 298 | } |
| 299 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 300 | static void setup(void) |
| 301 | { |
Caspar Zhang | 07e750a | 2012-08-09 18:31:56 +0800 | [diff] [blame] | 302 | /* check syscall availability */ |
| 303 | syscall(__NR_mbind, NULL, 0, 0, NULL, 0, 0); |
| 304 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 305 | TEST_PAUSE; |
| 306 | tst_tmpdir(); |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 307 | } |
| 308 | |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 309 | static void cleanup(void) |
| 310 | { |
| 311 | TEST_CLEANUP; |
| 312 | tst_rmdir(); |
subrata_modak | fa09c3a | 2009-06-15 18:36:14 +0000 | [diff] [blame] | 313 | } |
Caspar Zhang | 459abbd | 2012-03-09 17:40:43 +0800 | [diff] [blame] | 314 | #else /* no NUMA */ |
| 315 | int main(void) |
| 316 | { |
| 317 | tst_brkm(TCONF, NULL, "System doesn't have required numa support"); |
yaberauneya | b8b3564 | 2009-12-23 00:13:20 +0000 | [diff] [blame] | 318 | } |
Caspar Zhang | 384b3f5 | 2011-04-25 09:07:37 +0800 | [diff] [blame] | 319 | #endif |