Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 35864
b: refs/heads/master
c: 796e439
h: refs/heads/master
v: v3
  • Loading branch information
Muli Ben-Yehuda authored and Andi Kleen committed Sep 26, 2006
1 parent 99f5e3c commit dfbeff8
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: de684652f34f57cb60d4d78d09139a0e0c5e7b1b
refs/heads/master: 796e4390e0378e1e57c033349610cfc741696a3d
44 changes: 35 additions & 9 deletions trunk/arch/x86_64/kernel/pci-calgary.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,35 @@ static inline void tce_cache_blast_stress(struct iommu_table *tbl)
{
tce_cache_blast(tbl);
}

static inline unsigned long verify_bit_range(unsigned long* bitmap,
int expected, unsigned long start, unsigned long end)
{
unsigned long idx = start;

BUG_ON(start >= end);

while (idx < end) {
if (!!test_bit(idx, bitmap) != expected)
return idx;
++idx;
}

/* all bits have the expected value */
return ~0UL;
}
#else /* debugging is disabled */
int debugging __read_mostly = 0;

static inline void tce_cache_blast_stress(struct iommu_table *tbl)
{
}

static inline unsigned long verify_bit_range(unsigned long* bitmap,
int expected, unsigned long start, unsigned long end)
{
return ~0UL;
}
#endif /* CONFIG_IOMMU_DEBUG */

static inline unsigned int num_dma_pages(unsigned long dma, unsigned int dmalen)
Expand All @@ -162,6 +185,7 @@ static void iommu_range_reserve(struct iommu_table *tbl,
{
unsigned long index;
unsigned long end;
unsigned long badbit;

index = start_addr >> PAGE_SHIFT;

Expand All @@ -173,14 +197,15 @@ static void iommu_range_reserve(struct iommu_table *tbl,
if (end > tbl->it_size) /* don't go off the table */
end = tbl->it_size;

while (index < end) {
if (test_bit(index, tbl->it_map))
badbit = verify_bit_range(tbl->it_map, 0, index, end);
if (badbit != ~0UL) {
if (printk_ratelimit())
printk(KERN_ERR "Calgary: entry already allocated at "
"0x%lx tbl %p dma 0x%lx npages %u\n",
index, tbl, start_addr, npages);
++index;
badbit, tbl, start_addr, npages);
}
set_bit_string(tbl->it_map, start_addr >> PAGE_SHIFT, npages);

set_bit_string(tbl->it_map, index, npages);
}

static unsigned long iommu_range_alloc(struct iommu_table *tbl,
Expand Down Expand Up @@ -247,19 +272,20 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
unsigned int npages)
{
unsigned long entry;
unsigned long i;
unsigned long badbit;

entry = dma_addr >> PAGE_SHIFT;

BUG_ON(entry + npages > tbl->it_size);

tce_free(tbl, entry, npages);

for (i = 0; i < npages; ++i) {
if (!test_bit(entry + i, tbl->it_map))
badbit = verify_bit_range(tbl->it_map, 1, entry, entry + npages);
if (badbit != ~0UL) {
if (printk_ratelimit())
printk(KERN_ERR "Calgary: bit is off at 0x%lx "
"tbl %p dma 0x%Lx entry 0x%lx npages %u\n",
entry + i, tbl, dma_addr, entry, npages);
badbit, tbl, dma_addr, entry, npages);
}

__clear_bit_string(tbl->it_map, entry, npages);
Expand Down

0 comments on commit dfbeff8

Please sign in to comment.