hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/mm/mm_init.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * mm_init.c - Memory initialisation verification and debugging
34 *
....@@ -12,6 +13,7 @@
1213 #include <linux/memory.h>
1314 #include <linux/notifier.h>
1415 #include <linux/sched.h>
16
+#include <linux/mman.h>
1517 #include "internal.h"
1618
1719 #ifdef CONFIG_DEBUG_MEMORY_INIT
....@@ -36,7 +38,7 @@
3638 struct zonelist *zonelist;
3739 int i, listid, zoneid;
3840
39
- BUG_ON(MAX_ZONELISTS > 2);
41
+ BUILD_BUG_ON(MAX_ZONELISTS > 2);
4042 for (i = 0; i < MAX_ZONELISTS * MAX_NR_ZONES; i++) {
4143
4244 /* Identify the zone and nodelist */
....@@ -66,26 +68,30 @@
6668 unsigned long or_mask, add_mask;
6769
6870 shift = 8 * sizeof(unsigned long);
69
- width = shift - SECTIONS_WIDTH - NODES_WIDTH - ZONES_WIDTH - LAST_CPUPID_SHIFT;
71
+ width = shift - SECTIONS_WIDTH - NODES_WIDTH - ZONES_WIDTH
72
+ - LAST_CPUPID_SHIFT - KASAN_TAG_WIDTH;
7073 mminit_dprintk(MMINIT_TRACE, "pageflags_layout_widths",
71
- "Section %d Node %d Zone %d Lastcpupid %d Flags %d\n",
74
+ "Section %d Node %d Zone %d Lastcpupid %d Kasantag %d Flags %d\n",
7275 SECTIONS_WIDTH,
7376 NODES_WIDTH,
7477 ZONES_WIDTH,
7578 LAST_CPUPID_WIDTH,
79
+ KASAN_TAG_WIDTH,
7680 NR_PAGEFLAGS);
7781 mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts",
78
- "Section %d Node %d Zone %d Lastcpupid %d\n",
82
+ "Section %d Node %d Zone %d Lastcpupid %d Kasantag %d\n",
7983 SECTIONS_SHIFT,
8084 NODES_SHIFT,
8185 ZONES_SHIFT,
82
- LAST_CPUPID_SHIFT);
86
+ LAST_CPUPID_SHIFT,
87
+ KASAN_TAG_WIDTH);
8388 mminit_dprintk(MMINIT_TRACE, "pageflags_layout_pgshifts",
84
- "Section %lu Node %lu Zone %lu Lastcpupid %lu\n",
89
+ "Section %lu Node %lu Zone %lu Lastcpupid %lu Kasantag %lu\n",
8590 (unsigned long)SECTIONS_PGSHIFT,
8691 (unsigned long)NODES_PGSHIFT,
8792 (unsigned long)ZONES_PGSHIFT,
88
- (unsigned long)LAST_CPUPID_PGSHIFT);
93
+ (unsigned long)LAST_CPUPID_PGSHIFT,
94
+ (unsigned long)KASAN_TAG_PGSHIFT);
8995 mminit_dprintk(MMINIT_TRACE, "pageflags_layout_nodezoneid",
9096 "Node/Zone ID: %lu -> %lu\n",
9197 (unsigned long)(ZONEID_PGOFF + ZONEID_SHIFT),
....@@ -139,14 +145,23 @@
139145 #ifdef CONFIG_SMP
140146 s32 vm_committed_as_batch = 32;
141147
142
-static void __meminit mm_compute_batch(void)
148
+void mm_compute_batch(int overcommit_policy)
143149 {
144150 u64 memsized_batch;
145151 s32 nr = num_present_cpus();
146152 s32 batch = max_t(s32, nr*2, 32);
153
+ unsigned long ram_pages = totalram_pages();
147154
148
- /* batch size set to 0.4% of (total memory/#cpus), or max int32 */
149
- memsized_batch = min_t(u64, (totalram_pages/nr)/256, 0x7fffffff);
155
+ /*
156
+ * For policy OVERCOMMIT_NEVER, set batch size to 0.4% of
157
+ * (total memory/#cpus), and lift it to 25% for other policies
158
+ * to easy the possible lock contention for percpu_counter
159
+ * vm_committed_as, while the max limit is INT_MAX
160
+ */
161
+ if (overcommit_policy == OVERCOMMIT_NEVER)
162
+ memsized_batch = min_t(u64, ram_pages/nr/256, INT_MAX);
163
+ else
164
+ memsized_batch = min_t(u64, ram_pages/nr/4, INT_MAX);
150165
151166 vm_committed_as_batch = max_t(s32, memsized_batch, batch);
152167 }
....@@ -157,7 +172,7 @@
157172 switch (action) {
158173 case MEM_ONLINE:
159174 case MEM_OFFLINE:
160
- mm_compute_batch();
175
+ mm_compute_batch(sysctl_overcommit_memory);
161176 default:
162177 break;
163178 }
....@@ -171,7 +186,7 @@
171186
172187 static int __init mm_compute_batch_init(void)
173188 {
174
- mm_compute_batch();
189
+ mm_compute_batch(sysctl_overcommit_memory);
175190 register_hotmemory_notifier(&compute_batch_nb);
176191
177192 return 0;