annotate src/core/ngx_cpuinfo.c @ 9270:3d455e37abf8 default tip

Core: PID file writing synchronization. Now, ngx_daemon() does not call exit() in the parent process immediately, but instead waits for the child process to signal it actually started (and wrote the PID file if configured to). This ensures that the PID file already exists when the parent process exits. To make sure that signal handlers won't cause unexpected logging in the parent process if the child process dies (for example, due to errors when writing the PID file), ngx_init_signals() is moved to the child process. This resolves "PID file ... not readable (yet?) after start" and "Failed to parse PID from file..." errors as observed with systemd. Note that the errors observed are considered to be a bug in systemd, which isn't able to work properly with traditional Unix daemons. Still, the workaround is implemented to make sure there will be no OS vendor patches trying to address this.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 13 May 2024 06:13:22 +0300
parents d620f497c50f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 2613
diff changeset
4 * Copyright (C) Nginx, Inc.
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 #if (( __i386__ || __amd64__ ) && ( __GNUC__ || __INTEL_COMPILER ))
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 static ngx_inline void ngx_cpuid(uint32_t i, uint32_t *buf);
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
18 #if ( __i386__ )
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
19
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
20 static ngx_inline void
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
21 ngx_cpuid(uint32_t i, uint32_t *buf)
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
22 {
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
23
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
24 /*
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
25 * we could not use %ebx as output parameter if gcc builds PIC,
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
26 * and we could not save %ebx on stack, because %esp is used,
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
27 * when the -fomit-frame-pointer optimization is specified.
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
28 */
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
29
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
30 __asm__ (
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
31
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
32 " mov %%ebx, %%esi; "
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
33
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
34 " cpuid; "
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
35 " mov %%eax, (%1); "
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
36 " mov %%ebx, 4(%1); "
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
37 " mov %%edx, 8(%1); "
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
38 " mov %%ecx, 12(%1); "
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
39
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
40 " mov %%esi, %%ebx; "
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
41
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
42 : : "a" (i), "D" (buf) : "ecx", "edx", "esi", "memory" );
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
43 }
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
44
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
45
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
46 #else /* __amd64__ */
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
47
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
48
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 static ngx_inline void
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 ngx_cpuid(uint32_t i, uint32_t *buf)
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 {
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 uint32_t eax, ebx, ecx, edx;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 __asm__ (
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 "cpuid"
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (i) );
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 buf[0] = eax;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 buf[1] = ebx;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 buf[2] = edx;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 buf[3] = ecx;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 }
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
67 #endif
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
68
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 611
diff changeset
69
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 /* auto detect the L2 cache line size of modern and widespread CPUs */
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 void
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 ngx_cpuinfo(void)
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 {
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 u_char *vendor;
2613
b863be280d3b update cpuid for Core 2 and Atom
Igor Sysoev <igor@sysoev.ru>
parents: 1872
diff changeset
76 uint32_t vbuf[5], cpu[4], model;
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 vbuf[0] = 0;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 vbuf[1] = 0;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 vbuf[2] = 0;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 vbuf[3] = 0;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 vbuf[4] = 0;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 ngx_cpuid(0, vbuf);
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 vendor = (u_char *) &vbuf[1];
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 if (vbuf[0] == 0) {
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 return;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 }
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 ngx_cpuid(1, cpu);
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 if (ngx_strcmp(vendor, "GenuineIntel") == 0) {
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95
1871
9afb84c7cc61 fix cache line size for Pentium 4
Igor Sysoev <igor@sysoev.ru>
parents: 651
diff changeset
96 switch ((cpu[0] & 0xf00) >> 8) {
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 /* Pentium */
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 case 5:
1872
8e88522cb6da detect L2 cache line size for Intel Core
Igor Sysoev <igor@sysoev.ru>
parents: 1871
diff changeset
100 ngx_cacheline_size = 32;
8e88522cb6da detect L2 cache line size for Intel Core
Igor Sysoev <igor@sysoev.ru>
parents: 1871
diff changeset
101 break;
8e88522cb6da detect L2 cache line size for Intel Core
Igor Sysoev <igor@sysoev.ru>
parents: 1871
diff changeset
102
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 /* Pentium Pro, II, III */
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 case 6:
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 ngx_cacheline_size = 32;
1872
8e88522cb6da detect L2 cache line size for Intel Core
Igor Sysoev <igor@sysoev.ru>
parents: 1871
diff changeset
106
2613
b863be280d3b update cpuid for Core 2 and Atom
Igor Sysoev <igor@sysoev.ru>
parents: 1872
diff changeset
107 model = ((cpu[0] & 0xf0000) >> 8) | (cpu[0] & 0xf0);
b863be280d3b update cpuid for Core 2 and Atom
Igor Sysoev <igor@sysoev.ru>
parents: 1872
diff changeset
108
b863be280d3b update cpuid for Core 2 and Atom
Igor Sysoev <igor@sysoev.ru>
parents: 1872
diff changeset
109 if (model >= 0xd0) {
b863be280d3b update cpuid for Core 2 and Atom
Igor Sysoev <igor@sysoev.ru>
parents: 1872
diff changeset
110 /* Intel Core, Core 2, Atom */
1872
8e88522cb6da detect L2 cache line size for Intel Core
Igor Sysoev <igor@sysoev.ru>
parents: 1871
diff changeset
111 ngx_cacheline_size = 64;
8e88522cb6da detect L2 cache line size for Intel Core
Igor Sysoev <igor@sysoev.ru>
parents: 1871
diff changeset
112 }
8e88522cb6da detect L2 cache line size for Intel Core
Igor Sysoev <igor@sysoev.ru>
parents: 1871
diff changeset
113
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 break;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 /*
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 * Pentium 4, although its cache line size is 64 bytes,
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 * it prefetches up to two cache lines during memory read
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 */
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 case 15:
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 ngx_cacheline_size = 128;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 break;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 }
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 } else if (ngx_strcmp(vendor, "AuthenticAMD") == 0) {
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 ngx_cacheline_size = 64;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 }
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 }
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 #else
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 void
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ngx_cpuinfo(void)
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 {
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 }
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 #endif