Linux kernel 无法保留512MB或更多的CMA
我正试图在内存为64GB的ARM64机器上保留512MB的CMA内存,在linux引导期间,我将收到“CMA:未能保留512MB”错误消息。预留384MB就可以了。如果您需要更多信息,请告诉我。我非常感谢你的帮助Linux kernel 无法保留512MB或更多的CMA,linux-kernel,arm64,Linux Kernel,Arm64,我正试图在内存为64GB的ARM64机器上保留512MB的CMA内存,在linux引导期间,我将收到“CMA:未能保留512MB”错误消息。预留384MB就可以了。如果您需要更多信息,请告诉我。我非常感谢你的帮助 [ESL_Start_OS]:[644L] Start to jump Linux kernel Booting Linux on physical CPU 0x10000 Initializing cgroup subsys cpuset Initializi
[ESL_Start_OS]:[644L] Start to jump Linux kernel
Booting Linux on physical CPU 0x10000
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Initializing cgroup subsys cpuacct
Linux version 4.1.0+ (s00327669@salem-linux) (gcc version 4.9.3 20141031 (prerelease) (Linaro GCC 2014.11) ) #4 SMP Mon Oct 5 12:00:57 EDT 2015
CPU: AArch64 Processor [411fd071] revision 1
Detected PIPT I-cache on CPU0
alternatives: enabling workaround for ARM erratum 832075
earlycon: Early serial console at MMIO32 0x60300000 (options '')
bootconsole [uart0] enabled
efi: Getting EFI parameters from FDT:
efi: UEFI not found.
cma: Failed to reserve 512 MiB
PERCPU: Embedded 16 pages/cpu @ffffffd7bfa00000 s27648 r8192 d29696 u65536
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16514064
Kernel command line: rdinit=/init console=ttyS0,115200 earlycon=uart8250,mmio32,0x60300000 cma=512M
log_buf_len individual max cpu contribution: 4096 bytes
log_buf_len total cpu_extra contributions: 126976 bytes
log_buf_len min size: 16384 bytes
log_buf_len: 262144 bytes
early log buf free: 14220(86%)
PID hash table entries: 4096 (order: 3, 32768 bytes)
Dentry cache hash table entries: 8388608 (order: 14, 67108864 bytes)
Inode-cache hash table entries: 4194304 (order: 13, 33554432 bytes)
software IO TLB [mem 0x3bbff000-0x3fbff000] (64MB) mapped at [ffffffc03bbff000-ffffffc03fbfefff]
Memory: 65469716K/67104768K available (6109K kernel code, 537K rwdata, 2516K rodata, 436K init, 226K bss, 1635052K reserved, 0K cma-reserved)
Virtual kernel memory layout:
vmalloc : 0xffffff8000000000 - 0xffffffbdbfff0000 ( 246 GB)
vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000 ( 8 GB maximum)
0xffffffbdc0000000 - 0xffffffbe20000000 ( 1536 MB actual)
fixed : 0xffffffbffabfd000 - 0xffffffbffac00000 ( 12 KB)
PCI I/O : 0xffffffbffae00000 - 0xffffffbffbe00000 ( 16 MB)
modules : 0xffffffbffc000000 - 0xffffffc000000000 ( 64 MB)
memory : 0xffffffc000000000 - 0xffffffd800000000 ( 98304 MB)
.init : 0xffffffc0008ef000 - 0xffffffc00095c000 ( 436 KB)
.text : 0xffffffc000080000 - 0xffffffc0008ee7c4 ( 8634 KB)
.data : 0xffffffc000965000 - 0xffffffc0009eb400 ( 537 KB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=32, Nodes=1
Hierarchical RCU implementation.
Additional per-CPU info printed with stalls.
NR_IRQS:64 nr_irqs:64 0
ITS: /interrupt-controller@6d000000/interrupt-controller@6c000000
ITS: allocated 65536 Devices @17b9480000 (psz 4K, shr 2)
ITS: allocated 512 Virtual CPUs @17b9418000 (psz 4K, shr 2)
ITS: allocated 512 Interrupt Collections @17b9419000 (psz 4K, shr 2)
ITS: /interrupt-controller@6d000000/interrupt-controller@4c000000
ITS: allocated 65536 Devices @17b9500000 (psz 4K, shr 2)
ITS: allocated 512 Virtual CPUs @17b9432000 (psz 4K, shr 2)
ITS: allocated 512 Interrupt Collections @17b9433000 (psz 4K, shr 2)
ITS: /interrupt-controller@6d000000/interrupt-controller@c6000000
ITS: allocated 65536 Devices @17b9580000 (psz 4K, shr 2)
ITS: allocated 512 Virtual CPUs @17b943d000 (psz 4K, shr 2)
ITS: allocated 512 Interrupt Collections @17b943e000 (psz 4K, shr 2)
ITS: /interrupt-controller@6d000000/interrupt-controller@a3000000
ITS: allocated 65536 Devices @17b9600000 (psz 4K, shr 2)
ITS: allocated 512 Virtual CPUs @17b9467000 (psz 4K, shr 2)
ITS: allocated 512 Interrupt Collections @17b9468000 (psz 4K, shr 2)
ITS: /interrupt-controller@6d000000/interrupt-controller@b7000000
ITS: allocated 65536 Devices @17b9700000 (psz 4K, shr 2)
ITS: allocated 512 Virtual CPUs @17b9681000 (psz 4K, shr 2)
ITS: allocated 512 Interrupt Collections @17b9682000 (psz 4K, shr 2)
GIC: using LPI property table @0x00000017b96a0000
ITS: Allocated 1792 chunks for LPIs
CPU0: found redistributor 10000 region 1:0x000000004d100000
CPU0: using LPI pending table @0x00000017b96b0000
MBIGEN: /peripherals/interrupt-controller@4c030000
MBIGEN: /peripherals/interrupt-controller@6c030000
MBIGEN: /peripherals/interrupt-controller@c6030000
MBIGEN: /peripherals/interrupt-controller@a3030000
MBIGEN: /peripherals/interrupt-controller@b7030000
Architected cp15 timer(s) running at 50.00MHz (phys).
clocksource arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0xb8812736b, max_idle_ns: 440795202655 ns
sched_clock: 56 bits at 50MHz, resolution 20ns, wraps every 4398046511100ns
Console: colour dummy device 80x25
Calibrating delay loop (skipped), value calculated using timer frequency.. 100.00 BogoMIPS (lpj=200000)
pid_max: default: 32768 minimum: 301
Security Framework initialized
Mount-cache hash table entries: 131072 (order: 8, 1048576 bytes)
Mountpoint-cache hash table entries: 131072 (order: 8, 1048576 bytes)
Initializing cgroup subsys memory
Initializing cgroup subsys devices
Initializing cgroup subsys freezer
Initializing cgroup subsys hugetlb
hw perfevents: enabled with arm/armv8-pmuv3 PMU driver, 7 counters available
EFI services will not be available.
CPU1: Booted secondary processor
Detected PIPT I-cache on CPU1
CPU1: found redistributor 10001 region 1:0x000000004d130000
CPU1: using LPI pending table @0x00000017b8ee0000
CPU2: Booted secondary processor
Detected PIPT I-cache on CPU2
CPU2: found redistributor 10002 region 1:0x000000004d160000
CPU2: using LPI pending table @0x00000017b8f10000
CPU3: Booted secondary processor
Detected PIPT I-cache on CPU3
CPU3: found redistributor 10003 region 1:0x000000004d190000
CPU3: using LPI pending table @0x00000017b8f40000
CPU4: Booted secondary processor
Detected PIPT I-cache on CPU4
CPU4: found redistributor 10100 region 1:0x000000004d1c0000
CPU4: using LPI pending table @0x00000017b8f80000
CPU5: Booted secondary processor
Detected PIPT I-cache on CPU5
CPU5: found redistributor 10101 region 1:0x000000004d1f0000
CPU5: using LPI pending table @0x00000017b8fa0000
CPU6: Booted secondary processor
Detected PIPT I-cache on CPU6
CPU6: found redistributor 10102 region 1:0x000000004d220000
CPU6: using LPI pending table @0x00000017b8fd0000
CPU7: Booted secondary processor
Detected PIPT I-cache on CPU7
CPU7: found redistributor 10103 region 1:0x000000004d250000
CPU7: using LPI pending table @0x00000017b8800000
CPU8: Booted secondary processor
Detected PIPT I-cache on CPU8
CPU8: found redistributor 10200 region 1:0x000000004d280000
CPU8: using LPI pending table @0x00000017b8840000
CPU9: Booted secondary processor
Detected PIPT I-cache on CPU9
CPU9: found redistributor 10201 region 1:0x000000004d2b0000
CPU9: using LPI pending table @0x00000017b8870000
CPU10: Booted secondary processor
Detected PIPT I-cache on CPU10
CPU10: found redistributor 10202 region 1:0x000000004d2e0000
CPU10: using LPI pending table @0x00000017b88b0000
CPU11: Booted secondary processor
Detected PIPT I-cache on CPU11
CPU11: found redistributor 10203 region 1:0x000000004d310000
CPU11: using LPI pending table @0x00000017b88e0000
CPU12: Booted secondary processor
Detected PIPT I-cache on CPU12
CPU12: found redistributor 10300 region 1:0x000000004d340000
CPU12: using LPI pending table @0x00000017b8910000
CPU13: Booted secondary processor
Detected PIPT I-cache on CPU13
CPU13: found redistributor 10301 region 1:0x000000004d370000
CPU13: using LPI pending table @0x00000017b8940000
CPU14: Booted secondary processor
Detected PIPT I-cache on CPU14
CPU14: found redistributor 10302 region 1:0x000000004d3a0000
CPU14: using LPI pending table @0x00000017b8970000
CPU15: Booted secondary processor
Detected PIPT I-cache on CPU15
CPU15: found redistributor 10303 region 1:0x000000004d3d0000
CPU15: using LPI pending table @0x00000017b89a0000
CPU16: Booted secondary processor
Detected PIPT I-cache on CPU16
CPU16: found redistributor 20000 region 0:0x000000006d100000
CPU16: using LPI pending table @0x00000017b89e0000
CPU17: Booted secondary processor
Detected PIPT I-cache on CPU17
CPU17: found redistributor 20001 region 0:0x000000006d130000
CPU17: using LPI pending table @0x00000017b8a10000
CPU18: Booted secondary processor
Detected PIPT I-cache on CPU18
CPU18: found redistributor 20002 region 0:0x000000006d160000
CPU18: using LPI pending table @0x00000017b8a40000
CPU19: Booted secondary processor
Detected PIPT I-cache on CPU19
CPU19: found redistributor 20003 region 0:0x000000006d190000
CPU19: using LPI pending table @0x00000017b8a80000
CPU20: Booted secondary processor
Detected PIPT I-cache on CPU20
CPU20: found redistributor 20100 region 0:0x000000006d1c0000
CPU20: using LPI pending table @0x00000017b8aa0000
CPU21: Booted secondary processor
Detected PIPT I-cache on CPU21
CPU21: found redistributor 20101 region 0:0x000000006d1f0000
CPU21: using LPI pending table @0x00000017b8ad0000
CPU22: Booted secondary processor
Detected PIPT I-cache on CPU22
CPU22: found redistributor 20102 region 0:0x000000006d220000
CPU22: using LPI pending table @0x00000017b8b10000
CPU23: Booted secondary processor
Detected PIPT I-cache on CPU23
CPU23: found redistributor 20103 region 0:0x000000006d250000
CPU23: using LPI pending table @0x00000017b8b40000
CPU24: Booted secondary processor
Detected PIPT I-cache on CPU24
CPU24: found redistributor 20200 region 0:0x000000006d280000
CPU24: using LPI pending table @0x00000017b8b70000
CPU25: Booted secondary processor
Detected PIPT I-cache on CPU25
CPU25: found redistributor 20201 region 0:0x000000006d2b0000
CPU25: using LPI pending table @0x00000017b8bb0000
CPU26: Booted secondary processor
Detected PIPT I-cache on CPU26
CPU26: found redistributor 20202 region 0:0x000000006d2e0000
CPU26: using LPI pending table @0x00000017b8be0000
CPU27: Booted secondary processor
Detected PIPT I-cache on CPU27
CPU27: found redistributor 20203 region 0:0x000000006d310000
CPU27: using LPI pending table @0x00000017b8400000
CPU28: Booted secondary processor
Detected PIPT I-cache on CPU28
CPU28: found redistributor 20300 region 0:0x000000006d340000
CPU28: using LPI pending table @0x00000017b8450000
CPU29: Booted secondary processor
Detected PIPT I-cache on CPU29
CPU29: found redistributor 20301 region 0:0x000000006d370000
CPU29: using LPI pending table @0x00000017b8470000
CPU30: Booted secondary processor
Detected PIPT I-cache on CPU30
CPU30: found redistributor 20302 region 0:0x000000006d3a0000
CPU30: using LPI pending table @0x00000017b84b0000
CPU31: Booted secondary processor
Detected PIPT I-cache on CPU31
CPU31: found redistributor 20303 region 0:0x000000006d3d0000
CPU31: using LPI pending table @0x00000017b84e0000
Brought up 32 CPUs
SMP: Total of 32 processors activated.
CPU: All CPU(s) started at EL2
alternatives: patching kernel code
devtmpfs: initialized
DMI not present or invalid.
clocksource jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
atomic64_test: passed
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
cpuidle: using governor ladder
cpuidle: using governor menu
vdso: 2 pages (1 code @ ffffffc00096d000, 1 data @ ffffffc00096c000)
hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
DMA: preallocated 256 KiB pool for atomic allocations
Serial: AMBA PL011 UART driver
hisi-smmu 40040000.smmu_pa: registered 0 master devices
hisi-smmu 40040000.smmu_pa: probing hardware configuration...
hisi-smmu 40040000.smmu_pa: nested translation
hisi-smmu 40040000.smmu_pa: coherent table walk
hisi-smmu 40040000.smmu_pa: 39-bit VA, 39-bit IPA, 48-bit PA
hisi-smmu 60040000.smmu_pc: registered 0 master devices
hisi-smmu 60040000.smmu_pc: probing hardware configuration...
hisi-smmu 60040000.smmu_pc: nested translation
hisi-smmu 60040000.smmu_pc: coherent table walk
hisi-smmu 60040000.smmu_pc: 39-bit VA, 39-bit IPA, 48-bit PA
hisi-smmu c0040000.smmu_dsa: registered 0 master devices
hisi-smmu c0040000.smmu_dsa: probing hardware configuration...
hisi-smmu c0040000.smmu_dsa: nested translation
hisi-smmu c0040000.smmu_dsa: coherent table walk
hisi-smmu c0040000.smmu_dsa: 39-bit VA, 39-bit IPA, 48-bit PA
Warning: Mbigen device id already exist.Old:0x2,new:0x20
hisi-smmu a0040000.smmu_m3: registered 0 master devices
hisi-smmu a0040000.smmu_m3: probing hardware configuration...
hisi-smmu a0040000.smmu_m3: nested translation
hisi-smmu a0040000.smmu_m3: coherent table walk
hisi-smmu a0040000.smmu_m3: 39-bit VA, 39-bit IPA, 48-bit PA
hisi-smmu b0040000.smmu_pcie: registered 0 master devices
hisi-smmu b0040000.smmu_pcie: probing hardware configuration...
hisi-smmu b0040000.smmu_pcie: nested translation
hisi-smmu b0040000.smmu_pcie: coherent table walk
hisi-smmu b0040000.smmu_pcie: 39-bit VA, 39-bit IPA, 48-bit PA
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Warning: Mbigen device id already exist.Old:0x1,new:0x10
Warning: Mbigen device id already exist.Old:0x3,new:0x30
Warning: Mbigen device id already exist.Old:0x3,new:0x30
Switched to clocksource arch_sys_counter
NET: Registered protocol family 2
TCP established hash table entries: 524288 (order: 10, 4194304 bytes)
TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
TCP: Hash tables configured (established 524288 bind 65536)
UDP hash table entries: 32768 (order: 8, 1048576 bytes)
UDP-Lite hash table entries: 32768 (order: 8, 1048576 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Unpacking initramfs...
Freeing initrd memory: 409600K (ffffffc007000000 - ffffffc020000000)
futex hash table entries: 8192 (order: 7, 524288 bytes)
audit: initializing netlink subsys (disabled)
audit: type=2000 audit(5.048:1): initialized
HugeTLB registered 2 MB page size, pre-allocated 0 pages
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
fuse init (API version 7.23)
9p: Installing v9fs 9p2000 file system support
bounce: pool size: 64 pages
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
io scheduler noop registered
io scheduler cfq registered (default)
hisi-pcie b0080000.pcie: Link up
PCI host bridge /pcie@0xb0080000 ranges:
MEM 0xb4100000..0xb4ffffff -> 0xb4100000
hisi-pcie b0080000.pcie: PCI host bridge to bus 0000:10
pci_bus 0000:10: root bus resource [bus 10-1f]
pci_bus 0000:10: root bus resource [mem 0xb4100000-0xb4ffffff]
pci 0000:10:00.0: IOMMU is currently not supported for PCI
pci 0000:10:00.0: of_irq_parse_pci() failed with rc=-22
pci 0000:10:00.0: Primary bus is hard wired to 0
pci 0000:10:00.0: bridge configuration invalid ([bus 01-01]), reconfiguring
pci 0000:11:00.0: IOMMU is currently not supported for PCI
pci 0000:11:00.0: of_irq_parse_pci() failed with rc=-22
pci 0000:10:00.0: BAR 0: no space for [mem size 0x10000000]
pci 0000:10:00.0: BAR 0: failed to assign [mem size 0x10000000]
pci 0000:10:00.0: BAR 8: assigned [mem 0xb4200000-0xb43fffff]
pci 0000:11:00.0: BAR 0: assigned [mem 0xb4200000-0xb43fffff]
pci 0000:10:00.0: PCI bridge to [bus 11]
pci 0000:10:00.0: bridge window [mem 0xb4200000-0xb43fffff]
Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
console [ttyS0] disabled
60300000.uart: ttyS0 at MMIO 0x60300000 (irq = 12, base_baud = 12500000) is a 16550A
console [ttyS0] enabled
console [ttyS0] enabled
bootconsole [uart0] disabled
bootconsole [uart0] disabled
msm_serial: driver initialized
Unable to detect cache hierarcy from DT for CPU 0
loop: module loaded
at24 1-0052: 16384 byte 24c128 EEPROM, writable, 64 bytes/write
Loading iSCSI transport class v2.0-870.
rdac: device handler registered
hp_sw: device handler registered
emc: device handler registered
alua: device handler registered
在启用CONFIG_ZONE_DMA的情况下,与arm64上的默认情况一样,CMA仅限于具有32位寻址功能的设备可以访问的物理内存。因此,如果4GB边界下没有足够的可用RAM来查找连续的512MB块(),那么无论在更高的地址上存在多少RAM,它都将失败。这将取决于机器的精确物理内存映射、内核加载的位置、引导加载程序所做的保留,等等
作为比较,我可以很高兴地用
cma=1024M
启动我的一个开发板——那一个,内核在底部加载,在顶部只保留了一个小的固件,显然在两者之间找到了足够大的空间。同一个禁用ZONE_DMA的内核很高兴地分配了4GB的CMA(只能从上6GB块中分配),但我没有仔细观察所有外围设备的损坏情况,因为它们可能会被分配到无法访问的DMA地址。谢谢。但很明显,在ARM64上,CONFIG_ZONE_DMA被固定为y,并且它不是用户可设置的。我错过了什么吗?不是真的;这就是为什么你会看到你所看到的东西的一个解释——你对它所做的一切都被“视情况而定”所包裹。如果你的所有外设都能处理4GB以上的地址(或者你不在乎破坏不能处理的地址),你可以关闭ZONE_DMA(手动编辑Kconfig);您可以查看引导加载程序,看看是否有任何内存布局调整可以在那里进行;或者,正如你在问题中提到的那样,你可以一开始就不尝试分配这么大的CMA区域(特别是考虑到该区域充满了IOMMUs…)