668
|
1
|
|
2 /*
|
|
3 * Copyright (C) Nginx, Inc.
|
|
4 */
|
|
5
|
|
6
|
|
7 #include <ngx_config.h>
|
|
8 #include <ngx_core.h>
|
|
9
|
|
10
|
|
11 #if (NGX_HAVE_CPUSET_SETAFFINITY)
|
|
12
|
|
13 #include <sys/cpuset.h>
|
|
14
|
|
15 void
|
|
16 ngx_setaffinity(uint64_t cpu_affinity, ngx_log_t *log)
|
|
17 {
|
|
18 cpuset_t mask;
|
|
19 ngx_uint_t i;
|
|
20
|
|
21 ngx_log_error(NGX_LOG_NOTICE, log, 0,
|
|
22 "cpuset_setaffinity(0x%08Xl)", cpu_affinity);
|
|
23
|
|
24 CPU_ZERO(&mask);
|
|
25 i = 0;
|
|
26 do {
|
|
27 if (cpu_affinity & 1) {
|
|
28 CPU_SET(i, &mask);
|
|
29 }
|
|
30 i++;
|
|
31 cpu_affinity >>= 1;
|
|
32 } while (cpu_affinity);
|
|
33
|
|
34 if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1,
|
|
35 sizeof(cpuset_t), &mask) == -1)
|
|
36 {
|
|
37 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
|
38 "cpuset_setaffinity() failed");
|
|
39 }
|
|
40 }
|
|
41
|
|
42 #elif (NGX_HAVE_SCHED_SETAFFINITY)
|
|
43
|
|
44 void
|
|
45 ngx_setaffinity(uint64_t cpu_affinity, ngx_log_t *log)
|
|
46 {
|
|
47 cpu_set_t mask;
|
|
48 ngx_uint_t i;
|
|
49
|
|
50 ngx_log_error(NGX_LOG_NOTICE, log, 0,
|
|
51 "sched_setaffinity(0x%08Xl)", cpu_affinity);
|
|
52
|
|
53 CPU_ZERO(&mask);
|
|
54 i = 0;
|
|
55 do {
|
|
56 if (cpu_affinity & 1) {
|
|
57 CPU_SET(i, &mask);
|
|
58 }
|
|
59 i++;
|
|
60 cpu_affinity >>= 1;
|
|
61 } while (cpu_affinity);
|
|
62
|
|
63 if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
|
|
64 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
|
65 "sched_setaffinity() failed");
|
|
66 }
|
|
67 }
|
|
68
|
|
69 #endif
|