首页 > 解决方案 > cma 缓冲内存分配失败

问题描述

我正在尝试为 DMA Linux 编写驱动程序,但我的驱动程序一直无法执行 dma_coherent_alloc,我已经增加了 CMA 内存,并且 coherent_pool ...

我错过了什么?

dmesg 在物理 CPU 0x0 上启动 Linux
Linux 版本 4.14.0-xilinx-v2018.2 (oe-user@oe-host) (gcc 版本 7.2.0 (GCC)) #5 SMP PREEMPT Sun Feb 17 23:20:49 PST 2019
CPU:ARMv7 处理器 [413fc090] 修订版 0 (ARMv7),cr=18c5387d
CPU:PIPT / VIPT 非混叠数据缓存,VIPT 混叠指令缓存
OF:fdt:机器型号:xlnx,zynq-7000
bootconsole [earlycon0] 已启用
内存策略:数据缓存 writealloc
OF:fdt:保留内存:不支持的节点格式,忽略
cma:dma_contiguous_reserve(limit ffffffff)
cma:dma_contiguous_reserve:为全局区域保留 60 MiB
cma:cma_declare_contiguous(大小 0x03c00000,基数 0x00000000,限制 0xffffffff 对齐 0x00000)
cma:在 0x3c400000 处保留 60 MiB 在
节点 0 上总页数:262144
free_area_init_node:节点 0,pgdat c183af40,node_mem_map ef7f7000
正常区域:1536 页用于 memmap
正常区域:0 页保留
正常区域:196608 页,LIFO 批处理:31
HighMem 区域: 65536 页,后进先出批处理:15
percpu:嵌入式 16 页/cpu @ef7ce000 s34764 r8192 d22580 u65536
pcpu-alloc:s34764 r8192 d22580 u65536 alloc=16*4096
pcpu-alloc:[0] 0 [0] 1
内置 1 个区域列表分组。总页数:260608
内核命令行:console=ttyPS0,115200 earlyprintk coherent_pool=32MiB
PID 哈希表条目:4096(顺序:2,16384 字节)
Dentry 缓存哈希表条目:131072(顺序:7、524288 字节)
Inode 缓存哈希表条目:65536(顺序:6、262144 字节)
内存:953428K/1048576K 可用(6144K 内核代码,238K rwdata,1568K rodata,15360K init ,218K BSS,33708K保留,61440K CMA-保留,200704K HighMem)
虚拟内核内存布局:
矢量:0xffff0000-0xfffff1000(4 kb) fixmap
:0xffc00000-0xffc00000-0xfffc00000-0xfffffffffff00000(3072 kb)
vmalloc:000000 000 000 000 000-00000 000 x.00000 000 x.00000 000 xffffffcym Mimb:0000000 000 x.00000 000 xfffff1500000 xfffff。
- 0xf0000000 (768 MB)
pkmap:0xbfe00000 - 0xc0000000 (2 MB)
模块:0xbf000000 - 0xbfe00000 (14 MB)
.text:0xc0008000 - 0xc0700000 (7136 kB)
.init : 0xc0900000 - 0xc1800000 (15360 kB)
.data : 0xc1800000 - 0xc183bb40 ( 239 kB)
.bss : 0xc183bb40 - 0xc1872344 ( 219 kB)
抢占式分层 RCU 实现。
RCU 将 CPU 从 NR_CPUS=4 限制到 nr_cpu_ids=2。
任务 RCU 已启用。
RCU:调整 rcu_fanout_leaf=16、nr_cpu_ids=2 的几何结构
NR_IRQS:16、nr_irqs:16、预分配 irqs:16
efuse 映射到 f0802000
slcr 映射到 f0804000
L2C:平台修改辅助控制寄存器:0x72360000 -> 0x72760000
L2C:辅助控制寄存器:0x72360000 -> 0x72760000
L2C-310 勘误表 769419 启用
L2C-310 为 Cortex-A9 启用早期 BRESP
L2C-310 为 Cortex-A9 启用全零线
L2C-310 ID 预取已启用,偏移 1 行
L2C-310 动态时钟门控已启用,待机模式已启用
L2C-310 缓存控制器已启用,8 路,512 kB
L2C-310:CACHE_ID 0x410000c8, AUX_CTRL 0x76760001
zynq_clock_init: clkc starts at f0804100
Zynq clock init
sched_clock: 64 bits at 249MHz, resolution 4ns, wraps every 4398046511102ns
clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x7350b89c29, max_idle_ns: 881590431910 ns
Switching to timer-based delay loop, resolution 4ns
时钟源:ttc_clocksource:掩码:0xffff max_cycles:0xffff,max_idle_ns:716713566 ns
timer #0 at f080c000,irq=17
控制台:彩色虚拟设备 80x30
校准延迟循环(已跳过),使用计时器频率计算的值.. 499.99 BogoMIPS (lpj=2499999)
pid_max:默认值:32768 最小值:301
装载缓存哈希表条目:2048(顺序:1,8192 字节) Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x100000 - 0x100060
Hierarchical SRCU执行。
smp:启动辅助 CPU ...
CPU1:线程 -1,cpu 1,socket 0,mpidr 80000001
smp:启动 1 个节点,2 个 CPU
SMP:总共激活了 2 个处理器 (999.99 BogoMIPS)。
CPU:所有 CPU 都以 SVC 模式启动。
devtmpfs:初始化
随机:get_random_u32 从 bucket_table_alloc+0x1c4/0x204 调用,crng_init=0
VFP 支持 v0.3:实现者 41 架构 3 第 30 部分变体 9 修订版 4
DMA-API:预分配 4096 个调试条目
DMA-API:由内核配置启用调试
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex 哈希表条目: 512 (order: 3, 32768 bytes)
pinctrl core: 初始化 pinctrl 子系统
random: fast init done
NET: Registered protocol family 16
cma: cma_alloc( cma c184d3e0, count 8192, align 8)
cma: cma_alloc(): 返回 eff7f000
DMA: 为原子连贯分配预分配 32768 KiB 池
cpuidle:使用调控器菜单
硬件断点:找到 5 个(+1 保留)断点和 1 个观察点寄存器。
hw-breakpoint:最大观察点大小为 4 个字节。
zynq-ocm f800c000.ocmc: ZYNQ OCM 池: 256 KiB @ 0xf2840000
zynq-pinctrl 700.pinctrl: zynq pinctrl 已初始化
e0001000.serial: ttyPS0 at MMIO 0xe0001000 (irq = 28, base_baud = 6249 a9
控制台启用)
bootconsole [earlycon0] disabled
vgaarb:加载的
SCSI 子系统已初始化
usbcore:注册新接口驱动程序 usbfs
usbcore:注册新接口驱动程序集线器
usbcore:注册新设备驱动程序 usb
媒体:Linux 媒体接口:v0.10
Linux 视频捕获接口: v2.00
pps_core:LinuxPPS API 版本。1 注册
pps_core:软件版本。5.3.6 - 版权所有 2005-2007 Rodolfo Giometti
PTP 时钟支持已注册
EDAC MC:版本:3.0.0
FPGA 管理器框架
fpga-region fpga-full:FPGA 区域探测
高级 Linux 声音架构驱动程序已初始化。
时钟源:切换到时钟源 arm_global_timer
NET:已注册协议系列 2
TCP 已建立哈希表条目:8192(顺序:3,32768 字节)
TCP 绑定哈希表条目:8192(顺序:4,65536 字节)
TCP:已配置哈希表(已建立 8192绑定 8192)
UDP 哈希表条目:512(顺序:2,16384 字节)
UDP-Lite 哈希表条目:512(顺序:2,16384 字节)
NET:注册的协议族 1
RPC:注册的命名 UNIX 套接字传输模块。
RPC:注册的 udp 传输模块。
RPC:注册的 tcp 传输模块。
RPC:注册的 tcp NFSv4.1 反向通道传输模块。
PCI:CLS 0 字节,默认 64
硬件性能事件:/pmu@f8891000 没有中断关联属性,猜测。
hw perfevents:使用 armv7_cortex_a9 PMU 驱动程序启用,7 个计数器可用
工作集:timestamp_bits=30 max_order=18 bucket_order=0
jffs2:2.2 版。(NAND) (SUMMARY) © 2001-2006 Red Hat, Inc.
退回:池大小:64 页
io 调度程序 noop 已注册
io 调度程序截止日期已注册
io 调度程序 cfq 已注册(默认)
io 调度程序 mq-deadline 已注册
io 调度程序 kyber 已注册
cma: cma_alloc(cma c184d3e0, count 1, align 0)
cma: cma_alloc(): returned effbf000
dma-pl330 f8003000.dmac: 为 PL330 DMAC-241330
dma-pl330 f8003000 加载驱动程序。 dmac: DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
brd: 模块加载循环: 模块加载 m25p80 spi0.0: 找到 s25fl128s, 预期 n25q512a m25p80 spi0.0: s25fl128s (16384 Kbytes)
在 MTD 设备 spi0 上找到 4 个分区.0
Creating 4 MTD partitions on "spi0.0":
0x000000000000-0x000000500000 : "boot"
0x000000500000-0x000000520000 : "bootenv"
0x000000520000-0x000000fa0000 : "kernel"
0x000000fa0000-0x000001000000 : "空闲的”
libphy:固定 MDIO 总线:已探测
CAN 设备驱动程序接口
libphy:MACB_mii_bus:已探测

cma: cma_alloc(cma c184d3e0, count 1, align 0)
cma: cma_alloc(): returned effbf020
mmc0: SDHCI 控制器在 e0100000.sdhci [e0100000.sdhci] 上使用 ADMA
ledtrig-cpu: 注册以指示 CPU 上的活动
usbcore: 注册新接口驱动程序 usbhid
usbhid:USB HID 内核驱动程序
fpga_manager fpga0:Xilinx Zynq FPGA Manager 注册
NET:注册协议族 10

释放未使用的内核内存:15360K
udevd[758]:开始版本 3.2.2
udevd[759]:开始 eudev-3.2.2
cma:cma_alloc(cma c184d3e0, count 1, align 0)
cma: cma_alloc(): 返回 effbf040
cma: cma_alloc(cma c184d3e0, count 1, align 0)
cma: cma_alloc(): returned effbf060
IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
macb e000b000.ethernet eth0: link up (1000/Full)
IPv6: ADDRCONF(NETDEV_CHANGE ): eth0: 链接准备就绪
luscher2: 不同意符号 module_layout 的版本
random: crng init done
luscher2: 不同意符号 module_layout 的版本
luscher2: 不同意符号 module_layout 的版本
luscher3:加载树外模块污染内核。
luscher 40400000.dma: Device Tree Probing
luscher 40400000.dma: luscher at 0x40400000 mapped to 0xf2990000, irq=49
buff size 0x00000000
buff number 0x00000000
cma: cma_alloc(cma c184d3e0, count 0, align 8)
luscher 40400000.dma: Buffer memory allocation
缓冲区内存分配失败luscher
:40400000.dma 探测失败,错误 -12

标签: linuxlinux-kernel

解决方案


函数cma_alloc参数count等于0,直接返回失败,请查看下方count参数:

cma: cma_alloc(cma c184d3e0, count 0, align 8)

推荐阅读