IB/hfi1: Using kfree_rcu() to simplify the code
[linux-2.6-block.git] / drivers / iommu / intel-iommu.c
index 4b9040bb2f1ca5129a90e4d5cce17433fef55daf..ebb5bf3ddbd9424586b4d22068bd7a41656881b4 100644 (file)
@@ -1672,7 +1672,7 @@ static int iommu_init_domains(struct intel_iommu *iommu)
                return -ENOMEM;
        }
 
-       size = ((ndomains >> 8) + 1) * sizeof(struct dmar_domain **);
+       size = (ALIGN(ndomains, 256) >> 8) * sizeof(struct dmar_domain **);
        iommu->domains = kzalloc(size, GFP_KERNEL);
 
        if (iommu->domains) {
@@ -1737,7 +1737,7 @@ static void disable_dmar_iommu(struct intel_iommu *iommu)
 static void free_dmar_iommu(struct intel_iommu *iommu)
 {
        if ((iommu->domains) && (iommu->domain_ids)) {
-               int elems = (cap_ndoms(iommu->cap) >> 8) + 1;
+               int elems = ALIGN(cap_ndoms(iommu->cap), 256) >> 8;
                int i;
 
                for (i = 0; i < elems; i++)
@@ -2076,7 +2076,7 @@ out_unlock:
        spin_unlock(&iommu->lock);
        spin_unlock_irqrestore(&device_domain_lock, flags);
 
-       return 0;
+       return ret;
 }
 
 struct domain_context_mapping_data {
@@ -3552,7 +3552,7 @@ error:
 static dma_addr_t intel_map_page(struct device *dev, struct page *page,
                                 unsigned long offset, size_t size,
                                 enum dma_data_direction dir,
-                                struct dma_attrs *attrs)
+                                unsigned long attrs)
 {
        return __intel_map_single(dev, page_to_phys(page) + offset, size,
                                  dir, *dev->dma_mask);
@@ -3711,14 +3711,14 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
 
 static void intel_unmap_page(struct device *dev, dma_addr_t dev_addr,
                             size_t size, enum dma_data_direction dir,
-                            struct dma_attrs *attrs)
+                            unsigned long attrs)
 {
        intel_unmap(dev, dev_addr, size);
 }
 
 static void *intel_alloc_coherent(struct device *dev, size_t size,
                                  dma_addr_t *dma_handle, gfp_t flags,
-                                 struct dma_attrs *attrs)
+                                 unsigned long attrs)
 {
        struct page *page = NULL;
        int order;
@@ -3764,7 +3764,7 @@ static void *intel_alloc_coherent(struct device *dev, size_t size,
 }
 
 static void intel_free_coherent(struct device *dev, size_t size, void *vaddr,
-                               dma_addr_t dma_handle, struct dma_attrs *attrs)
+                               dma_addr_t dma_handle, unsigned long attrs)
 {
        int order;
        struct page *page = virt_to_page(vaddr);
@@ -3779,7 +3779,7 @@ static void intel_free_coherent(struct device *dev, size_t size, void *vaddr,
 
 static void intel_unmap_sg(struct device *dev, struct scatterlist *sglist,
                           int nelems, enum dma_data_direction dir,
-                          struct dma_attrs *attrs)
+                          unsigned long attrs)
 {
        dma_addr_t startaddr = sg_dma_address(sglist) & PAGE_MASK;
        unsigned long nrpages = 0;
@@ -3808,7 +3808,7 @@ static int intel_nontranslate_map_sg(struct device *hddev,
 }
 
 static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nelems,
-                       enum dma_data_direction dir, struct dma_attrs *attrs)
+                       enum dma_data_direction dir, unsigned long attrs)
 {
        int i;
        struct dmar_domain *domain;