Skip to content

Commit

Permalink
iommu-helper: use bitmap library
Browse files Browse the repository at this point in the history
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: Akinobu Mita <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: FUJITA Tomonori <[email protected]>
Cc: Joerg Roedel <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
mita authored and torvalds committed Dec 16, 2009
1 parent c1a2a96 commit a66022c
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 64 deletions.
4 changes: 2 additions & 2 deletions arch/powerpc/kernel/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/dma-mapping.h>
#include <linux/bitops.h>
#include <linux/bitmap.h>
#include <linux/iommu-helper.h>
#include <linux/crash_dump.h>
#include <asm/io.h>
Expand Down Expand Up @@ -251,7 +251,7 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
}

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,
Expand Down
3 changes: 2 additions & 1 deletion arch/sparc/kernel/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <linux/dma-mapping.h>
#include <linux/errno.h>
#include <linux/iommu-helper.h>
#include <linux/bitmap.h>

#ifdef CONFIG_PCI
#include <linux/pci.h>
Expand Down Expand Up @@ -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;

iommu_area_free(arena->map, entry, npages);
bitmap_clear(arena->map, entry, npages);
}

int iommu_table_init(struct iommu *iommu, int tsbsize,
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/kernel/amd_iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

#include <linux/pci.h>
#include <linux/gfp.h>
#include <linux/bitops.h>
#include <linux/bitmap.h>
#include <linux/debugfs.h>
#include <linux/scatterlist.h>
#include <linux/dma-mapping.h>
Expand Down Expand Up @@ -1162,7 +1162,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom,

address = (address % APERTURE_RANGE_SIZE) >> PAGE_SHIFT;

iommu_area_free(range->bitmap, address, pages);
bitmap_clear(range->bitmap, address, pages);

}

Expand Down
6 changes: 3 additions & 3 deletions arch/x86/kernel/pci-calgary_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#include <linux/string.h>
#include <linux/crash_dump.h>
#include <linux/dma-mapping.h>
#include <linux/bitops.h>
#include <linux/bitmap.h>
#include <linux/pci_ids.h>
#include <linux/pci.h>
#include <linux/delay.h>
Expand Down Expand Up @@ -212,7 +212,7 @@ static void iommu_range_reserve(struct iommu_table *tbl,

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);
}
Expand Down Expand Up @@ -303,7 +303,7 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,

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);
}
Expand Down
6 changes: 3 additions & 3 deletions arch/x86/kernel/pci-gart_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#include <linux/module.h>
#include <linux/topology.h>
#include <linux/interrupt.h>
#include <linux/bitops.h>
#include <linux/bitmap.h>
#include <linux/kdebug.h>
#include <linux/scatterlist.h>
#include <linux/iommu-helper.h>
Expand Down Expand Up @@ -126,7 +126,7 @@ static void free_iommu(unsigned long offset, int size)
unsigned long 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)
next_bit = offset + size;
spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
Expand Down Expand Up @@ -792,7 +792,7 @@ int __init gart_iommu_init(void)
* Out of IOMMU space handling.
* 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",
iommu_size >> 20);
Expand Down
3 changes: 0 additions & 3 deletions include/linux/iommu-helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
unsigned long shift,
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,
unsigned long start, unsigned int nr,
unsigned long shift,
unsigned long boundary_size,
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,
unsigned long io_page_size);
Expand Down
59 changes: 9 additions & 50 deletions lib/iommu-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,7 @@
*/

#include <linux/module.h>
#include <linux/bitops.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++;
}
}
#include <linux/bitmap.h>

int iommu_is_span_boundary(unsigned int index, unsigned int nr,
unsigned long shift,
Expand All @@ -55,31 +21,24 @@ unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,
unsigned long align_mask)
{
unsigned long index;

/* We don't want the last of the limit */
size -= 1;
again:
index = find_next_zero_area(map, size, start, nr, align_mask);
if (index != -1) {
index = bitmap_find_next_zero_area(map, size, start, nr, align_mask);
if (index < size) {
if (iommu_is_span_boundary(index, nr, shift, boundary_size)) {
/* we could do more effectively */
start = index + 1;
goto again;
}
iommu_area_reserve(map, index, nr);
bitmap_set(map, index, nr);
return index;
}
return index;
return -1;
}
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 io_page_size)
{
Expand Down

0 comments on commit a66022c

Please sign in to comment.