Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/roland/infiniband

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
  IB/mthca: Use IRQ safe locks to protect allocation bitmaps
  • Loading branch information
Linus Torvalds committed Sep 1, 2006
2 parents 0668b47 + 5a4e6dc commit b63fe1b
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions drivers/infiniband/hw/mthca/mthca_allocator.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@
/* Trivial bitmap-based allocator */
u32 mthca_alloc(struct mthca_alloc *alloc)
{
unsigned long flags;
u32 obj;

spin_lock(&alloc->lock);
spin_lock_irqsave(&alloc->lock, flags);

obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last);
if (obj >= alloc->max) {
alloc->top = (alloc->top + alloc->max) & alloc->mask;
Expand All @@ -56,19 +58,24 @@ u32 mthca_alloc(struct mthca_alloc *alloc)
} else
obj = -1;

spin_unlock(&alloc->lock);
spin_unlock_irqrestore(&alloc->lock, flags);

return obj;
}

void mthca_free(struct mthca_alloc *alloc, u32 obj)
{
unsigned long flags;

obj &= alloc->max - 1;
spin_lock(&alloc->lock);

spin_lock_irqsave(&alloc->lock, flags);

clear_bit(obj, alloc->table);
alloc->last = min(alloc->last, obj);
alloc->top = (alloc->top + alloc->max) & alloc->mask;
spin_unlock(&alloc->lock);

spin_unlock_irqrestore(&alloc->lock, flags);
}

int mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask,
Expand Down

0 comments on commit b63fe1b

Please sign in to comment.