#define _GNU_SOURCE #include #include #include #include struct cpu_map cpu_map; void ha_cpuset_zero(struct hap_cpuset *set) { #if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET) CPU_ZERO(&set->cpuset); #elif defined(CPUSET_USE_ULONG) set->cpuset = 0; #endif } int ha_cpuset_set(struct hap_cpuset *set, int cpu) { if (cpu >= ha_cpuset_size()) return 1; #if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET) CPU_SET(cpu, &set->cpuset); return 0; #elif defined(CPUSET_USE_ULONG) set->cpuset |= (0x1 << cpu); return 0; #endif } int ha_cpuset_clr(struct hap_cpuset *set, int cpu) { if (cpu >= ha_cpuset_size()) return 1; #if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET) CPU_CLR(cpu, &set->cpuset); return 0; #elif defined(CPUSET_USE_ULONG) set->cpuset &= ~(0x1 << cpu); return 0; #endif } void ha_cpuset_and(struct hap_cpuset *dst, struct hap_cpuset *src) { #if defined(CPUSET_USE_CPUSET) CPU_AND(&dst->cpuset, &dst->cpuset, &src->cpuset); #elif defined(CPUSET_USE_FREEBSD_CPUSET) CPU_AND(&dst->cpuset, &src->cpuset); #elif defined(CPUSET_USE_ULONG) dst->cpuset &= src->cpuset; #endif } int ha_cpuset_count(const struct hap_cpuset *set) { #if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET) return CPU_COUNT(&set->cpuset); #elif defined(CPUSET_USE_ULONG) return my_popcountl(set->cpuset); #endif } int ha_cpuset_ffs(const struct hap_cpuset *set) { #if defined(CPUSET_USE_CPUSET) int n; if (!CPU_COUNT(&set->cpuset)) return 0; for (n = 0; !CPU_ISSET(n, &set->cpuset); ++n) ; return n + 1; #elif defined(CPUSET_USE_FREEBSD_CPUSET) return CPU_FFS(&set->cpuset); #elif defined(CPUSET_USE_ULONG) if (!set->cpuset) return 0; return my_ffsl(set->cpuset); #endif } void ha_cpuset_assign(struct hap_cpuset *dst, struct hap_cpuset *src) { #if defined(CPUSET_USE_CPUSET) CPU_ZERO(&dst->cpuset); CPU_OR(&dst->cpuset, &dst->cpuset, &src->cpuset); #elif defined(CPUSET_USE_FREEBSD_CPUSET) CPU_COPY(&src->cpuset, &dst->cpuset); #elif defined(CPUSET_USE_ULONG) dst->cpuset = src->cpuset; #endif } int ha_cpuset_size() { #if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET) return CPU_SETSIZE; #elif defined(CPUSET_USE_ULONG) return LONGBITS; #endif }