Skip to content

Commit dbe67df

Browse files
jiangliutorvalds
authored andcommitted
mm: enhance free_reserved_area() to support poisoning memory with zero
Address more review comments from last round of code review. 1) Enhance free_reserved_area() to support poisoning freed memory with pattern '0'. This could be used to get rid of poison_init_mem() on ARM64. 2) A previous patch has disabled memory poison for initmem on s390 by mistake, so restore to the original behavior. 3) Remove redundant PAGE_ALIGN() when calling free_reserved_area(). Signed-off-by: Jiang Liu <jiang.liu@huawei.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: <sworddragon2@aol.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Chris Metcalf <cmetcalf@tilera.com> Cc: David Howells <dhowells@redhat.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: Jianguo Wu <wujianguo@huawei.com> Cc: Joonsoo Kim <js1304@gmail.com> Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Michel Lespinasse <walken@google.com> Cc: Minchan Kim <minchan@kernel.org> Cc: Rik van Riel <riel@redhat.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Tang Chen <tangchen@cn.fujitsu.com> Cc: Tejun Heo <tj@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Wen Congyang <wency@cn.fujitsu.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Russell King <rmk@arm.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 1119969 commit dbe67df

File tree

26 files changed

+49
-53
lines changed

26 files changed

+49
-53
lines changed

arch/alpha/kernel/sys_nautilus.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ nautilus_init_pci(void)
239239
memtop = pci_mem;
240240
if (memtop > alpha_mv.min_mem_address) {
241241
free_reserved_area(__va(alpha_mv.min_mem_address),
242-
__va(memtop), 0, NULL);
242+
__va(memtop), -1, NULL);
243243
printk("nautilus_init_pci: %ldk freed\n",
244244
(memtop - alpha_mv.min_mem_address) >> 10);
245245
}

arch/alpha/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,13 @@ mem_init(void)
319319
void
320320
free_initmem(void)
321321
{
322-
free_initmem_default(0);
322+
free_initmem_default(-1);
323323
}
324324

325325
#ifdef CONFIG_BLK_DEV_INITRD
326326
void
327327
free_initrd_mem(unsigned long start, unsigned long end)
328328
{
329-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
329+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
330330
}
331331
#endif

arch/arc/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,13 @@ void __init mem_init(void)
146146
*/
147147
void __init_refok free_initmem(void)
148148
{
149-
free_initmem_default(0);
149+
free_initmem_default(-1);
150150
}
151151

152152
#ifdef CONFIG_BLK_DEV_INITRD
153153
void __init free_initrd_mem(unsigned long start, unsigned long end)
154154
{
155-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
155+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
156156
}
157157
#endif
158158

arch/arm/mm/init.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ void __init mem_init(void)
601601

602602
#ifdef CONFIG_SA1111
603603
/* now that our DMA memory is actually so designated, we can free it */
604-
free_reserved_area(__va(PHYS_PFN_OFFSET), swapper_pg_dir, 0, NULL);
604+
free_reserved_area(__va(PHYS_PFN_OFFSET), swapper_pg_dir, -1, NULL);
605605
#endif
606606

607607
free_highpages();
@@ -729,12 +729,12 @@ void free_initmem(void)
729729
extern char __tcm_start, __tcm_end;
730730

731731
poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start);
732-
free_reserved_area(&__tcm_start, &__tcm_end, 0, "TCM link");
732+
free_reserved_area(&__tcm_start, &__tcm_end, -1, "TCM link");
733733
#endif
734734

735735
poison_init_mem(__init_begin, __init_end - __init_begin);
736736
if (!machine_is_integrator() && !machine_is_cintegrator())
737-
free_initmem_default(0);
737+
free_initmem_default(-1);
738738
}
739739

740740
#ifdef CONFIG_BLK_DEV_INITRD
@@ -745,7 +745,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
745745
{
746746
if (!keep_initrd) {
747747
poison_init_mem((void *)start, PAGE_ALIGN(end) - start);
748-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
748+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
749749
}
750750
}
751751

arch/arm64/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ void __init mem_init(void)
387387
void free_initmem(void)
388388
{
389389
poison_init_mem(__init_begin, __init_end - __init_begin);
390-
free_initmem_default(0);
390+
free_initmem_default(-1);
391391
}
392392

393393
#ifdef CONFIG_BLK_DEV_INITRD
@@ -398,7 +398,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
398398
{
399399
if (!keep_initrd) {
400400
poison_init_mem((void *)start, PAGE_ALIGN(end) - start);
401-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
401+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
402402
}
403403
}
404404

arch/avr32/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,12 @@ void __init mem_init(void)
148148

149149
void free_initmem(void)
150150
{
151-
free_initmem_default(0);
151+
free_initmem_default(-1);
152152
}
153153

154154
#ifdef CONFIG_BLK_DEV_INITRD
155155
void free_initrd_mem(unsigned long start, unsigned long end)
156156
{
157-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
157+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
158158
}
159159
#endif

arch/blackfin/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,15 @@ void __init mem_init(void)
133133
void __init free_initrd_mem(unsigned long start, unsigned long end)
134134
{
135135
#ifndef CONFIG_MPU
136-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
136+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
137137
#endif
138138
}
139139
#endif
140140

141141
void __init_refok free_initmem(void)
142142
{
143143
#if defined CONFIG_RAMKERNEL && !defined CONFIG_MPU
144-
free_initmem_default(0);
144+
free_initmem_default(-1);
145145
if (memory_start == (unsigned long)(&__init_end))
146146
memory_start = (unsigned long)(&__init_begin);
147147
#endif

arch/c6x/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ void __init mem_init(void)
7878
#ifdef CONFIG_BLK_DEV_INITRD
7979
void __init free_initrd_mem(unsigned long start, unsigned long end)
8080
{
81-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
81+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
8282
}
8383
#endif
8484

8585
void __init free_initmem(void)
8686
{
87-
free_initmem_default(0);
87+
free_initmem_default(-1);
8888
}

arch/cris/mm/init.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,5 @@ mem_init(void)
6565
void
6666
free_initmem(void)
6767
{
68-
free_initmem_default(0);
68+
free_initmem_default(-1);
6969
}

arch/frv/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ void __init mem_init(void)
162162
void free_initmem(void)
163163
{
164164
#if defined(CONFIG_RAMKERNEL) && !defined(CONFIG_PROTECT_KERNEL)
165-
free_initmem_default(0);
165+
free_initmem_default(-1);
166166
#endif
167167
} /* end free_initmem() */
168168

@@ -173,6 +173,6 @@ void free_initmem(void)
173173
#ifdef CONFIG_BLK_DEV_INITRD
174174
void __init free_initrd_mem(unsigned long start, unsigned long end)
175175
{
176-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
176+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
177177
} /* end free_initrd_mem() */
178178
#endif

arch/h8300/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -161,15 +161,15 @@ void __init mem_init(void)
161161
#ifdef CONFIG_BLK_DEV_INITRD
162162
void free_initrd_mem(unsigned long start, unsigned long end)
163163
{
164-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
164+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
165165
}
166166
#endif
167167

168168
void
169169
free_initmem(void)
170170
{
171171
#ifdef CONFIG_RAMKERNEL
172-
free_initmem_default(0);
172+
free_initmem_default(-1);
173173
#endif
174174
}
175175

arch/ia64/mm/init.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ void
155155
free_initmem (void)
156156
{
157157
free_reserved_area(ia64_imva(__init_begin), ia64_imva(__init_end),
158-
0, "unused kernel");
158+
-1, "unused kernel");
159159
}
160160

161161
void __init

arch/m32r/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ void __init mem_init(void)
181181
*======================================================================*/
182182
void free_initmem(void)
183183
{
184-
free_initmem_default(0);
184+
free_initmem_default(-1);
185185
}
186186

187187
#ifdef CONFIG_BLK_DEV_INITRD
@@ -191,6 +191,6 @@ void free_initmem(void)
191191
*======================================================================*/
192192
void free_initrd_mem(unsigned long start, unsigned long end)
193193
{
194-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
194+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
195195
}
196196
#endif

arch/m68k/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ void __init paging_init(void)
110110
void free_initmem(void)
111111
{
112112
#ifndef CONFIG_MMU_SUN3
113-
free_initmem_default(0);
113+
free_initmem_default(-1);
114114
#endif /* CONFIG_MMU_SUN3 */
115115
}
116116

@@ -202,6 +202,6 @@ void __init mem_init(void)
202202
#ifdef CONFIG_BLK_DEV_INITRD
203203
void free_initrd_mem(unsigned long start, unsigned long end)
204204
{
205-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
205+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
206206
}
207207
#endif

arch/microblaze/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,13 @@ void __init setup_memory(void)
235235
#ifdef CONFIG_BLK_DEV_INITRD
236236
void free_initrd_mem(unsigned long start, unsigned long end)
237237
{
238-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
238+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
239239
}
240240
#endif
241241

242242
void free_initmem(void)
243243
{
244-
free_initmem_default(0);
244+
free_initmem_default(-1);
245245
}
246246

247247
void __init mem_init(void)

arch/openrisc/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,11 @@ void __init mem_init(void)
261261
#ifdef CONFIG_BLK_DEV_INITRD
262262
void free_initrd_mem(unsigned long start, unsigned long end)
263263
{
264-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
264+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
265265
}
266266
#endif
267267

268268
void free_initmem(void)
269269
{
270-
free_initmem_default(0);
270+
free_initmem_default(-1);
271271
}

arch/parisc/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ void free_initmem(void)
532532
* pages are no-longer executable */
533533
flush_icache_range(init_begin, init_end);
534534

535-
num_physpages += free_initmem_default(0);
535+
num_physpages += free_initmem_default(-1);
536536

537537
/* set up a new led state on systems shipped LED State panel */
538538
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE);
@@ -1101,7 +1101,7 @@ void flush_tlb_all(void)
11011101
#ifdef CONFIG_BLK_DEV_INITRD
11021102
void free_initrd_mem(unsigned long start, unsigned long end)
11031103
{
1104-
num_physpages += free_reserved_area((void *)start, (void *)end, 0,
1104+
num_physpages += free_reserved_area((void *)start, (void *)end, -1,
11051105
"initrd");
11061106
}
11071107
#endif

arch/powerpc/kernel/kvm.c

+2-7
Original file line numberDiff line numberDiff line change
@@ -750,13 +750,8 @@ EXPORT_SYMBOL_GPL(kvm_hypercall);
750750

751751
static __init void kvm_free_tmp(void)
752752
{
753-
unsigned long start, end;
754-
755-
start = (ulong)&kvm_tmp[kvm_tmp_index + (PAGE_SIZE - 1)] & PAGE_MASK;
756-
end = (ulong)&kvm_tmp[ARRAY_SIZE(kvm_tmp)] & PAGE_MASK;
757-
758-
/* Free the tmp space we don't need */
759-
free_reserved_area((void *)start, (void *)end, 0, NULL);
753+
free_reserved_area(&kvm_tmp[kvm_tmp_index],
754+
&kvm_tmp[ARRAY_SIZE(kvm_tmp)], -1, NULL);
760755
}
761756

762757
static int __init kvm_guest_init(void)

arch/powerpc/mm/mem.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ void free_initmem(void)
407407
#ifdef CONFIG_BLK_DEV_INITRD
408408
void __init free_initrd_mem(unsigned long start, unsigned long end)
409409
{
410-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
410+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
411411
}
412412
#endif
413413

arch/s390/mm/init.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void __init mem_init(void)
166166

167167
void free_initmem(void)
168168
{
169-
free_initmem_default(0);
169+
free_initmem_default(POISON_FREE_INITMEM);
170170
}
171171

172172
#ifdef CONFIG_BLK_DEV_INITRD

arch/sh/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -499,13 +499,13 @@ void __init mem_init(void)
499499

500500
void free_initmem(void)
501501
{
502-
free_initmem_default(0);
502+
free_initmem_default(-1);
503503
}
504504

505505
#ifdef CONFIG_BLK_DEV_INITRD
506506
void free_initrd_mem(unsigned long start, unsigned long end)
507507
{
508-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
508+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
509509
}
510510
#endif
511511

arch/um/kernel/mem.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ void free_initmem(void)
244244
#ifdef CONFIG_BLK_DEV_INITRD
245245
void free_initrd_mem(unsigned long start, unsigned long end)
246246
{
247-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
247+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
248248
}
249249
#endif
250250

arch/unicore32/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ void __init mem_init(void)
476476

477477
void free_initmem(void)
478478
{
479-
free_initmem_default(0);
479+
free_initmem_default(-1);
480480
}
481481

482482
#ifdef CONFIG_BLK_DEV_INITRD
@@ -486,7 +486,7 @@ static int keep_initrd;
486486
void free_initrd_mem(unsigned long start, unsigned long end)
487487
{
488488
if (!keep_initrd)
489-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
489+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
490490
}
491491

492492
static int __init keepinitrd_setup(char *__unused)

arch/xtensa/mm/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,11 @@ extern int initrd_is_mapped;
214214
void free_initrd_mem(unsigned long start, unsigned long end)
215215
{
216216
if (initrd_is_mapped)
217-
free_reserved_area((void *)start, (void *)end, 0, "initrd");
217+
free_reserved_area((void *)start, (void *)end, -1, "initrd");
218218
}
219219
#endif
220220

221221
void free_initmem(void)
222222
{
223-
free_initmem_default(0);
223+
free_initmem_default(-1);
224224
}

include/linux/mm.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -1308,7 +1308,7 @@ extern void free_initmem(void);
13081308
/*
13091309
* Free reserved pages within range [PAGE_ALIGN(start), end & PAGE_MASK)
13101310
* into the buddy system. The freed pages will be poisoned with pattern
1311-
* "poison" if it's non-zero.
1311+
* "poison" if it's within range [0, UCHAR_MAX].
13121312
* Return pages freed into the buddy system.
13131313
*/
13141314
extern unsigned long free_reserved_area(void *start, void *end,
@@ -1348,8 +1348,9 @@ static inline void mark_page_reserved(struct page *page)
13481348

13491349
/*
13501350
* Default method to free all the __init memory into the buddy system.
1351-
* The freed pages will be poisoned with pattern "poison" if it is
1352-
* non-zero. Return pages freed into the buddy system.
1351+
* The freed pages will be poisoned with pattern "poison" if it's within
1352+
* range [0, UCHAR_MAX].
1353+
* Return pages freed into the buddy system.
13531354
*/
13541355
static inline unsigned long free_initmem_default(int poison)
13551356
{

mm/page_alloc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -5214,7 +5214,7 @@ unsigned long free_reserved_area(void *start, void *end, int poison, char *s)
52145214
start = (void *)PAGE_ALIGN((unsigned long)start);
52155215
end = (void *)((unsigned long)end & PAGE_MASK);
52165216
for (pos = start; pos < end; pos += PAGE_SIZE, pages++) {
5217-
if (poison)
5217+
if ((unsigned int)poison <= 0xFF)
52185218
memset(pos, poison, PAGE_SIZE);
52195219
free_reserved_page(virt_to_page(pos));
52205220
}

0 commit comments

Comments
 (0)