Lines Matching refs:alloc
40 u32 mthca_alloc(struct mthca_alloc *alloc)
45 spin_lock_irqsave(&alloc->lock, flags);
47 obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last);
48 if (obj >= alloc->max) {
49 alloc->top = (alloc->top + alloc->max) & alloc->mask;
50 obj = find_first_zero_bit(alloc->table, alloc->max);
53 if (obj < alloc->max) {
54 __set_bit(obj, alloc->table);
55 obj |= alloc->top;
59 spin_unlock_irqrestore(&alloc->lock, flags);
64 void mthca_free(struct mthca_alloc *alloc, u32 obj)
68 obj &= alloc->max - 1;
70 spin_lock_irqsave(&alloc->lock, flags);
72 __clear_bit(obj, alloc->table);
73 alloc->last = min(alloc->last, obj);
74 alloc->top = (alloc->top + alloc->max) & alloc->mask;
76 spin_unlock_irqrestore(&alloc->lock, flags);
79 int mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask,
86 alloc->last = 0;
87 alloc->top = 0;
88 alloc->max = num;
89 alloc->mask = mask;
90 spin_lock_init(&alloc->lock);
91 alloc->table = bitmap_zalloc(num, GFP_KERNEL);
92 if (!alloc->table)
95 bitmap_set(alloc->table, 0, reserved);
100 void mthca_alloc_cleanup(struct mthca_alloc *alloc)
102 bitmap_free(alloc->table);