在drivers/scsi/sd.c中的函数sd_revalidate_disk就分配一个只有512字节
的缓冲就失败。
buffer = kmalloc(512, GFP_KERNEL | __GFP_DMA);
if (!buffer) {
printk(KERN_WARNING "(sd_revalidate_disk:) Memory allocation "
"failure.\n");
goto out;
}
原因:
在arch/trimedia/mm/init.c中,目前设置ZONE_DMA的size是为0
zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT;
现修改成:
zones_size[ZONE_DMA] = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
zones_size[ZONE_NORMAL] = 0 >> PAGE_SHIFT;
对于有的平台,并不是整个内存段都可以进行DMA传输,X86是��
�存的前16M(0~16M),而对于PNX
平台来说,ZONE_DMA是不限制在哪个内存段。
所以把内存都设为ZONE_DMA,有两个原因:
1、PNX无所谓ZONE_DMA和ZONE_NORMAL
2、kmalloc的分配如果没有带__GFP_DMA,即只是指定从分配ZONE_NORM
AL分配的,但如果
ZONE_NORMAL为0,它是会从ZONE_DMA上分配的。
这样做有个好处,我们不用去考虑这两个段到底各要分多少��
�如果ZONE_DMA分少了,以后还是会
出现这个问题,还不如全部给它算了。
不知是否有考虑不周?
Original issue reported on code.google.com by
wenyong...@gmail.comon 10 Jul 2009 at 1:54