xref: /mOS-networking-stack/util/cpu.c (revision 76404edc)
1*76404edcSAsim Jamshed #ifndef _GNU_SOURCE
2*76404edcSAsim Jamshed #define _GNU_SOURCE
3*76404edcSAsim Jamshed #endif
4*76404edcSAsim Jamshed 
5*76404edcSAsim Jamshed #include <unistd.h>
6*76404edcSAsim Jamshed #include <errno.h>
7*76404edcSAsim Jamshed #include <numa.h>
8*76404edcSAsim Jamshed #include <sched.h>
9*76404edcSAsim Jamshed #include <sys/stat.h>
10*76404edcSAsim Jamshed #include <assert.h>
11*76404edcSAsim Jamshed 
12*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
GetNumCPUs()13*76404edcSAsim Jamshed int GetNumCPUs()
14*76404edcSAsim Jamshed {
15*76404edcSAsim Jamshed 	return sysconf(_SC_NPROCESSORS_ONLN);
16*76404edcSAsim Jamshed }
17*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
18*76404edcSAsim Jamshed int
CoreAffinitize(int cpu)19*76404edcSAsim Jamshed CoreAffinitize(int cpu)
20*76404edcSAsim Jamshed {
21*76404edcSAsim Jamshed 	cpu_set_t *cmask;
22*76404edcSAsim Jamshed 	struct bitmask *bmask;
23*76404edcSAsim Jamshed 	size_t n;
24*76404edcSAsim Jamshed 	int ret;
25*76404edcSAsim Jamshed 
26*76404edcSAsim Jamshed 	n = GetNumCPUs();
27*76404edcSAsim Jamshed 
28*76404edcSAsim Jamshed 	if (cpu < 0 || cpu >= (int) n) {
29*76404edcSAsim Jamshed 		errno = -EINVAL;
30*76404edcSAsim Jamshed 		return -1;
31*76404edcSAsim Jamshed 	}
32*76404edcSAsim Jamshed 
33*76404edcSAsim Jamshed 	cmask = CPU_ALLOC(n);
34*76404edcSAsim Jamshed 	if (cmask == NULL)
35*76404edcSAsim Jamshed 		return -1;
36*76404edcSAsim Jamshed 
37*76404edcSAsim Jamshed 	CPU_ZERO_S(n, cmask);
38*76404edcSAsim Jamshed 	CPU_SET_S(cpu, n, cmask);
39*76404edcSAsim Jamshed 
40*76404edcSAsim Jamshed 	ret = sched_setaffinity(0, n, cmask);
41*76404edcSAsim Jamshed 
42*76404edcSAsim Jamshed 	CPU_FREE(cmask);
43*76404edcSAsim Jamshed 
44*76404edcSAsim Jamshed 	if (numa_max_node() == 0)
45*76404edcSAsim Jamshed 		return ret;
46*76404edcSAsim Jamshed 
47*76404edcSAsim Jamshed 	bmask = numa_bitmask_alloc(16);
48*76404edcSAsim Jamshed 	assert(bmask);
49*76404edcSAsim Jamshed 
50*76404edcSAsim Jamshed 	numa_bitmask_setbit(bmask, cpu %2);
51*76404edcSAsim Jamshed 	numa_set_membind(bmask);
52*76404edcSAsim Jamshed 	numa_bitmask_free(bmask);
53*76404edcSAsim Jamshed 
54*76404edcSAsim Jamshed 	return ret;
55*76404edcSAsim Jamshed }
56