source: rtems-libbsd/freebsd/sys/sys/domainset.h @ 9561e24

6-freebsd-12
Last change on this file since 9561e24 was 9561e24, checked in by Stefan Eßer <se@…>, on 12/05/21 at 21:27:33

sys/bitset.h: reduce visibility of BIT_* macros

Add two underscore characters "" to names of BIT_* and BITSET_*
macros to move them to the implementation name space and to prevent
a name space pollution due to BIT_* macros in 3rd party programs with
conflicting parameter signatures.

These prefixed macro names are used in kernel header files to define
macros in e.g. sched.h, sys/cpuset.h and sys/domainset.h.

If C programs are built with either -D_KERNEL (automatically passed
when building a kernel or kernel modules) or -D_WANT_FREENBSD_BITSET
(or this macros is defined in the source code before including the
bitset macros), then all macros are made visible with their previous
names, too. E.g., both BIT_SET() and BIT_SET() are visible with
either of _KERNEL or _WANT_FREEBSD_BITSET defined.

The main reason for this change is that some 3rd party sources
including sched.h have been found to contain conflicting BIT_*
macros.

As a work-around, parts of shed.h have been made conditional and
depend on _WITH_CPU_SET_T being set when sched.h is included.
Ports that expect the full functionality provided by sched.h need
to be built with -D_WITH_CPU_SET_T. But this leads to conflicts if
BIT_* macros are defined in that program, too.

This patch set makes all of sched.h visible again without this
parameter being passed and without any name space pollution due
to BIT_* macros becoming visible when sched.h is included.

This patch set will be backported to the STABLE branches, but ports
will need to use -D_WITH_CPU_SET_T as long as there are supported
releases that do not contain these patches.

Reviewed by: kib, markj
MFC after: 1 month
Relnotes: yes
Differential Revision: https://reviews.freebsd.org/D33235

  • Property mode set to 100644
File size: 5.1 KB
Line 
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
85typedef uint8_t         domainid_t;
86#else
87typedef uint16_t        domainid_t;
88#endif
89
90struct 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
99extern struct domainset domainset_fixed[MAXMEMDOM], domainset_prefer[MAXMEMDOM];
100#define DOMAINSET_FIXED(domain) (&domainset_fixed[(domain)])
101#define DOMAINSET_PREF(domain)  (&domainset_prefer[(domain)])
102extern struct domainset domainset_roundrobin;
103#define DOMAINSET_RR()          (&domainset_roundrobin)
104
105void domainset_init(void);
106void 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 */
113struct domainset *domainset_create(const struct domainset *);
114#ifdef _SYS_SYSCTL_H_
115int sysctl_handle_domainset(SYSCTL_HANDLER_ARGS);
116#endif
117
118#else
119__BEGIN_DECLS
120int     cpuset_getdomain(cpulevel_t, cpuwhich_t, id_t, size_t, domainset_t *,
121            int *);
122int     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_ */
Note: See TracBrowser for help on using the repository browser.