xref: /illumos-gate/usr/src/compat/bhyve/sys/cpuset.h (revision d0b3c59b)
1bf21cd93STycho Nightingale /*
2bf21cd93STycho Nightingale  * This file and its contents are supplied under the terms of the
3bf21cd93STycho Nightingale  * Common Development and Distribution License ("CDDL"), version 1.0.
4bf21cd93STycho Nightingale  * You may only use this file in accordance with the terms of version
5bf21cd93STycho Nightingale  * 1.0 of the CDDL.
6bf21cd93STycho Nightingale  *
7bf21cd93STycho Nightingale  * A full copy of the text of the CDDL should have accompanied this
8bf21cd93STycho Nightingale  * source.  A copy of the CDDL is also available via the Internet at
9bf21cd93STycho Nightingale  * http://www.illumos.org/license/CDDL.
10bf21cd93STycho Nightingale  */
11bf21cd93STycho Nightingale 
12bf21cd93STycho Nightingale /*
13bf21cd93STycho Nightingale  * Copyright 2014 Pluribus Networks Inc.
144c87aefeSPatrick Mooney  * Copyright 2019 Joyent, Inc.
15bf21cd93STycho Nightingale  */
16bf21cd93STycho Nightingale 
17bf21cd93STycho Nightingale #ifndef _COMPAT_FREEBSD_SYS_CPUSET_H_
18bf21cd93STycho Nightingale #define	_COMPAT_FREEBSD_SYS_CPUSET_H_
19bf21cd93STycho Nightingale 
20bf21cd93STycho Nightingale #define	NOCPU			-1
21bf21cd93STycho Nightingale 
22bf21cd93STycho Nightingale #ifdef	_KERNEL
234c87aefeSPatrick Mooney 
244c87aefeSPatrick Mooney #include <sys/_cpuset.h>
254c87aefeSPatrick Mooney 
264c87aefeSPatrick Mooney #define	CPU_SET(cpu, set)		cpuset_add((set), (cpu))
274c87aefeSPatrick Mooney #define	CPU_SETOF(cpu, set)		cpuset_only((set), (cpu))
284c87aefeSPatrick Mooney #define	CPU_ZERO(set)			cpuset_zero((cpuset_t *)(set))
294c87aefeSPatrick Mooney #define	CPU_CLR(cpu, set)		cpuset_del((set), (cpu))
304c87aefeSPatrick Mooney #define	CPU_EMPTY(set)			cpuset_isnull((set))
31bf21cd93STycho Nightingale #define	CPU_FFS(set)			cpusetobj_ffs(set)
324c87aefeSPatrick Mooney #define	CPU_ISSET(cpu, set)		cpu_in_set((cpuset_t *)(set), (cpu))
334c87aefeSPatrick Mooney #define	CPU_AND(dst, src)		cpuset_and(			\
344c87aefeSPatrick Mooney 						(cpuset_t *)(dst),	\
354c87aefeSPatrick Mooney 						(cpuset_t *)(src))
364c87aefeSPatrick Mooney #define	CPU_OR(dst, src)		cpuset_or(			\
374c87aefeSPatrick Mooney 						(cpuset_t *)(dst),	\
384c87aefeSPatrick Mooney 						(cpuset_t *)(src))
394c87aefeSPatrick Mooney #define	CPU_CMP(set1, set2)		(cpuset_isequal(		\
404c87aefeSPatrick Mooney 						(cpuset_t *)(set1),	\
414c87aefeSPatrick Mooney 						(cpuset_t *)(set2)) == 0)
424c87aefeSPatrick Mooney #define	CPU_SET_ATOMIC(cpu, set)	cpuset_atomic_add(		\
434c87aefeSPatrick Mooney 						(cpuset_t *)(set),	\
444c87aefeSPatrick Mooney 						(cpu))
454c87aefeSPatrick Mooney #define	CPU_CLR_ATOMIC(cpu, set)	cpuset_atomic_del(		\
464c87aefeSPatrick Mooney 						(cpuset_t *)(set),	\
474c87aefeSPatrick Mooney 						(cpu))
484c87aefeSPatrick Mooney 
494c87aefeSPatrick Mooney #define	CPU_SET_ATOMIC_ACQ(cpu, set)	cpuset_atomic_add((set), (cpu))
50bf21cd93STycho Nightingale 
51bf21cd93STycho Nightingale 
52bf21cd93STycho Nightingale int	cpusetobj_ffs(const cpuset_t *set);
534c87aefeSPatrick Mooney 
54bf21cd93STycho Nightingale #else
554c87aefeSPatrick Mooney 
564c87aefeSPatrick Mooney #include <sys/bitmap.h>
57bf21cd93STycho Nightingale #include <machine/atomic.h>
584c87aefeSPatrick Mooney #include <machine/cpufunc.h>
594c87aefeSPatrick Mooney 
604c87aefeSPatrick Mooney /* For now, assume NCPU of 256 */
614c87aefeSPatrick Mooney #define	CPU_SETSIZE			(256)
624c87aefeSPatrick Mooney 
634c87aefeSPatrick Mooney typedef struct {
644c87aefeSPatrick Mooney 	ulong_t _bits[BT_BITOUL(CPU_SETSIZE)];
654c87aefeSPatrick Mooney } cpuset_t;
664c87aefeSPatrick Mooney 
674c87aefeSPatrick Mooney static __inline int
cpuset_isempty(const cpuset_t * set)684c87aefeSPatrick Mooney cpuset_isempty(const cpuset_t *set)
694c87aefeSPatrick Mooney {
704c87aefeSPatrick Mooney 	uint_t i;
71bf21cd93STycho Nightingale 
724c87aefeSPatrick Mooney 	for (i = 0; i < BT_BITOUL(CPU_SETSIZE); i++) {
734c87aefeSPatrick Mooney 		if (set->_bits[i] != 0)
744c87aefeSPatrick Mooney 			return (0);
754c87aefeSPatrick Mooney 	}
764c87aefeSPatrick Mooney 	return (1);
774c87aefeSPatrick Mooney }
78bf21cd93STycho Nightingale 
794c87aefeSPatrick Mooney static __inline void
cpuset_zero(cpuset_t * dst)804c87aefeSPatrick Mooney cpuset_zero(cpuset_t *dst)
814c87aefeSPatrick Mooney {
824c87aefeSPatrick Mooney 	uint_t i;
834c87aefeSPatrick Mooney 
844c87aefeSPatrick Mooney 	for (i = 0; i < BT_BITOUL(CPU_SETSIZE); i++) {
854c87aefeSPatrick Mooney 		dst->_bits[i] = 0;
864c87aefeSPatrick Mooney 	}
874c87aefeSPatrick Mooney }
884c87aefeSPatrick Mooney 
894c87aefeSPatrick Mooney static __inline int
cpuset_isequal(cpuset_t * s1,cpuset_t * s2)904c87aefeSPatrick Mooney cpuset_isequal(cpuset_t *s1, cpuset_t *s2)
914c87aefeSPatrick Mooney {
924c87aefeSPatrick Mooney 	uint_t i;
934c87aefeSPatrick Mooney 
944c87aefeSPatrick Mooney 	for (i = 0; i < BT_BITOUL(CPU_SETSIZE); i++) {
954c87aefeSPatrick Mooney 		if (s1->_bits[i] != s2->_bits[i])
964c87aefeSPatrick Mooney 			return (0);
974c87aefeSPatrick Mooney 	}
984c87aefeSPatrick Mooney 	return (1);
994c87aefeSPatrick Mooney }
1004c87aefeSPatrick Mooney 
1014c87aefeSPatrick Mooney static __inline uint_t
cpusetobj_ffs(const cpuset_t * set)1024c87aefeSPatrick Mooney cpusetobj_ffs(const cpuset_t *set)
1034c87aefeSPatrick Mooney {
1044c87aefeSPatrick Mooney 	uint_t i, cbit;
1054c87aefeSPatrick Mooney 
1064c87aefeSPatrick Mooney 	cbit = 0;
1074c87aefeSPatrick Mooney 	for (i = 0; i < BT_BITOUL(CPU_SETSIZE); i++) {
1084c87aefeSPatrick Mooney 		if (set->_bits[i] != 0) {
1094c87aefeSPatrick Mooney 			cbit = ffsl(set->_bits[i]);
1104c87aefeSPatrick Mooney 			cbit += i * sizeof (set->_bits[0]);
1114c87aefeSPatrick Mooney 			break;
1124c87aefeSPatrick Mooney 		}
1134c87aefeSPatrick Mooney 	}
1144c87aefeSPatrick Mooney 	return (cbit);
1154c87aefeSPatrick Mooney }
1164c87aefeSPatrick Mooney 
1174c87aefeSPatrick Mooney 
1184c87aefeSPatrick Mooney #define	CPU_SET(cpu, setp)		BT_SET((setp)->_bits, cpu)
1194c87aefeSPatrick Mooney #define	CPU_CLR(cpu, setp)		BT_CLEAR((setp)->_bits, cpu)
1204c87aefeSPatrick Mooney #define	CPU_ZERO(setp)			cpuset_zero((setp))
1214c87aefeSPatrick Mooney #define	CPU_CMP(set1, set2)		(cpuset_isequal(		\
1224c87aefeSPatrick Mooney 						(cpuset_t *)(set1),	\
1234c87aefeSPatrick Mooney 						(cpuset_t *)(set2)) == 0)
1244c87aefeSPatrick Mooney #define	CPU_FFS(set)			cpusetobj_ffs(set)
1254c87aefeSPatrick Mooney #define	CPU_ISSET(cpu, setp)		BT_TEST((setp)->_bits, cpu)
1264c87aefeSPatrick Mooney #define	CPU_EMPTY(setp)			cpuset_isempty((setp))
1274c87aefeSPatrick Mooney #define	CPU_SET_ATOMIC(cpu, setp)	\
1284c87aefeSPatrick Mooney 	atomic_set_long(&(BT_WIM((setp)->_bits, cpu)), BT_BIW(cpu))
1294c87aefeSPatrick Mooney #define	CPU_CLR_ATOMIC(cpu, setp)	\
1304c87aefeSPatrick Mooney 	atomic_clear_long(&(BT_WIM((setp)->_bits, cpu)), BT_BIW(cpu))
131bf21cd93STycho Nightingale 
132bf21cd93STycho Nightingale #endif
133bf21cd93STycho Nightingale 
134bf21cd93STycho Nightingale #endif	/* _COMPAT_FREEBSD_SYS_CPUSET_H_ */
135