cma缓冲区内存分配失败

时间:2019-02-18 09:03:18

标签: linux linux-kernel

我正在尝试为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(限制ffffffff)
cma:dma_contiguous_reserve:为全局区域保留60 MiB
cma:cma_declare_contiguous(大小为0x03c00000,基数为0x00000000,限制为0xffffffff对齐方式0x00000000)
cma:在0x3c400000保留60 MiB
在节点0总页数上:262144
free_area_init_node:节点0,pgdat c183af40,node_mem_map ef7f7000
  普通区域:用于memmap的1536页
  普通区域:保留0页
  普通区域:196608页,后进先出批次:31
  HighMem区域:65536页,LIFO批次: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-0xffff1000(4 kB)
    fixmap:0xffc00000-0xfff00000(3072 kB)
    vmalloc:0xf0800000-0xff800000(240 MB)
    lowmem:0xc0000000-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
排放物映射到f0802000
slcr映射到f0804000
L2C:平台修改辅助控制寄存器:0x72360000-> 0x72760000
L2C:DT /平台修改辅助控制寄存器:0x72360000-> 0x72760000
L2C-310勘误表769419已启用
L2C-310支持Cortex-A9的早期BRESP
为Cortex-A9启用的L2C-310全零行
L2C-310 ID预取已启用,偏移1行
L2C-310动态时钟门控已启用,待机模式已启用
启用L2C-310高速缓存控制器,8路,512 kB
L2C-310:CACHE_ID 0x410000c8,AUX_CTRL 0x76760001
zynq_clock_init:clkc从f0804100开始
Zynq时钟初始化
sched_clock:249MHz时为64位,分辨率为4ns,每隔4398046511102ns包装一次
时钟源:arm_global_timer:掩码:0xffffffffffffffff max_cycles:0x7350b89c29,max_idle_ns:881590431910 ns
切换到基于计时器的延迟循环,分辨率为4ns
clocksource:ttc_clocksource:mask:0xffff max_cycles:0xffff,max_idle_ns:716713566 ns
f080c000上的计时器#0,irq = 17
控制台:彩色虚拟设备80x30
校准延迟回路(跳过),使用计时器频率计算得出的值。.499.99 BogoMIPS(lpj = 2499999)
pid_max:默认值:32768最小值:301
装入高速缓存哈希表条目:2048(顺序:1、8192字节) Mountpoint缓存哈希表条目:2048(顺序:1、8192字节)
CPU:测试写缓冲区一致性:确定
CPU0:线程-1,cpu 0,套接字0,mpidr 80000000
设置0x100000-0x100060的静态身份映射
分层SRCU实现。
smp:启动辅助CPU ...
CPU1:线程-1,cpu 1,套接字0,mpidr 80000001
smp:启用1个节点,2个CPU
SMP:总共激活了2个处理器(999.99 BogoMIPS)。
CPU:所有CPU在SVC模式下启动。
devtmpfs:已初始化
随机:从bucket_table_alloc + 0x1c4 / 0x204中调用的get_random_u32具有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(顺序:3,32768字节)
pinctrl核心:已初始化的pinctrl子系统
随机:快速初始化完成
NET:已注册的协议系列16
cma:cma_alloc(cma c184d3e0,计数8192,对齐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:MMIO 0xe0001000(ir​​q = 28,base_baud = 6249999)上的ttyPS0是xuartps
控制台[ttyPS0]已启用
bootconsole [earlycon0]已禁用
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区域fpga完整:探查的FPGA区域
已初始化高级Linux声音体系结构驱动程序。
clocksource:切换到clocksource 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没有中断亲和力属性。
硬件性能:通过armv7_cortex_a9 PMU驱动程序启用,有7个计数器可用
工作集:timestamp_bits = 30 max_order = 18 bucket_order = 0
jffs2:2.2版。 (NAND)(摘要)©2001-2006 Red Hat,Inc.
跳出:池大小:64页
io Scheduler Noop已注册
io调度程序截止日期已注册
io调度程序cfq已注册(默认)
io调度程序mq截止日期已注册
io Scheduler kyber已注册
cma:cma_alloc(cma c184d3e0,计数1,对齐0)
cma:cma_alloc():返回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 KB)
在MTD设备spi0.0上找到4个partpart分区
在“ spi0.0”上创建4个MTD分区:
0x000000000000-0x000000500000:“启动”
0x000000500000-0x000000520000:“ bootenv”
0x000000520000-0x000000fa0000:“内核”
0x000000fa0000-0x000001000000:“备用”
libphy:固定的MDIO总线:已探查
CAN设备驱动程序接口
libphy:MACB_mii_bus:已探查

cma:cma_alloc(cma c184d3e0,计数1,对齐0)
cma:cma_alloc():返回effbf020
mmc0:使用ADMA在e0100000.sdhci [e0100000.sdhci]上的SDHCI控制器
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,计数1,对齐0)
cma:cma_alloc():返回effbf040
cma:cma_alloc(cma c184d3e0,计数1,对齐0)
cma:cma_alloc():返回effbf060
IPv6:ADDRCONF(NETDEV_UP):eth0:链接未准备好
macb e000b000.ethernet eth0:链接(1000个/完整)
IPv6:ADDRCONF(NETDEV_CHANGE):eth0:链接已准备就绪
luscher2:不同意符号module_layout的版本
随机:crng初始化完成
luscher2:不同意符号module_layout的版本
luscher2:不同意符号module_layout的版本
luscher3:加载树外模块taints内核。
luscher 40400000.dma:设备树探测
luscher 40400000.dma:位于0x40400000的luscher映射到0xf2990000,irq = 49
 增益大小0x00000000
 增益号0x00000000
cma:cma_alloc(cma c184d3e0,计数0,对齐8)
luscher 40400000.dma:缓冲区内存分配失败
缓冲存储器分配失败
luscher:40400000.dma探针失败,错误为-12

2 个答案:

答案 0 :(得分:0)

函数cma_alloc参数count等于0,它直接返回失败,请检查下面的count参数:

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

答案 1 :(得分:0)

在我的情况下,这是在设备树的“兼容”字段中设置的名称与模块名称(它们必须匹配)之间的区别。 我还通过添加了coherent_pool:

chosen {
        bootargs = "console=ttyPS0,115200 earlyprintk coherent_pool=32MiB";
           };