乙個DMA 分配失敗問題研究

2021-05-11 12:37:04 字數 1974 閱讀 9177

宋立新email

[email protected]

現象:最近好幾個模組的同事都反應驅動中呼叫:

dma_alloc_writecombine

會失敗!

研究:首先重現該問題,

在nand

驅動的probe

函式:pxa3xx_nand_probe

中呼叫dma_alloc_writecombine:

測試**:

#if 1

} }

#endif

得到串列埠列印:

i:0, phy:0xa7300000, virt:0xff600000

i:1, phy:0xa7400000, virt:0xff700000

i:2, phy:0xa7500000, virt:0xff800000

i:3, phy:0xa7600000, virt:0xff900000

i:4, phy:0xa7700000, virt:0xffa00000

i:5, phy:0xa7800000, virt:0xffb00000

i:6, phy:0xa7900000, virt:0xffc00000

i:7, phy:0xa7a00000, virt:0xffd00000

i:8, phy:0xffffffff, virt:0x0

從輸出看來,應該是虛擬位址不夠用了,

導致出錯。

仔細分析一下目前系統的虛存占用情況:

目前虛擬位址空間的占用:

物理記憶體:

0xc0000000-0xcfffffff (256m)

io:0xf2000000 32m

0xf4000000 1m

0xf6000000 2m

0xf8000000 1m

0xfa000000 1m

0xfa500000 1m

0xfe000000 1m

0xff000000 1m

向量表及保留:

0xfffe0000-0xffffffff (

這個是核心使用的)

虛擬記憶體應該還有很大的空間可用。

再去分析

dma_alloc_writecombine

的**,

dma_alloc_writecombine ->__dma_alloc c=

vm_region_alloc

(&consistent_head

, size

,gfp & ~(

__gfp_dma

| __gfp_highmem

));

原來dma

從consistent_head

分配虛擬位址空間

. 再去看看

consistent_head

的定義:

static struct

vm_region

consistent_head

= ;#define

consistent_end

(0xffe00000)

#define

consistent_base

(consistent_end

- consistent_dma_size)

#define

consistent_dma_size

8 * 1024 * 1024

真相大白!

consistent_head

一共只有

8m 空間!

根據目前的虛擬位址空間分布,可以簡單修改

consistent_dma_size

為:8m->12m

可將虛擬位址空間增大一些

如果需要更大,則需要修改

consistent_end

, 目前可以修改到

0xf2000000,

然後將consistent_dma_size

改到32m.

乙個專案的失敗

曾經看過cmm的一些資料,當時只是覺著這些東西有些空,而且很複雜,很沒辦法在中國的軟體公司實行。可是,這麼多年過來,經歷了很多的專案,也領導過很多專案,發現對cmm有了新的認識。cmm的關鍵問題域是很多失敗和很多成功的例子所總結出來的,也許它很複雜,要求也很高,但是如果我們真的理解了這些關鍵問題域,...

乙個失敗專案的總結

2013年 2014年,筆者參與了乙個大型專案,雲平台下做資源 資產 電子運維管理,由德勤負責需求整合 hp負責系統門戶和硬體整合,pccw負責實施整合。ibm 中興 亞聯 億陽等十幾家廠家做開發分包。專案合同額好幾億。當時我在pccw負責資源的實施管理,與中興 亞聯 億陽一起完成所有省份的實施,一...

乙個函式分配做

問題 當乙個函式返回 返回值 可能表明 發生了乙個錯誤 123 declare an array of 10 integers int pandata new int 10 pandata 5 3 你能確定的假設可能違反了?答案是,運營商新的 實際上是呼叫乙個函式分配做 如果使用者記憶體失敗。如果發...