1 /*	$NetBSD: t_cpuset.c,v 1.1 2011/11/08 05:47:00 jruoho Exp $ */
2 
3 /*-
4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jukka Ruohonen.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 #include <sys/cdefs.h>
32 __RCSID("$NetBSD: t_cpuset.c,v 1.1 2011/11/08 05:47:00 jruoho Exp $");
33 
34 #include <atf-c.h>
35 #include <limits.h>
36 #include <stdio.h>
37 #include <sched.h>
38 
39 #ifdef __FreeBSD__
40 #include <sys/cpuset.h>
41 
42 #include <stdlib.h>
43 
44 #define	cpuset_create()		calloc(1, sizeof(cpuset_t))
45 #define	cpuset_destroy(cs)	free(cs)
46 
47 static inline int
48 cpuset_set(size_t i, cpuset_t *cs)
49 {
50 
51 	if (i > CPU_SETSIZE)
52 		return (-1);
53 	CPU_SET(i, cs);
54 	return (0);
55 }
56 
57 static inline int
58 cpuset_clr(size_t i, cpuset_t *cs)
59 {
60 
61 	if (i > CPU_SETSIZE)
62 		return (-1);
63 	CPU_CLR(i, cs);
64 	return (0);
65 }
66 
67 static inline int
68 cpuset_isset(size_t i, cpuset_t *cs)
69 {
70 
71 	if (i > CPU_SETSIZE)
72 		return (-1);
73 	return (CPU_ISSET(i, cs));
74 }
75 
76 #define	cpuset_size(cs)		sizeof(*cs)
77 #endif
78 
79 ATF_TC(cpuset_err);
80 ATF_TC_HEAD(cpuset_err, tc)
81 {
82 	atf_tc_set_md_var(tc, "descr", "Test errors from cpuset(3)");
83 }
84 
85 ATF_TC_BODY(cpuset_err, tc)
86 {
87 	cpuset_t *set;
88 
89 	set = cpuset_create();
90 	ATF_REQUIRE(set != NULL);
91 
92 	ATF_CHECK(cpuset_set(-1, set) == -1);
93 	ATF_CHECK(cpuset_clr(-1, set) == -1);
94 	ATF_CHECK(cpuset_isset(-1, set) == -1);
95 
96 	ATF_CHECK(cpuset_set(INT_MAX, set) == -1);
97 	ATF_CHECK(cpuset_clr(INT_MAX, set) == -1);
98 	ATF_CHECK(cpuset_isset(INT_MAX, set) == -1);
99 
100 	cpuset_destroy(set);
101 }
102 
103 ATF_TC(cpuset_set);
104 ATF_TC_HEAD(cpuset_set, tc)
105 {
106 	atf_tc_set_md_var(tc, "descr", "Test cpuset_set(3)");
107 }
108 
109 ATF_TC_BODY(cpuset_set, tc)
110 {
111 	cpuset_t *set;
112 
113 	set = cpuset_create();
114 	ATF_REQUIRE(set != NULL);
115 
116 	ATF_REQUIRE(cpuset_set(0, set) == 0);
117 	ATF_REQUIRE(cpuset_isset(0, set) > 0);
118 	ATF_REQUIRE(cpuset_clr(0, set) == 0);
119 	ATF_REQUIRE(cpuset_isset(0, set) == 0);
120 
121 	cpuset_destroy(set);
122 }
123 
124 ATF_TC(cpuset_size);
125 ATF_TC_HEAD(cpuset_size, tc)
126 {
127 	atf_tc_set_md_var(tc, "descr", "Test puset_size(3)");
128 }
129 
130 ATF_TC_BODY(cpuset_size, tc)
131 {
132 	cpuset_t *set;
133 	size_t size;
134 
135 	set = cpuset_create();
136 	ATF_REQUIRE(set != NULL);
137 
138 	size = cpuset_size(set);
139 
140 	ATF_CHECK(cpuset_set((size * 8) - 1, set) == 0);
141 	ATF_CHECK(cpuset_set((size * 8) + 1, set) == -1);
142 
143 	cpuset_destroy(set);
144 }
145 
146 ATF_TP_ADD_TCS(tp)
147 {
148 
149 	ATF_TP_ADD_TC(tp, cpuset_err);
150 	ATF_TP_ADD_TC(tp, cpuset_set);
151 	ATF_TP_ADD_TC(tp, cpuset_size);
152 
153 	return atf_no_error();
154 }
155