Messages in this thread | | | Date | Wed, 10 Sep 2008 15:10:32 +0200 | From | Joerg Roedel <> | Subject | Re: [PATCH] x86: avoid unnecessary low zone allocation in AMD IOMMU's alloc_coherent |
| |
On Wed, Sep 10, 2008 at 10:03:32PM +0900, FUJITA Tomonori wrote:
Ok, I see.
> Hmm, I'm not sure what code you look at. Here's dma_alloc_coherent() > in tip/x86/iommu: > > dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, > gfp_t gfp) > { > struct dma_mapping_ops *ops = get_dma_ops(dev); > void *memory; > > gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32); > > Surely we here clear the flag but... > > if (dma_alloc_from_coherent(dev, size, dma_handle, &memory)) > return memory; > > if (!dev) { > dev = &x86_dma_fallback_dev; > gfp |= GFP_DMA; > } > > we play with it here though (not happens with pci devices), > > if (!dev->dma_mask) > return NULL; > > if (!ops->alloc_coherent) > return NULL; > > Then dma_alloc_coherent_gfp_flags() sets it again according to > device->coherent_dma_mask and gfp before ops->alloc_coherent hook: > > return ops->alloc_coherent(dev, size, dma_handle, > dma_alloc_coherent_gfp_flags(dev, gfp)); > > > This code can set up the exact same gfp flag for swiotbl and nommu as > before.
So its possible that alloc_coherent is called with region specifiers in the gfp flags. Can't we simply make the gfp hacks depend on dma_ops->is_phys and avoid further gfp hacks in the hardware iommu implementations?
Joerg
-- | AMD Saxony Limited Liability Company & Co. KG Operating | Wilschdorfer Landstr. 101, 01109 Dresden, Germany System | Register Court Dresden: HRA 4896 Research | General Partner authorized to represent: Center | AMD Saxony LLC (Wilmington, Delaware, US) | General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
| |