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