From 36274560dc219c8a6bfa93b4e55f13cbae3affc1 Mon Sep 17 00:00:00 2001 From: "Keshavamurthy, Anil S" Date: Sun, 21 Oct 2007 16:41:52 -0700 Subject: [PATCH] --- yaml --- r: 71971 b: refs/heads/master c: eb3fa7cb51a2a35cd95eb92e65d8039c779468a5 h: refs/heads/master i: 71969: 9b683d11ba8f574661344cb2b655e695bd384188 71967: 8266552af96d29de043b3fcddd5ce80f1be719e2 v: v3 --- [refs] | 2 +- trunk/drivers/pci/intel-iommu.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 6aeac82e6194..18cc95b308c6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ba39592764ed20cee09aae5352e603a27bf56b0d +refs/heads/master: eb3fa7cb51a2a35cd95eb92e65d8039c779468a5 diff --git a/trunk/drivers/pci/intel-iommu.c b/trunk/drivers/pci/intel-iommu.c index 93ed771b3254..05630b44dbfc 100644 --- a/trunk/drivers/pci/intel-iommu.c +++ b/trunk/drivers/pci/intel-iommu.c @@ -85,9 +85,31 @@ static struct kmem_cache *iommu_domain_cache; static struct kmem_cache *iommu_devinfo_cache; static struct kmem_cache *iommu_iova_cache; +static inline void *iommu_kmem_cache_alloc(struct kmem_cache *cachep) +{ + unsigned int flags; + void *vaddr; + + /* trying to avoid low memory issues */ + flags = current->flags & PF_MEMALLOC; + current->flags |= PF_MEMALLOC; + vaddr = kmem_cache_alloc(cachep, GFP_ATOMIC); + current->flags &= (~PF_MEMALLOC | flags); + return vaddr; +} + + static inline void *alloc_pgtable_page(void) { - return (void *)get_zeroed_page(GFP_ATOMIC); + unsigned int flags; + void *vaddr; + + /* trying to avoid low memory issues */ + flags = current->flags & PF_MEMALLOC; + current->flags |= PF_MEMALLOC; + vaddr = (void *)get_zeroed_page(GFP_ATOMIC); + current->flags &= (~PF_MEMALLOC | flags); + return vaddr; } static inline void free_pgtable_page(void *vaddr) @@ -97,7 +119,7 @@ static inline void free_pgtable_page(void *vaddr) static inline void *alloc_domain_mem(void) { - return kmem_cache_alloc(iommu_domain_cache, GFP_ATOMIC); + return iommu_kmem_cache_alloc(iommu_domain_cache); } static inline void free_domain_mem(void *vaddr) @@ -107,7 +129,7 @@ static inline void free_domain_mem(void *vaddr) static inline void * alloc_devinfo_mem(void) { - return kmem_cache_alloc(iommu_devinfo_cache, GFP_ATOMIC); + return iommu_kmem_cache_alloc(iommu_devinfo_cache); } static inline void free_devinfo_mem(void *vaddr) @@ -117,7 +139,7 @@ static inline void free_devinfo_mem(void *vaddr) struct iova *alloc_iova_mem(void) { - return kmem_cache_alloc(iommu_iova_cache, GFP_ATOMIC); + return iommu_kmem_cache_alloc(iommu_iova_cache); } void free_iova_mem(struct iova *iova)