2 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.
3 * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.
5 * This software is available to you under a choice of one of two
6 * licenses. You may choose to be licensed under the terms of the GNU
7 * General Public License (GPL) Version 2, available from the file
8 * COPYING in the main directory of this source tree, or the
9 * OpenIB.org BSD license below:
11 * Redistribution and use in source and binary forms, with or
12 * without modification, are permitted provided that the following
15 * - Redistributions of source code must retain the above
16 * copyright notice, this list of conditions and the following
19 * - Redistributions in binary form must reproduce the above
20 * copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials
22 * provided with the distribution.
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34 #include <linux/errno.h>
35 #include <linux/slab.h>
37 #include <linux/export.h>
38 #include <linux/bitmap.h>
39 #include <linux/dma-mapping.h>
40 #include <linux/vmalloc.h>
44 u32
mlx4_bitmap_alloc(struct mlx4_bitmap
*bitmap
)
48 spin_lock(&bitmap
->lock
);
50 obj
= find_next_zero_bit(bitmap
->table
, bitmap
->max
, bitmap
->last
);
51 if (obj
>= bitmap
->max
) {
52 bitmap
->top
= (bitmap
->top
+ bitmap
->max
+ bitmap
->reserved_top
)
54 obj
= find_first_zero_bit(bitmap
->table
, bitmap
->max
);
57 if (obj
< bitmap
->max
) {
58 set_bit(obj
, bitmap
->table
);
59 bitmap
->last
= (obj
+ 1);
60 if (bitmap
->last
== bitmap
->max
)
69 spin_unlock(&bitmap
->lock
);
74 void mlx4_bitmap_free(struct mlx4_bitmap
*bitmap
, u32 obj
, int use_rr
)
76 mlx4_bitmap_free_range(bitmap
, obj
, 1, use_rr
);
79 static unsigned long find_aligned_range(unsigned long *bitmap
,
81 int len
, int align
, u32 skip_mask
)
86 start
= ALIGN(start
, align
);
88 while ((start
< nbits
) && (test_bit(start
, bitmap
) ||
99 for (i
= start
+ 1; i
< end
; i
++) {
100 if (test_bit(i
, bitmap
) || ((u32
)i
& skip_mask
)) {
109 u32
mlx4_bitmap_alloc_range(struct mlx4_bitmap
*bitmap
, int cnt
,
110 int align
, u32 skip_mask
)
114 if (likely(cnt
== 1 && align
== 1 && !skip_mask
))
115 return mlx4_bitmap_alloc(bitmap
);
117 spin_lock(&bitmap
->lock
);
119 obj
= find_aligned_range(bitmap
->table
, bitmap
->last
,
120 bitmap
->max
, cnt
, align
, skip_mask
);
121 if (obj
>= bitmap
->max
) {
122 bitmap
->top
= (bitmap
->top
+ bitmap
->max
+ bitmap
->reserved_top
)
124 obj
= find_aligned_range(bitmap
->table
, 0, bitmap
->max
,
125 cnt
, align
, skip_mask
);
128 if (obj
< bitmap
->max
) {
129 bitmap_set(bitmap
->table
, obj
, cnt
);
130 if (obj
== bitmap
->last
) {
131 bitmap
->last
= (obj
+ cnt
);
132 if (bitmap
->last
>= bitmap
->max
)
140 bitmap
->avail
-= cnt
;
142 spin_unlock(&bitmap
->lock
);
147 u32
mlx4_bitmap_avail(struct mlx4_bitmap
*bitmap
)
149 return bitmap
->avail
;
152 static u32
mlx4_bitmap_masked_value(struct mlx4_bitmap
*bitmap
, u32 obj
)
154 return obj
& (bitmap
->max
+ bitmap
->reserved_top
- 1);
157 void mlx4_bitmap_free_range(struct mlx4_bitmap
*bitmap
, u32 obj
, int cnt
,
160 obj
&= bitmap
->max
+ bitmap
->reserved_top
- 1;
162 spin_lock(&bitmap
->lock
);
164 bitmap
->last
= min(bitmap
->last
, obj
);
165 bitmap
->top
= (bitmap
->top
+ bitmap
->max
+ bitmap
->reserved_top
)
168 bitmap_clear(bitmap
->table
, obj
, cnt
);
169 bitmap
->avail
+= cnt
;
170 spin_unlock(&bitmap
->lock
);
173 int mlx4_bitmap_init(struct mlx4_bitmap
*bitmap
, u32 num
, u32 mask
,
174 u32 reserved_bot
, u32 reserved_top
)
176 /* num must be a power of 2 */
177 if (num
!= roundup_pow_of_two(num
))
182 bitmap
->max
= num
- reserved_top
;
184 bitmap
->reserved_top
= reserved_top
;
185 bitmap
->avail
= num
- reserved_top
- reserved_bot
;
186 bitmap
->effective_len
= bitmap
->avail
;
187 spin_lock_init(&bitmap
->lock
);
188 bitmap
->table
= kzalloc(BITS_TO_LONGS(bitmap
->max
) *
189 sizeof (long), GFP_KERNEL
);
193 bitmap_set(bitmap
->table
, 0, reserved_bot
);
198 void mlx4_bitmap_cleanup(struct mlx4_bitmap
*bitmap
)
200 kfree(bitmap
->table
);
203 struct mlx4_zone_allocator
{
204 struct list_head entries
;
205 struct list_head prios
;
208 /* protect the zone_allocator from concurrent accesses */
210 enum mlx4_zone_alloc_flags flags
;
213 struct mlx4_zone_entry
{
214 struct list_head list
;
215 struct list_head prio_list
;
217 struct mlx4_zone_allocator
*allocator
;
218 struct mlx4_bitmap
*bitmap
;
222 enum mlx4_zone_flags flags
;
225 struct mlx4_zone_allocator
*mlx4_zone_allocator_create(enum mlx4_zone_alloc_flags flags
)
227 struct mlx4_zone_allocator
*zones
= kmalloc(sizeof(*zones
), GFP_KERNEL
);
232 INIT_LIST_HEAD(&zones
->entries
);
233 INIT_LIST_HEAD(&zones
->prios
);
234 spin_lock_init(&zones
->lock
);
237 zones
->flags
= flags
;
242 int mlx4_zone_add_one(struct mlx4_zone_allocator
*zone_alloc
,
243 struct mlx4_bitmap
*bitmap
,
249 u32 mask
= mlx4_bitmap_masked_value(bitmap
, (u32
)-1);
250 struct mlx4_zone_entry
*it
;
251 struct mlx4_zone_entry
*zone
= kmalloc(sizeof(*zone
), GFP_KERNEL
);
257 zone
->bitmap
= bitmap
;
258 zone
->use_rr
= (flags
& MLX4_ZONE_USE_RR
) ? MLX4_USE_RR
: 0;
259 zone
->priority
= priority
;
260 zone
->offset
= offset
;
262 spin_lock(&zone_alloc
->lock
);
264 zone
->uid
= zone_alloc
->last_uid
++;
265 zone
->allocator
= zone_alloc
;
267 if (zone_alloc
->mask
< mask
)
268 zone_alloc
->mask
= mask
;
270 list_for_each_entry(it
, &zone_alloc
->prios
, prio_list
)
271 if (it
->priority
>= priority
)
274 if (&it
->prio_list
== &zone_alloc
->prios
|| it
->priority
> priority
)
275 list_add_tail(&zone
->prio_list
, &it
->prio_list
);
276 list_add_tail(&zone
->list
, &it
->list
);
278 spin_unlock(&zone_alloc
->lock
);
285 /* Should be called under a lock */
286 static int __mlx4_zone_remove_one_entry(struct mlx4_zone_entry
*entry
)
288 struct mlx4_zone_allocator
*zone_alloc
= entry
->allocator
;
290 if (!list_empty(&entry
->prio_list
)) {
291 /* Check if we need to add an alternative node to the prio list */
292 if (!list_is_last(&entry
->list
, &zone_alloc
->entries
)) {
293 struct mlx4_zone_entry
*next
= list_first_entry(&entry
->list
,
297 if (next
->priority
== entry
->priority
)
298 list_add_tail(&next
->prio_list
, &entry
->prio_list
);
301 list_del(&entry
->prio_list
);
304 list_del(&entry
->list
);
306 if (zone_alloc
->flags
& MLX4_ZONE_ALLOC_FLAGS_NO_OVERLAP
) {
308 struct mlx4_zone_entry
*it
;
310 list_for_each_entry(it
, &zone_alloc
->prios
, prio_list
) {
311 u32 cur_mask
= mlx4_bitmap_masked_value(it
->bitmap
, (u32
)-1);
316 zone_alloc
->mask
= mask
;
322 void mlx4_zone_allocator_destroy(struct mlx4_zone_allocator
*zone_alloc
)
324 struct mlx4_zone_entry
*zone
, *tmp
;
326 spin_lock(&zone_alloc
->lock
);
328 list_for_each_entry_safe(zone
, tmp
, &zone_alloc
->entries
, list
) {
329 list_del(&zone
->list
);
330 list_del(&zone
->prio_list
);
334 spin_unlock(&zone_alloc
->lock
);
338 /* Should be called under a lock */
339 static u32
__mlx4_alloc_from_zone(struct mlx4_zone_entry
*zone
, int count
,
340 int align
, u32 skip_mask
, u32
*puid
)
344 struct mlx4_zone_allocator
*zone_alloc
= zone
->allocator
;
345 struct mlx4_zone_entry
*curr_node
;
347 res
= mlx4_bitmap_alloc_range(zone
->bitmap
, count
,
350 if (res
!= (u32
)-1) {
356 list_for_each_entry(curr_node
, &zone_alloc
->prios
, prio_list
) {
357 if (unlikely(curr_node
->priority
== zone
->priority
))
361 if (zone
->flags
& MLX4_ZONE_ALLOW_ALLOC_FROM_LOWER_PRIO
) {
362 struct mlx4_zone_entry
*it
= curr_node
;
364 list_for_each_entry_continue_reverse(it
, &zone_alloc
->entries
, list
) {
365 res
= mlx4_bitmap_alloc_range(it
->bitmap
, count
,
367 if (res
!= (u32
)-1) {
375 if (zone
->flags
& MLX4_ZONE_ALLOW_ALLOC_FROM_EQ_PRIO
) {
376 struct mlx4_zone_entry
*it
= curr_node
;
378 list_for_each_entry_from(it
, &zone_alloc
->entries
, list
) {
379 if (unlikely(it
== zone
))
382 if (unlikely(it
->priority
!= curr_node
->priority
))
385 res
= mlx4_bitmap_alloc_range(it
->bitmap
, count
,
387 if (res
!= (u32
)-1) {
395 if (zone
->flags
& MLX4_ZONE_FALLBACK_TO_HIGHER_PRIO
) {
396 if (list_is_last(&curr_node
->prio_list
, &zone_alloc
->prios
))
399 curr_node
= list_first_entry(&curr_node
->prio_list
,
403 list_for_each_entry_from(curr_node
, &zone_alloc
->entries
, list
) {
404 res
= mlx4_bitmap_alloc_range(curr_node
->bitmap
, count
,
406 if (res
!= (u32
)-1) {
407 res
+= curr_node
->offset
;
408 uid
= curr_node
->uid
;
415 if (NULL
!= puid
&& res
!= (u32
)-1)
420 /* Should be called under a lock */
421 static void __mlx4_free_from_zone(struct mlx4_zone_entry
*zone
, u32 obj
,
424 mlx4_bitmap_free_range(zone
->bitmap
, obj
- zone
->offset
, count
, zone
->use_rr
);
427 /* Should be called under a lock */
428 static struct mlx4_zone_entry
*__mlx4_find_zone_by_uid(
429 struct mlx4_zone_allocator
*zones
, u32 uid
)
431 struct mlx4_zone_entry
*zone
;
433 list_for_each_entry(zone
, &zones
->entries
, list
) {
434 if (zone
->uid
== uid
)
441 struct mlx4_bitmap
*mlx4_zone_get_bitmap(struct mlx4_zone_allocator
*zones
, u32 uid
)
443 struct mlx4_zone_entry
*zone
;
444 struct mlx4_bitmap
*bitmap
;
446 spin_lock(&zones
->lock
);
448 zone
= __mlx4_find_zone_by_uid(zones
, uid
);
450 bitmap
= zone
== NULL
? NULL
: zone
->bitmap
;
452 spin_unlock(&zones
->lock
);
457 int mlx4_zone_remove_one(struct mlx4_zone_allocator
*zones
, u32 uid
)
459 struct mlx4_zone_entry
*zone
;
462 spin_lock(&zones
->lock
);
464 zone
= __mlx4_find_zone_by_uid(zones
, uid
);
471 res
= __mlx4_zone_remove_one_entry(zone
);
474 spin_unlock(&zones
->lock
);
480 /* Should be called under a lock */
481 static struct mlx4_zone_entry
*__mlx4_find_zone_by_uid_unique(
482 struct mlx4_zone_allocator
*zones
, u32 obj
)
484 struct mlx4_zone_entry
*zone
, *zone_candidate
= NULL
;
487 /* Search for the smallest zone that this obj could be
488 * allocated from. This is done in order to handle
489 * situations when small bitmaps are allocated from bigger
490 * bitmaps (and the allocated space is marked as reserved in
493 list_for_each_entry(zone
, &zones
->entries
, list
) {
494 if (obj
>= zone
->offset
) {
495 u32 mobj
= (obj
- zone
->offset
) & zones
->mask
;
497 if (mobj
< zone
->bitmap
->max
) {
498 u32 curr_dist
= zone
->bitmap
->effective_len
;
500 if (curr_dist
< dist
) {
502 zone_candidate
= zone
;
508 return zone_candidate
;
511 u32
mlx4_zone_alloc_entries(struct mlx4_zone_allocator
*zones
, u32 uid
, int count
,
512 int align
, u32 skip_mask
, u32
*puid
)
514 struct mlx4_zone_entry
*zone
;
517 spin_lock(&zones
->lock
);
519 zone
= __mlx4_find_zone_by_uid(zones
, uid
);
524 res
= __mlx4_alloc_from_zone(zone
, count
, align
, skip_mask
, puid
);
527 spin_unlock(&zones
->lock
);
532 u32
mlx4_zone_free_entries(struct mlx4_zone_allocator
*zones
, u32 uid
, u32 obj
, u32 count
)
534 struct mlx4_zone_entry
*zone
;
537 spin_lock(&zones
->lock
);
539 zone
= __mlx4_find_zone_by_uid(zones
, uid
);
546 __mlx4_free_from_zone(zone
, obj
, count
);
549 spin_unlock(&zones
->lock
);
554 u32
mlx4_zone_free_entries_unique(struct mlx4_zone_allocator
*zones
, u32 obj
, u32 count
)
556 struct mlx4_zone_entry
*zone
;
559 if (!(zones
->flags
& MLX4_ZONE_ALLOC_FLAGS_NO_OVERLAP
))
562 spin_lock(&zones
->lock
);
564 zone
= __mlx4_find_zone_by_uid_unique(zones
, obj
);
571 __mlx4_free_from_zone(zone
, obj
, count
);
575 spin_unlock(&zones
->lock
);
580 static int mlx4_buf_direct_alloc(struct mlx4_dev
*dev
, int size
,
581 struct mlx4_buf
*buf
, gfp_t gfp
)
587 buf
->page_shift
= get_order(size
) + PAGE_SHIFT
;
589 dma_zalloc_coherent(&dev
->persist
->pdev
->dev
,
591 if (!buf
->direct
.buf
)
596 while (t
& ((1 << buf
->page_shift
) - 1)) {
604 /* Handling for queue buffers -- we allocate a bunch of memory and
605 * register it in a memory region at HCA virtual address 0. If the
606 * requested size is > max_direct, we split the allocation into
607 * multiple pages, so we don't require too much contiguous memory.
609 int mlx4_buf_alloc(struct mlx4_dev
*dev
, int size
, int max_direct
,
610 struct mlx4_buf
*buf
, gfp_t gfp
)
612 if (size
<= max_direct
) {
613 return mlx4_buf_direct_alloc(dev
, size
, buf
, gfp
);
618 buf
->direct
.buf
= NULL
;
619 buf
->nbufs
= (size
+ PAGE_SIZE
- 1) / PAGE_SIZE
;
620 buf
->npages
= buf
->nbufs
;
621 buf
->page_shift
= PAGE_SHIFT
;
622 buf
->page_list
= kcalloc(buf
->nbufs
, sizeof(*buf
->page_list
),
627 for (i
= 0; i
< buf
->nbufs
; ++i
) {
628 buf
->page_list
[i
].buf
=
629 dma_zalloc_coherent(&dev
->persist
->pdev
->dev
,
631 if (!buf
->page_list
[i
].buf
)
634 buf
->page_list
[i
].map
= t
;
641 mlx4_buf_free(dev
, size
, buf
);
645 EXPORT_SYMBOL_GPL(mlx4_buf_alloc
);
647 void mlx4_buf_free(struct mlx4_dev
*dev
, int size
, struct mlx4_buf
*buf
)
649 if (buf
->nbufs
== 1) {
650 dma_free_coherent(&dev
->persist
->pdev
->dev
, size
,
651 buf
->direct
.buf
, buf
->direct
.map
);
655 for (i
= 0; i
< buf
->nbufs
; ++i
)
656 if (buf
->page_list
[i
].buf
)
657 dma_free_coherent(&dev
->persist
->pdev
->dev
,
659 buf
->page_list
[i
].buf
,
660 buf
->page_list
[i
].map
);
661 kfree(buf
->page_list
);
664 EXPORT_SYMBOL_GPL(mlx4_buf_free
);
666 static struct mlx4_db_pgdir
*mlx4_alloc_db_pgdir(struct device
*dma_device
,
669 struct mlx4_db_pgdir
*pgdir
;
671 pgdir
= kzalloc(sizeof *pgdir
, gfp
);
675 bitmap_fill(pgdir
->order1
, MLX4_DB_PER_PAGE
/ 2);
676 pgdir
->bits
[0] = pgdir
->order0
;
677 pgdir
->bits
[1] = pgdir
->order1
;
678 pgdir
->db_page
= dma_alloc_coherent(dma_device
, PAGE_SIZE
,
679 &pgdir
->db_dma
, gfp
);
680 if (!pgdir
->db_page
) {
688 static int mlx4_alloc_db_from_pgdir(struct mlx4_db_pgdir
*pgdir
,
689 struct mlx4_db
*db
, int order
)
694 for (o
= order
; o
<= 1; ++o
) {
695 i
= find_first_bit(pgdir
->bits
[o
], MLX4_DB_PER_PAGE
>> o
);
696 if (i
< MLX4_DB_PER_PAGE
>> o
)
703 clear_bit(i
, pgdir
->bits
[o
]);
708 set_bit(i
^ 1, pgdir
->bits
[order
]);
712 db
->db
= pgdir
->db_page
+ db
->index
;
713 db
->dma
= pgdir
->db_dma
+ db
->index
* 4;
719 int mlx4_db_alloc(struct mlx4_dev
*dev
, struct mlx4_db
*db
, int order
, gfp_t gfp
)
721 struct mlx4_priv
*priv
= mlx4_priv(dev
);
722 struct mlx4_db_pgdir
*pgdir
;
725 mutex_lock(&priv
->pgdir_mutex
);
727 list_for_each_entry(pgdir
, &priv
->pgdir_list
, list
)
728 if (!mlx4_alloc_db_from_pgdir(pgdir
, db
, order
))
731 pgdir
= mlx4_alloc_db_pgdir(&dev
->persist
->pdev
->dev
, gfp
);
737 list_add(&pgdir
->list
, &priv
->pgdir_list
);
739 /* This should never fail -- we just allocated an empty page: */
740 WARN_ON(mlx4_alloc_db_from_pgdir(pgdir
, db
, order
));
743 mutex_unlock(&priv
->pgdir_mutex
);
747 EXPORT_SYMBOL_GPL(mlx4_db_alloc
);
749 void mlx4_db_free(struct mlx4_dev
*dev
, struct mlx4_db
*db
)
751 struct mlx4_priv
*priv
= mlx4_priv(dev
);
755 mutex_lock(&priv
->pgdir_mutex
);
760 if (db
->order
== 0 && test_bit(i
^ 1, db
->u
.pgdir
->order0
)) {
761 clear_bit(i
^ 1, db
->u
.pgdir
->order0
);
765 set_bit(i
, db
->u
.pgdir
->bits
[o
]);
767 if (bitmap_full(db
->u
.pgdir
->order1
, MLX4_DB_PER_PAGE
/ 2)) {
768 dma_free_coherent(&dev
->persist
->pdev
->dev
, PAGE_SIZE
,
769 db
->u
.pgdir
->db_page
, db
->u
.pgdir
->db_dma
);
770 list_del(&db
->u
.pgdir
->list
);
774 mutex_unlock(&priv
->pgdir_mutex
);
776 EXPORT_SYMBOL_GPL(mlx4_db_free
);
778 int mlx4_alloc_hwq_res(struct mlx4_dev
*dev
, struct mlx4_hwq_resources
*wqres
,
783 err
= mlx4_db_alloc(dev
, &wqres
->db
, 1, GFP_KERNEL
);
789 err
= mlx4_buf_direct_alloc(dev
, size
, &wqres
->buf
, GFP_KERNEL
);
793 err
= mlx4_mtt_init(dev
, wqres
->buf
.npages
, wqres
->buf
.page_shift
,
798 err
= mlx4_buf_write_mtt(dev
, &wqres
->mtt
, &wqres
->buf
, GFP_KERNEL
);
805 mlx4_mtt_cleanup(dev
, &wqres
->mtt
);
807 mlx4_buf_free(dev
, size
, &wqres
->buf
);
809 mlx4_db_free(dev
, &wqres
->db
);
813 EXPORT_SYMBOL_GPL(mlx4_alloc_hwq_res
);
815 void mlx4_free_hwq_res(struct mlx4_dev
*dev
, struct mlx4_hwq_resources
*wqres
,
818 mlx4_mtt_cleanup(dev
, &wqres
->mtt
);
819 mlx4_buf_free(dev
, size
, &wqres
->buf
);
820 mlx4_db_free(dev
, &wqres
->db
);
822 EXPORT_SYMBOL_GPL(mlx4_free_hwq_res
);