Commit a66022c4 authored by Akinobu Mita's avatar Akinobu Mita Committed by Linus Torvalds

iommu-helper: use bitmap library

Use bitmap library and kill some unused iommu helper functions.

1. s/iommu_area_free/bitmap_clear/

2. s/iommu_area_reserve/bitmap_set/

3. Use bitmap_find_next_zero_area instead of find_next_zero_area

  This cannot be simple substitution because find_next_zero_area
  doesn't check the last bit of the limit in bitmap

4. Remove iommu_area_free, iommu_area_reserve, and find_next_zero_area
Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c1a2a962
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/bitops.h> #include <linux/bitmap.h>
#include <linux/iommu-helper.h> #include <linux/iommu-helper.h>
#include <linux/crash_dump.h> #include <linux/crash_dump.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -251,7 +251,7 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, ...@@ -251,7 +251,7 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
} }
ppc_md.tce_free(tbl, entry, npages); ppc_md.tce_free(tbl, entry, npages);
iommu_area_free(tbl->it_map, free_entry, npages); bitmap_clear(tbl->it_map, free_entry, npages);
} }
static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/iommu-helper.h> #include <linux/iommu-helper.h>
#include <linux/bitmap.h>
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
#include <linux/pci.h> #include <linux/pci.h>
...@@ -169,7 +170,7 @@ void iommu_range_free(struct iommu *iommu, dma_addr_t dma_addr, unsigned long np ...@@ -169,7 +170,7 @@ void iommu_range_free(struct iommu *iommu, dma_addr_t dma_addr, unsigned long np
entry = (dma_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT; entry = (dma_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT;
iommu_area_free(arena->map, entry, npages); bitmap_clear(arena->map, entry, npages);
} }
int iommu_table_init(struct iommu *iommu, int tsbsize, int iommu_table_init(struct iommu *iommu, int tsbsize,
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/bitops.h> #include <linux/bitmap.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
...@@ -1162,7 +1162,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, ...@@ -1162,7 +1162,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom,
address = (address % APERTURE_RANGE_SIZE) >> PAGE_SHIFT; address = (address % APERTURE_RANGE_SIZE) >> PAGE_SHIFT;
iommu_area_free(range->bitmap, address, pages); bitmap_clear(range->bitmap, address, pages);
} }
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/crash_dump.h> #include <linux/crash_dump.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/bitops.h> #include <linux/bitmap.h>
#include <linux/pci_ids.h> #include <linux/pci_ids.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -212,7 +212,7 @@ static void iommu_range_reserve(struct iommu_table *tbl, ...@@ -212,7 +212,7 @@ static void iommu_range_reserve(struct iommu_table *tbl,
spin_lock_irqsave(&tbl->it_lock, flags); spin_lock_irqsave(&tbl->it_lock, flags);
iommu_area_reserve(tbl->it_map, index, npages); bitmap_set(tbl->it_map, index, npages);
spin_unlock_irqrestore(&tbl->it_lock, flags); spin_unlock_irqrestore(&tbl->it_lock, flags);
} }
...@@ -303,7 +303,7 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, ...@@ -303,7 +303,7 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
spin_lock_irqsave(&tbl->it_lock, flags); spin_lock_irqsave(&tbl->it_lock, flags);
iommu_area_free(tbl->it_map, entry, npages); bitmap_clear(tbl->it_map, entry, npages);
spin_unlock_irqrestore(&tbl->it_lock, flags); spin_unlock_irqrestore(&tbl->it_lock, flags);
} }
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/topology.h> #include <linux/topology.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/bitops.h> #include <linux/bitmap.h>
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/iommu-helper.h> #include <linux/iommu-helper.h>
...@@ -126,7 +126,7 @@ static void free_iommu(unsigned long offset, int size) ...@@ -126,7 +126,7 @@ static void free_iommu(unsigned long offset, int size)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&iommu_bitmap_lock, flags); spin_lock_irqsave(&iommu_bitmap_lock, flags);
iommu_area_free(iommu_gart_bitmap, offset, size); bitmap_clear(iommu_gart_bitmap, offset, size);
if (offset >= next_bit) if (offset >= next_bit)
next_bit = offset + size; next_bit = offset + size;
spin_unlock_irqrestore(&iommu_bitmap_lock, flags); spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
...@@ -792,7 +792,7 @@ int __init gart_iommu_init(void) ...@@ -792,7 +792,7 @@ int __init gart_iommu_init(void)
* Out of IOMMU space handling. * Out of IOMMU space handling.
* Reserve some invalid pages at the beginning of the GART. * Reserve some invalid pages at the beginning of the GART.
*/ */
iommu_area_reserve(iommu_gart_bitmap, 0, EMERGENCY_PAGES); bitmap_set(iommu_gart_bitmap, 0, EMERGENCY_PAGES);
pr_info("PCI-DMA: Reserving %luMB of IOMMU area in the AGP aperture\n", pr_info("PCI-DMA: Reserving %luMB of IOMMU area in the AGP aperture\n",
iommu_size >> 20); iommu_size >> 20);
......
...@@ -14,14 +14,11 @@ static inline unsigned long iommu_device_max_index(unsigned long size, ...@@ -14,14 +14,11 @@ static inline unsigned long iommu_device_max_index(unsigned long size,
extern int iommu_is_span_boundary(unsigned int index, unsigned int nr, extern int iommu_is_span_boundary(unsigned int index, unsigned int nr,
unsigned long shift, unsigned long shift,
unsigned long boundary_size); unsigned long boundary_size);
extern void iommu_area_reserve(unsigned long *map, unsigned long i, int len);
extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,
unsigned long start, unsigned int nr, unsigned long start, unsigned int nr,
unsigned long shift, unsigned long shift,
unsigned long boundary_size, unsigned long boundary_size,
unsigned long align_mask); unsigned long align_mask);
extern void iommu_area_free(unsigned long *map, unsigned long start,
unsigned int nr);
extern unsigned long iommu_num_pages(unsigned long addr, unsigned long len, extern unsigned long iommu_num_pages(unsigned long addr, unsigned long len,
unsigned long io_page_size); unsigned long io_page_size);
......
...@@ -3,41 +3,7 @@ ...@@ -3,41 +3,7 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/bitops.h> #include <linux/bitmap.h>
static unsigned long find_next_zero_area(unsigned long *map,
unsigned long size,
unsigned long start,
unsigned int nr,
unsigned long align_mask)
{
unsigned long index, end, i;
again:
index = find_next_zero_bit(map, size, start);
/* Align allocation */
index = (index + align_mask) & ~align_mask;
end = index + nr;
if (end >= size)
return -1;
for (i = index; i < end; i++) {
if (test_bit(i, map)) {
start = i+1;
goto again;
}
}
return index;
}
void iommu_area_reserve(unsigned long *map, unsigned long i, int len)
{
unsigned long end = i + len;
while (i < end) {
__set_bit(i, map);
i++;
}
}
int iommu_is_span_boundary(unsigned int index, unsigned int nr, int iommu_is_span_boundary(unsigned int index, unsigned int nr,
unsigned long shift, unsigned long shift,
...@@ -55,31 +21,24 @@ unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, ...@@ -55,31 +21,24 @@ unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,
unsigned long align_mask) unsigned long align_mask)
{ {
unsigned long index; unsigned long index;
/* We don't want the last of the limit */
size -= 1;
again: again:
index = find_next_zero_area(map, size, start, nr, align_mask); index = bitmap_find_next_zero_area(map, size, start, nr, align_mask);
if (index != -1) { if (index < size) {
if (iommu_is_span_boundary(index, nr, shift, boundary_size)) { if (iommu_is_span_boundary(index, nr, shift, boundary_size)) {
/* we could do more effectively */ /* we could do more effectively */
start = index + 1; start = index + 1;
goto again; goto again;
} }
iommu_area_reserve(map, index, nr); bitmap_set(map, index, nr);
return index;
} }
return index; return -1;
} }
EXPORT_SYMBOL(iommu_area_alloc); EXPORT_SYMBOL(iommu_area_alloc);
void iommu_area_free(unsigned long *map, unsigned long start, unsigned int nr)
{
unsigned long end = start + nr;
while (start < end) {
__clear_bit(start, map);
start++;
}
}
EXPORT_SYMBOL(iommu_area_free);
unsigned long iommu_num_pages(unsigned long addr, unsigned long len, unsigned long iommu_num_pages(unsigned long addr, unsigned long len,
unsigned long io_page_size) unsigned long io_page_size)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment