module.h: simplify MODULE_IMPORT_NS
[linux-2.6-microblaze.git] / lib / sbitmap.c
index 09d293c..ae4fd4d 100644 (file)
@@ -85,7 +85,6 @@ int sbitmap_init_node(struct sbitmap *sb, unsigned int depth, int shift,
                      bool alloc_hint)
 {
        unsigned int bits_per_word;
-       unsigned int i;
 
        if (shift < 0)
                shift = sbitmap_calculate_shift(depth);
@@ -111,16 +110,12 @@ int sbitmap_init_node(struct sbitmap *sb, unsigned int depth, int shift,
                sb->alloc_hint = NULL;
        }
 
-       sb->map = kcalloc_node(sb->map_nr, sizeof(*sb->map), flags, node);
+       sb->map = kvzalloc_node(sb->map_nr * sizeof(*sb->map), flags, node);
        if (!sb->map) {
                free_percpu(sb->alloc_hint);
                return -ENOMEM;
        }
 
-       for (i = 0; i < sb->map_nr; i++) {
-               sb->map[i].depth = min(depth, bits_per_word);
-               depth -= sb->map[i].depth;
-       }
        return 0;
 }
 EXPORT_SYMBOL_GPL(sbitmap_init_node);
@@ -135,11 +130,6 @@ void sbitmap_resize(struct sbitmap *sb, unsigned int depth)
 
        sb->depth = depth;
        sb->map_nr = DIV_ROUND_UP(sb->depth, bits_per_word);
-
-       for (i = 0; i < sb->map_nr; i++) {
-               sb->map[i].depth = min(depth, bits_per_word);
-               depth -= sb->map[i].depth;
-       }
 }
 EXPORT_SYMBOL_GPL(sbitmap_resize);
 
@@ -184,8 +174,8 @@ static int sbitmap_find_bit_in_index(struct sbitmap *sb, int index,
        int nr;
 
        do {
-               nr = __sbitmap_get_word(&map->word, map->depth, alloc_hint,
-                                       !sb->round_robin);
+               nr = __sbitmap_get_word(&map->word, __map_depth(sb, index),
+                                       alloc_hint, !sb->round_robin);
                if (nr != -1)
                        break;
                if (!sbitmap_deferred_clear(map))
@@ -257,7 +247,9 @@ static int __sbitmap_get_shallow(struct sbitmap *sb,
        for (i = 0; i < sb->map_nr; i++) {
 again:
                nr = __sbitmap_get_word(&sb->map[index].word,
-                                       min(sb->map[index].depth, shallow_depth),
+                                       min_t(unsigned int,
+                                             __map_depth(sb, index),
+                                             shallow_depth),
                                        SB_NR_TO_BIT(sb, alloc_hint), true);
                if (nr != -1) {
                        nr += index << sb->shift;
@@ -315,11 +307,12 @@ static unsigned int __sbitmap_weight(const struct sbitmap *sb, bool set)
 
        for (i = 0; i < sb->map_nr; i++) {
                const struct sbitmap_word *word = &sb->map[i];
+               unsigned int word_depth = __map_depth(sb, i);
 
                if (set)
-                       weight += bitmap_weight(&word->word, word->depth);
+                       weight += bitmap_weight(&word->word, word_depth);
                else
-                       weight += bitmap_weight(&word->cleared, word->depth);
+                       weight += bitmap_weight(&word->cleared, word_depth);
        }
        return weight;
 }
@@ -367,7 +360,7 @@ void sbitmap_bitmap_show(struct sbitmap *sb, struct seq_file *m)
        for (i = 0; i < sb->map_nr; i++) {
                unsigned long word = READ_ONCE(sb->map[i].word);
                unsigned long cleared = READ_ONCE(sb->map[i].cleared);
-               unsigned int word_bits = READ_ONCE(sb->map[i].depth);
+               unsigned int word_bits = __map_depth(sb, i);
 
                word &= ~cleared;
 
@@ -531,15 +524,16 @@ unsigned long __sbitmap_queue_get_batch(struct sbitmap_queue *sbq, int nr_tags,
        for (i = 0; i < sb->map_nr; i++) {
                struct sbitmap_word *map = &sb->map[index];
                unsigned long get_mask;
+               unsigned int map_depth = __map_depth(sb, index);
 
                sbitmap_deferred_clear(map);
-               if (map->word == (1UL << (map->depth - 1)) - 1)
+               if (map->word == (1UL << (map_depth - 1)) - 1)
                        continue;
 
-               nr = find_first_zero_bit(&map->word, map->depth);
-               if (nr + nr_tags <= map->depth) {
+               nr = find_first_zero_bit(&map->word, map_depth);
+               if (nr + nr_tags <= map_depth) {
                        atomic_long_t *ptr = (atomic_long_t *) &map->word;
-                       int map_tags = min_t(int, nr_tags, map->depth);
+                       int map_tags = min_t(int, nr_tags, map_depth);
                        unsigned long val, ret;
 
                        get_mask = ((1UL << map_tags) - 1) << nr;
@@ -563,14 +557,14 @@ unsigned long __sbitmap_queue_get_batch(struct sbitmap_queue *sbq, int nr_tags,
        return 0;
 }
 
-int __sbitmap_queue_get_shallow(struct sbitmap_queue *sbq,
-                               unsigned int shallow_depth)
+int sbitmap_queue_get_shallow(struct sbitmap_queue *sbq,
+                             unsigned int shallow_depth)
 {
        WARN_ON_ONCE(shallow_depth < sbq->min_shallow_depth);
 
        return sbitmap_get_shallow(&sbq->sb, shallow_depth);
 }
-EXPORT_SYMBOL_GPL(__sbitmap_queue_get_shallow);
+EXPORT_SYMBOL_GPL(sbitmap_queue_get_shallow);
 
 void sbitmap_queue_min_shallow_depth(struct sbitmap_queue *sbq,
                                     unsigned int min_shallow_depth)