1 | /*- |
---|
2 | * SPDX-License-Identifier: BSD-2-Clause-FreeBSD |
---|
3 | * |
---|
4 | * Copyright (c) 2017, Jeffrey Roberson <jeff@freebsd.org> |
---|
5 | * All rights reserved. |
---|
6 | * |
---|
7 | * Redistribution and use in source and binary forms, with or without |
---|
8 | * modification, are permitted provided that the following conditions |
---|
9 | * are met: |
---|
10 | * 1. Redistributions of source code must retain the above copyright |
---|
11 | * notice unmodified, this list of conditions, and the following |
---|
12 | * disclaimer. |
---|
13 | * 2. Redistributions in binary form must reproduce the above copyright |
---|
14 | * notice, this list of conditions and the following disclaimer in the |
---|
15 | * documentation and/or other materials provided with the distribution. |
---|
16 | * |
---|
17 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
---|
18 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
---|
19 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
---|
20 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
---|
21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
---|
22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
---|
23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
---|
24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
---|
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
---|
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
27 | * |
---|
28 | * $FreeBSD$ |
---|
29 | */ |
---|
30 | |
---|
31 | #ifndef _SYS_DOMAINSET_H_ |
---|
32 | #define _SYS_DOMAINSET_H_ |
---|
33 | |
---|
34 | #include <sys/_domainset.h> |
---|
35 | #include <sys/bitset.h> |
---|
36 | #include <sys/queue.h> |
---|
37 | |
---|
38 | #define _NDOMAINSETBITS _BITSET_BITS |
---|
39 | #define _NDOMAINSETWORDS __bitset_words(DOMAINSET_SETSIZE) |
---|
40 | |
---|
41 | #define DOMAINSETBUFSIZ \ |
---|
42 | (((2 + sizeof(long) * 2) * _NDOMAINSETWORDS) + \ |
---|
43 | sizeof("::") + sizeof(__XSTRING(DOMAINSET_POLICY_MAX)) + \ |
---|
44 | sizeof(__XSTRING(MAXMEMDOM))) |
---|
45 | |
---|
46 | |
---|
47 | #define DOMAINSET_CLR(n, p) __BIT_CLR(DOMAINSET_SETSIZE, n, p) |
---|
48 | #define DOMAINSET_COPY(f, t) __BIT_COPY(DOMAINSET_SETSIZE, f, t) |
---|
49 | #define DOMAINSET_ISSET(n, p) __BIT_ISSET(DOMAINSET_SETSIZE, n, p) |
---|
50 | #define DOMAINSET_SET(n, p) __BIT_SET(DOMAINSET_SETSIZE, n, p) |
---|
51 | #define DOMAINSET_ZERO(p) __BIT_ZERO(DOMAINSET_SETSIZE, p) |
---|
52 | #define DOMAINSET_FILL(p) __BIT_FILL(DOMAINSET_SETSIZE, p) |
---|
53 | #define DOMAINSET_SETOF(n, p) __BIT_SETOF(DOMAINSET_SETSIZE, n, p) |
---|
54 | #define DOMAINSET_EMPTY(p) __BIT_EMPTY(DOMAINSET_SETSIZE, p) |
---|
55 | #define DOMAINSET_ISFULLSET(p) __BIT_ISFULLSET(DOMAINSET_SETSIZE, p) |
---|
56 | #define DOMAINSET_SUBSET(p, c) __BIT_SUBSET(DOMAINSET_SETSIZE, p, c) |
---|
57 | #define DOMAINSET_OVERLAP(p, c) __BIT_OVERLAP(DOMAINSET_SETSIZE, p, c) |
---|
58 | #define DOMAINSET_CMP(p, c) __BIT_CMP(DOMAINSET_SETSIZE, p, c) |
---|
59 | #define DOMAINSET_OR(d, s) __BIT_OR(DOMAINSET_SETSIZE, d, s) |
---|
60 | #define DOMAINSET_AND(d, s) __BIT_AND(DOMAINSET_SETSIZE, d, s) |
---|
61 | #define DOMAINSET_NAND(d, s) __BIT_NAND(DOMAINSET_SETSIZE, d, s) |
---|
62 | #define DOMAINSET_CLR_ATOMIC(n, p) __BIT_CLR_ATOMIC(DOMAINSET_SETSIZE, n, p) |
---|
63 | #define DOMAINSET_SET_ATOMIC(n, p) __BIT_SET_ATOMIC(DOMAINSET_SETSIZE, n, p) |
---|
64 | #define DOMAINSET_SET_ATOMIC_ACQ(n, p) \ |
---|
65 | __BIT_SET_ATOMIC_ACQ(DOMAINSET_SETSIZE, n, p) |
---|
66 | #define DOMAINSET_AND_ATOMIC(n, p) __BIT_AND_ATOMIC(DOMAINSET_SETSIZE, n, p) |
---|
67 | #define DOMAINSET_OR_ATOMIC(d, s) __BIT_OR_ATOMIC(DOMAINSET_SETSIZE, d, s) |
---|
68 | #define DOMAINSET_COPY_STORE_REL(f, t) \ |
---|
69 | __BIT_COPY_STORE_REL(DOMAINSET_SETSIZE, f, t) |
---|
70 | #define DOMAINSET_FFS(p) __BIT_FFS(DOMAINSET_SETSIZE, p) |
---|
71 | #define DOMAINSET_FLS(p) __BIT_FLS(DOMAINSET_SETSIZE, p) |
---|
72 | #define DOMAINSET_COUNT(p) __BIT_COUNT(DOMAINSET_SETSIZE, p) |
---|
73 | #define DOMAINSET_FSET __BITSET_FSET(_NDOMAINSETWORDS) |
---|
74 | #define DOMAINSET_T_INITIALIZER __BITSET_T_INITIALIZER |
---|
75 | |
---|
76 | #define DOMAINSET_POLICY_INVALID 0 |
---|
77 | #define DOMAINSET_POLICY_ROUNDROBIN 1 |
---|
78 | #define DOMAINSET_POLICY_FIRSTTOUCH 2 |
---|
79 | #define DOMAINSET_POLICY_PREFER 3 |
---|
80 | #define DOMAINSET_POLICY_INTERLEAVE 4 |
---|
81 | #define DOMAINSET_POLICY_MAX DOMAINSET_POLICY_INTERLEAVE |
---|
82 | |
---|
83 | #ifdef _KERNEL |
---|
84 | #if MAXMEMDOM < 256 |
---|
85 | typedef uint8_t domainid_t; |
---|
86 | #else |
---|
87 | typedef uint16_t domainid_t; |
---|
88 | #endif |
---|
89 | |
---|
90 | struct domainset { |
---|
91 | LIST_ENTRY(domainset) ds_link; |
---|
92 | domainset_t ds_mask; /* allowed domains. */ |
---|
93 | uint16_t ds_policy; /* Policy type. */ |
---|
94 | domainid_t ds_prefer; /* Preferred domain or -1. */ |
---|
95 | domainid_t ds_cnt; /* popcnt from above. */ |
---|
96 | domainid_t ds_order[MAXMEMDOM]; /* nth domain table. */ |
---|
97 | }; |
---|
98 | |
---|
99 | extern struct domainset domainset_fixed[MAXMEMDOM], domainset_prefer[MAXMEMDOM]; |
---|
100 | #define DOMAINSET_FIXED(domain) (&domainset_fixed[(domain)]) |
---|
101 | #define DOMAINSET_PREF(domain) (&domainset_prefer[(domain)]) |
---|
102 | extern struct domainset domainset_roundrobin; |
---|
103 | #define DOMAINSET_RR() (&domainset_roundrobin) |
---|
104 | |
---|
105 | void domainset_init(void); |
---|
106 | void domainset_zero(void); |
---|
107 | |
---|
108 | /* |
---|
109 | * Add a domainset to the system based on a key initializing policy, prefer, |
---|
110 | * and mask. Do not create and directly use domainset structures. The |
---|
111 | * returned value will not match the key pointer. |
---|
112 | */ |
---|
113 | struct domainset *domainset_create(const struct domainset *); |
---|
114 | #ifdef _SYS_SYSCTL_H_ |
---|
115 | int sysctl_handle_domainset(SYSCTL_HANDLER_ARGS); |
---|
116 | #endif |
---|
117 | |
---|
118 | #else |
---|
119 | __BEGIN_DECLS |
---|
120 | int cpuset_getdomain(cpulevel_t, cpuwhich_t, id_t, size_t, domainset_t *, |
---|
121 | int *); |
---|
122 | int cpuset_setdomain(cpulevel_t, cpuwhich_t, id_t, size_t, |
---|
123 | const domainset_t *, int); |
---|
124 | |
---|
125 | __END_DECLS |
---|
126 | #endif |
---|
127 | #endif /* !_SYS_DOMAINSET_H_ */ |
---|