在线时间0 小时
UID316823
注册时间2011-9-6
NXP金币0
该用户从未签到
新手上路

- 积分
- 5
- 最后登录
- 1970-1-1
|
CPU:P1011
kernel:linux2.6.32
CONFIG_FORCE_MAX_ZONEORDER设置成14,
pci_alloc_consistent可以成功分配32M的DMA。并正常使用。
但是CONFIG_FORCE_MAX_ZONEORDER设置成15,
理论上可以分配64M空间
pci_alloc_consistent ->
dma_alloc_coherent ->
dma_ops->alloc_coherent (dma_direct_alloc_coherent)
代码如下:
void *dma_direct_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag)
{
void *ret;
#ifdef CONFIG_NOT_COHERENT_CACHE
ret = __dma_alloc_coherent(dev, size, dma_handle, flag);
if (ret == NULL)
return NULL;
*dma_handle += get_dma_offset(dev);
return ret;
#else
struct page *page;
int node = dev_to_node(dev);
/* ignore region specifiers */
flag &= ~(__GFP_HIGHMEM);
page = alloc_pages_node(node, flag, get_order(size));
if (page == NULL)
return NULL;
ret = page_address(page);
memset(ret, 0, size);
*dma_handle = virt_to_abs(ret) + get_dma_offset(dev);
return ret;
#endif
}
CONFIG_FORCE_MAX_ZONEORDER设置成15:
先分配32M,再分配16M,可以成功。
先分配32M,再分配32M,失败。
直接分配64M,失败。
ret = page_address(page);之后memset(ret, 0, size); /*这里死机*/
memset之后添加打印信息,没打印出来。
如果,注释掉memset,就可以成功打印,继续运行。
这说明alloc_pages_node或者page_address里面的内存是错误的?
|
|