Skip to content

x86: not use bootmem for x86

Yinghai Lu lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest36 patches 9 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/36x86: move range related operation to one filearch/x86/kernel/cpu/mtrr/cleanup.c arch/x86/kernel/mmconf-fam10h_64.c arch/x86/pci/amd_bus.c +3 more+205 -2300 replies
2/36x86: check range in update rangekernel/range.c+9 -03 replies
3/36x86/pci: use u64 instead of size_t in amd_bus.carch/x86/pci/amd_bus.c+8 -80 replies
4/36x86/pci: add cap_resourcearch/x86/pci/amd_bus.c arch/x86/pci/bus_numa.c arch/x86/pci/intel_bus.c +1 more+20 -42 replies
5/36x86/pci: enable pci root res read out for 32bit tooarch/x86/pci/Makefile arch/x86/pci/amd_bus.c arch/x86/pci/bus_numa.h +2 more+5 -222 replies
6/36x86: call early_res_to_bootmem one timearch/x86/kernel/setup.c arch/x86/mm/init_32.c arch/x86/mm/init_64.c +1 more+22 -450 replies
7/36x86: introduce max_early_res and early_res_countarch/x86/kernel/e820.c+32 -150 replies
8/36x86: dynamic increase early_res array sizearch/x86/kernel/e820.c+53 -00 replies
9/36x86: print bootmem free before pci_iommu_alloc and free_all_bootmem -v2arch/x86/mm/init_64.c include/linux/bootmem.h mm/bootmem.c+96 -00 replies
10/36x86: make early_node_mem get mem > 4g if possiblearch/x86/mm/numa_64.c+17 -40 replies
11/36x86: only call dma32_reserve_bootmem 64bit !CONFIG_NUMAarch/x86/include/asm/pci.h arch/x86/include/asm/pci_64.h arch/x86/kernel/pci-dma.c +1 more+12 -120 replies
12/36x86: make 64 bit use early_res instead of bootmem before slabarch/x86/Kconfig arch/x86/include/asm/e820.h arch/x86/kernel/e820.c +10 more+450 -240 replies
13/36sparsemem: put usemap for one node togethermm/sparse.c+66 -180 replies
14/36sparsemem: put mem map for one node together.arch/x86/mm/init_64.c include/linux/mm.h mm/Kconfig +2 more+196 -30 replies
15/36x86: change range end to start+sizearch/x86/kernel/cpu/mtrr/cleanup.c arch/x86/kernel/e820.c arch/x86/pci/amd_bus.c +3 more+43 -390 replies
16/36x86: move bios page reserve early to head32/64.carch/x86/kernel/e820.c arch/x86/kernel/head32.c arch/x86/kernel/head64.c+16 -200 replies
17/36x86: seperate early_res related code from e820.carch/x86/include/asm/e820.h arch/x86/include/asm/early_res.h arch/x86/kernel/Makefile +2 more+562 -5530 replies
18/36x86: add find_early_area_sizearch/x86/kernel/early_res.c+32 -130 replies
19/36x86: move back find_e820_area to e820.carch/x86/include/asm/e820.h arch/x86/include/asm/early_res.h arch/x86/kernel/e820.c +1 more+61 -580 replies
20/36early_res: enhance check_and_double_early_resarch/x86/kernel/early_res.c+20 -70 replies
21/36x86: make 32bit support NO_BOOTMEMarch/x86/Kconfig arch/x86/kernel/early_res.c arch/x86/mm/init_32.c +1 more+12 -10 replies
22/36move round_up/down to kernel.harch/x86/include/asm/proto.h include/linux/kernel.h+10 -102 replies
23/36x86: add find_fw_memmap_areaarch/x86/include/asm/early_res.h arch/x86/kernel/e820.c arch/x86/kernel/early_res.c+16 -60 replies
24/36core: move early_resarch/x86/include/asm/e820.h arch/x86/include/asm/early_res.h arch/x86/kernel/Makefile +5 more+546 -5480 replies
25/36x86: print out for RAM bufferarch/x86/kernel/e820.c+3 -00 replies
26/36x86: remove bios data range from e820arch/x86/kernel/e820.c arch/x86/kernel/head32.c arch/x86/kernel/head64.c +2 more+26 -210 replies
27/36x86/pci: add mmconf range into e820 for when it is from MSR with amd faml0harch/x86/kernel/mmconf-fam10h_64.c+23 -170 replies
28/36irq: remove not need bootmem codekernel/irq/handle.c+3 -110 replies
29/36radix: move radix init earlyinit/main.c+1 -10 replies
30/36sparseirq: change irq_desc_ptrs to statickernel/irq/handle.c kernel/irq/internals.h kernel/irq/numa_migrate.c+9 -80 replies
31/36sparseirq: use radix_tree instead of ptrs arraykernel/irq/handle.c+25 -240 replies
32/36x86: remove arch_probe_nr_irqsarch/x86/kernel/apic/io_apic.c+0 -220 replies
33/36use nr_cpus= to set nr_cpu_ids earlyarch/ia64/kernel/acpi.c arch/x86/kernel/smpboot.c drivers/acpi/numa.c +1 more+22 -70 replies
34/36x86: according to nr_cpu_ids to decide if need to leave logical flatarch/x86/kernel/apic/apic.c arch/x86/kernel/apic/probe_32.c arch/x86/kernel/apic/probe_64.c +1 more+23 -70 replies
35/36x86: make 32bit apic flat to physflat switch like 64bitarch/x86/include/asm/apic.h arch/x86/include/asm/mpspec.h arch/x86/kernel/acpi/boot.c +6 more+46 -1120 replies
36/36x86: use num_processors for possible cpusarch/x86/kernel/smpboot.c+1 -20 replies

Reviews trailers per patch

6 of 36 patches have a Reviewed-by or Acked-by.

PatchJesse BarnesLinus TorvaldsYinghai LuChristoph Lameter
1/36
2/36
3/36A-b
4/36A-b
5/36A-b
6/36
7/36
8/36
9/36
10/36
11/36
12/36
13/36
14/36A-b
15/36
16/36
17/36
18/36
19/36
20/36
21/36
22/36
23/36
24/36
25/36A-b R-b
26/36
27/36
28/36
29/36
30/36
31/36
32/36
33/36A-b
34/36
35/36
36/36

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 4 reviewers.

Read the v1 thread

Cover letter [PATCH -v4 0/36] x86: not use bootmem for x86

please check the patches regarding with early_res and bootmem

and at last it will use early_res instead of bootmem with x86 64bits

-v2: allocate vmemmap on one node together, and also seperate early_res -v3: make x86 32 bit support early_res to use bootmem too
move related early_res to kernel/
sparse vmemmap together: address Ingo.
-v4: some patches could go with tip with acked-by Jesse
radix and logical flat etc

http://lkml.indiana.edu/hypermail/linux/kernel/0910.3/01432.html
Ingo said:
------------------------
I think we could remove the bootmem allocator middle man altogether.

This can be done by initializing the page allocator sooner and by extending (already existing) 'reserve memory early on' mechanisms in architecture code. (the reserve_early*() APIs in x86 for example)

Right now we have 5 memory allocation models on x86, initialized gradually:

- allocator (buddy) [generic]
- early allocator (bootmem) [generic]
- very early allocator (reserve_early*()) [x86]
- very very early allocator (early brk model) [x86]
- very very very early allocator (build time .data/.bss) [generic]

Seems excessive.

The reserve_early() method is list/range based and can handle vast amounts of not very fragmented memory - perfect for basically all the real bootmem purposes (which is to bootstrap the buddy).

reserve_early() allocated memory could be freed into the buddy later on as well. The main reason why bootmem is 'destroyed' during free-to-buddy is because it has excessive internal bitmaps we want to free. With a list/range based reserve_early() mechanism there's no such problem - they can linger indefinitely and there's near zero allocation management overhead.

reserve_early() might need some small amount of extra work before it can be used as a generic early allocator - like adding a node field to it (so that the buddy can then pick those ranges up in a NUMA aware fashion) - but nothing very complex.

--------x86 early_res related-------------
277f661: x86: move range related operation to one file
77f283c: x86: check range in update range
897f4ba: x86/pci: use u64 instead of size_t in amd_bus.c
84431bb: x86/pci: add cap_resource
48d49e8: x86/pci: enable pci root res read out for 32bit too
5255621: x86: call early_res_to_bootmem one time
0925f47: x86: introduce max_early_res and early_res_count
0c97b47: x86: dynamic increase early_res array size
f910ca6: x86: print bootmem free before pci_iommu_alloc and free_all_bootmem -v2
cfe85c0: x86: make early_node_mem get mem > 4g if possible
1d61d6c: x86: only call dma32_reserve_bootmem 64bit !CONFIG_NUMA 311f90d: x86: make 64 bit use early_res instead of bootmem before slab 788c828: sparsemem: put usemap for one node together
c1bb314: sparsemem: put mem map for one node together.
6e61ad7: x86: change range end to start+size
2a25d29: x86: move bios page reserve early to head32/64.c
36f0ad3: x86: seperate early_res related code from e820.c
ef1540b: x86: add find_early_area_size
fdd6fc1: x86: move back find_e820_area to e820.c
bedba96: early_res: enhance check_and_double_early_res
5c40d2d: x86: make 32bit support NO_BOOTMEM
c7987c9: move round_up/down to kernel.h
b047971: x86: add find_fw_memmap_area
a7ea42c: core: move early_res
5c972f9: x86: print out for RAM buffer
1267c07: x86: remove bios data range from e820
4826805: x86/pci: add mmconf range into e820 for when it is from MSR with amd faml0h

---------spareirq radix tree related ----------------
eba3887: irq: remove not need bootmem code 4c0d053: radix: move radix init early
5026493: sparseirq: change irq_desc_ptrs to static
e74a8ce: sparseirq: use radix_tree instead of ptrs array

---------------x86 logical flat related -----------
fa2bb9e: x86: remove arch_probe_nr_irqs
50f2e29: use nr_cpus= to set nr_cpu_ids early
2792a41: x86: according to nr_cpu_ids to decide if need to leave logical flat
c36a2f3: x86: make 32bit apic flat to physflat switch like 64bit 3f2e18b: x86: use num_processors for possible cpus

Thanks

Yinghai