[PATCH][v2] powerpc/mm: using two zones for freescale 64 bit kernel

Xie Shaohui-B21989 B21989 at freescale.com
Thu Sep 20 20:14:50 EST 2012


> > On Thu, 2012-08-30 at 15:49 -0500, Kumar Gala wrote:
> > > On Aug 24, 2012, at 5:50 AM, Shaohui Xie wrote:
> > >
> > > > PowerPC platform only supports ZONE_DMA zone for 64bit kernel, so
> > > > all the memory will be put into this zone. If the memory size is
> > > > greater than the device's DMA capability and device uses
> > > > dma_alloc_coherent to allocate memory, it will get an address
> > > > which is over the device's DMA addressing, the device will fail.
> > > >
> > > > So we split the memory to two zones: zone ZONE_DMA32 &
> > > > ZONE_NORMAL, since we already allocate PCICSRBAR/PEXCSRBAR right
> > > > below the 4G boundary (if the lowest PCI address is above 4G), so
> > > > we constrain the DMA zone ZONE_DMA32 to 2GB, also, we clear flag
> > > > __GFP_DMA &
> > > > __GFP_DMA32 and set __GFP_DMA32 only if the device's dma_mask <
> > > > total memory size. By doing this, devices which cannot DMA all the
> > > > memory will be limited to ZONE_DMA32, but devices which can DMA
> > > > all
> > the memory will not be affected by this limitation.
> > > >
> > > > Signed-off-by: Shaohui Xie <Shaohui.Xie at freescale.com>
> > > > Signed-off-by: Mingkai Hu <Mingkai.hu at freescale.com>
> > > > Signed-off-by: Chen Yuanquan <B41889 at freescale.com>
> > > > ---
> > > > changes for v2:
> > > > 1. use a config option for using two zones (ZONE_DMA32 &
> > > > ZONE_NORMAL) in freescale 64 bit kernel.
> > > >
> >
> > There must have been a misunderstanding. I think this should be a
> > runtime choice, possibly by the platform code. Any reason that can't be
> done ?
> >
> [S.H] Do you mean this:
> 
> phys_addr_t platform_dma_size (maybe a default value should be used, then
> platform code will change it)
> 
> if (top_of_ram > platform_dma_size)
> 	max_zone_pfns[ZONE_DMA] = platform_dma_size >> PAGE_SHIFT; else
> 	max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT;
> 
> max_zone_pfns[ZONE_NORMAL] = top_of_ram >> PAGE_SHIFT;
> 
> > Also how does Intel do it ?
> [S.H] below are codes in Intel:
> 
> 403 void __init zone_sizes_init(void)
> 404 {
> 405         unsigned long max_zone_pfns[MAX_NR_ZONES];
> 406
> 407         memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
> 408
> 409 #ifdef CONFIG_ZONE_DMA
> 410         max_zone_pfns[ZONE_DMA]         = MAX_DMA_PFN;
> 411 #endif
> 412 #ifdef CONFIG_ZONE_DMA32
> 413         max_zone_pfns[ZONE_DMA32]       = MAX_DMA32_PFN;
> 414 #endif
> 415         max_zone_pfns[ZONE_NORMAL]      = max_low_pfn;
> 416 #ifdef CONFIG_HIGHMEM
> 417         max_zone_pfns[ZONE_HIGHMEM]     = max_pfn;
> 418 #endif
> 419
> 
> For x86_64, there is no CONFIG_HIGHMEM, so there will be three zones:
> ZONE_DMA/ZONE_DMA32/ZONE_NORMAL.
> 
[S.H] Hello, Ben,

I have some questions, though I'm still expecting your comments.
PPC does not have ZONE_DMA32 by default, if we want to use it, we need to add "config ZONE_DMA32" in Kconfig first.
If setting multiple zones without ZONE_DMA, kmalloc in "include/linux/slab_def.h" will fail if it uses flag GFP_DMA.
For the runtime choice in 64-bit kernel, what exactly multiple zones should be used?
"ZONE_DMA & ZONE_NORMAL" or "ZONE_DMA & ZONE_DMA32 & ZONE_NORMAL"?
Then what the size should be set for them respectively?

Please comment, Thanks!


Best Regards, 
Shaohui Xie


More information about the Linuxppc-dev mailing list