宋立新email
現象:最近好幾個模組的同事都反應驅動中呼叫:
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 你能確定的假設可能違反了?答案是,運營商新的 實際上是呼叫乙個函式分配做 如果使用者記憶體失敗。如果發...