diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-01 00:27:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-01 00:27:29 -0400 |
commit | b63fe1ba4409774738c971d4e6f0b12b54cc2c65 (patch) | |
tree | 6f035e3502324a68427b548116d221129a66cf2c | |
parent | 0668b47205e42c04e9c1b594573be5a822ac7f09 (diff) | |
parent | 5a4e6dccbc0cd1b726820b782daebf887dcb95e9 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/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
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_allocator.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_allocator.c b/drivers/infiniband/hw/mthca/mthca_allocator.c index 25157f57a6d0..f930e55b58fc 100644 --- a/drivers/infiniband/hw/mthca/mthca_allocator.c +++ b/drivers/infiniband/hw/mthca/mthca_allocator.c | |||
@@ -41,9 +41,11 @@ | |||
41 | /* Trivial bitmap-based allocator */ | 41 | /* Trivial bitmap-based allocator */ |
42 | u32 mthca_alloc(struct mthca_alloc *alloc) | 42 | u32 mthca_alloc(struct mthca_alloc *alloc) |
43 | { | 43 | { |
44 | unsigned long flags; | ||
44 | u32 obj; | 45 | u32 obj; |
45 | 46 | ||
46 | spin_lock(&alloc->lock); | 47 | spin_lock_irqsave(&alloc->lock, flags); |
48 | |||
47 | obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last); | 49 | obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last); |
48 | if (obj >= alloc->max) { | 50 | if (obj >= alloc->max) { |
49 | alloc->top = (alloc->top + alloc->max) & alloc->mask; | 51 | alloc->top = (alloc->top + alloc->max) & alloc->mask; |
@@ -56,19 +58,24 @@ u32 mthca_alloc(struct mthca_alloc *alloc) | |||
56 | } else | 58 | } else |
57 | obj = -1; | 59 | obj = -1; |
58 | 60 | ||
59 | spin_unlock(&alloc->lock); | 61 | spin_unlock_irqrestore(&alloc->lock, flags); |
60 | 62 | ||
61 | return obj; | 63 | return obj; |
62 | } | 64 | } |
63 | 65 | ||
64 | void mthca_free(struct mthca_alloc *alloc, u32 obj) | 66 | void mthca_free(struct mthca_alloc *alloc, u32 obj) |
65 | { | 67 | { |
68 | unsigned long flags; | ||
69 | |||
66 | obj &= alloc->max - 1; | 70 | obj &= alloc->max - 1; |
67 | spin_lock(&alloc->lock); | 71 | |
72 | spin_lock_irqsave(&alloc->lock, flags); | ||
73 | |||
68 | clear_bit(obj, alloc->table); | 74 | clear_bit(obj, alloc->table); |
69 | alloc->last = min(alloc->last, obj); | 75 | alloc->last = min(alloc->last, obj); |
70 | alloc->top = (alloc->top + alloc->max) & alloc->mask; | 76 | alloc->top = (alloc->top + alloc->max) & alloc->mask; |
71 | spin_unlock(&alloc->lock); | 77 | |
78 | spin_unlock_irqrestore(&alloc->lock, flags); | ||
72 | } | 79 | } |
73 | 80 | ||
74 | int mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask, | 81 | int mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask, |