LCOV - code coverage report
Current view: top level - lib - sbitmap.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 353 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 35 0.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  * Copyright (C) 2016 Facebook
       4             :  * Copyright (C) 2013-2014 Jens Axboe
       5             :  */
       6             : 
       7             : #include <linux/sched.h>
       8             : #include <linux/random.h>
       9             : #include <linux/sbitmap.h>
      10             : #include <linux/seq_file.h>
      11             : 
      12           0 : static int init_alloc_hint(struct sbitmap *sb, gfp_t flags)
      13             : {
      14           0 :         unsigned depth = sb->depth;
      15             : 
      16           0 :         sb->alloc_hint = alloc_percpu_gfp(unsigned int, flags);
      17           0 :         if (!sb->alloc_hint)
      18             :                 return -ENOMEM;
      19             : 
      20           0 :         if (depth && !sb->round_robin) {
      21             :                 int i;
      22             : 
      23           0 :                 for_each_possible_cpu(i)
      24           0 :                         *per_cpu_ptr(sb->alloc_hint, i) = prandom_u32() % depth;
      25             :         }
      26             :         return 0;
      27             : }
      28             : 
      29           0 : static inline unsigned update_alloc_hint_before_get(struct sbitmap *sb,
      30             :                                                     unsigned int depth)
      31             : {
      32             :         unsigned hint;
      33             : 
      34           0 :         hint = this_cpu_read(*sb->alloc_hint);
      35           0 :         if (unlikely(hint >= depth)) {
      36           0 :                 hint = depth ? prandom_u32() % depth : 0;
      37           0 :                 this_cpu_write(*sb->alloc_hint, hint);
      38             :         }
      39             : 
      40           0 :         return hint;
      41             : }
      42             : 
      43           0 : static inline void update_alloc_hint_after_get(struct sbitmap *sb,
      44             :                                                unsigned int depth,
      45             :                                                unsigned int hint,
      46             :                                                unsigned int nr)
      47             : {
      48           0 :         if (nr == -1) {
      49             :                 /* If the map is full, a hint won't do us much good. */
      50           0 :                 this_cpu_write(*sb->alloc_hint, 0);
      51           0 :         } else if (nr == hint || unlikely(sb->round_robin)) {
      52             :                 /* Only update the hint if we used it. */
      53           0 :                 hint = nr + 1;
      54           0 :                 if (hint >= depth - 1)
      55           0 :                         hint = 0;
      56           0 :                 this_cpu_write(*sb->alloc_hint, hint);
      57             :         }
      58           0 : }
      59             : 
      60             : /*
      61             :  * See if we have deferred clears that we can batch move
      62             :  */
      63             : static inline bool sbitmap_deferred_clear(struct sbitmap_word *map)
      64             : {
      65             :         unsigned long mask;
      66             : 
      67           0 :         if (!READ_ONCE(map->cleared))
      68             :                 return false;
      69             : 
      70             :         /*
      71             :          * First get a stable cleared mask, setting the old mask to 0.
      72             :          */
      73           0 :         mask = xchg(&map->cleared, 0);
      74             : 
      75             :         /*
      76             :          * Now clear the masked bits in our free word
      77             :          */
      78           0 :         atomic_long_andnot(mask, (atomic_long_t *)&map->word);
      79             :         BUILD_BUG_ON(sizeof(atomic_long_t) != sizeof(map->word));
      80             :         return true;
      81             : }
      82             : 
      83           0 : int sbitmap_init_node(struct sbitmap *sb, unsigned int depth, int shift,
      84             :                       gfp_t flags, int node, bool round_robin,
      85             :                       bool alloc_hint)
      86             : {
      87             :         unsigned int bits_per_word;
      88             : 
      89           0 :         if (shift < 0)
      90             :                 shift = sbitmap_calculate_shift(depth);
      91             : 
      92           0 :         bits_per_word = 1U << shift;
      93           0 :         if (bits_per_word > BITS_PER_LONG)
      94             :                 return -EINVAL;
      95             : 
      96           0 :         sb->shift = shift;
      97           0 :         sb->depth = depth;
      98           0 :         sb->map_nr = DIV_ROUND_UP(sb->depth, bits_per_word);
      99           0 :         sb->round_robin = round_robin;
     100             : 
     101           0 :         if (depth == 0) {
     102           0 :                 sb->map = NULL;
     103           0 :                 return 0;
     104             :         }
     105             : 
     106           0 :         if (alloc_hint) {
     107           0 :                 if (init_alloc_hint(sb, flags))
     108             :                         return -ENOMEM;
     109             :         } else {
     110           0 :                 sb->alloc_hint = NULL;
     111             :         }
     112             : 
     113           0 :         sb->map = kvzalloc_node(sb->map_nr * sizeof(*sb->map), flags, node);
     114           0 :         if (!sb->map) {
     115           0 :                 free_percpu(sb->alloc_hint);
     116           0 :                 return -ENOMEM;
     117             :         }
     118             : 
     119             :         return 0;
     120             : }
     121             : EXPORT_SYMBOL_GPL(sbitmap_init_node);
     122             : 
     123           0 : void sbitmap_resize(struct sbitmap *sb, unsigned int depth)
     124             : {
     125           0 :         unsigned int bits_per_word = 1U << sb->shift;
     126             :         unsigned int i;
     127             : 
     128           0 :         for (i = 0; i < sb->map_nr; i++)
     129           0 :                 sbitmap_deferred_clear(&sb->map[i]);
     130             : 
     131           0 :         sb->depth = depth;
     132           0 :         sb->map_nr = DIV_ROUND_UP(sb->depth, bits_per_word);
     133           0 : }
     134             : EXPORT_SYMBOL_GPL(sbitmap_resize);
     135             : 
     136           0 : static int __sbitmap_get_word(unsigned long *word, unsigned long depth,
     137             :                               unsigned int hint, bool wrap)
     138             : {
     139             :         int nr;
     140             : 
     141             :         /* don't wrap if starting from 0 */
     142           0 :         wrap = wrap && hint;
     143             : 
     144             :         while (1) {
     145           0 :                 nr = find_next_zero_bit(word, depth, hint);
     146           0 :                 if (unlikely(nr >= depth)) {
     147             :                         /*
     148             :                          * We started with an offset, and we didn't reset the
     149             :                          * offset to 0 in a failure case, so start from 0 to
     150             :                          * exhaust the map.
     151             :                          */
     152           0 :                         if (hint && wrap) {
     153           0 :                                 hint = 0;
     154           0 :                                 continue;
     155             :                         }
     156             :                         return -1;
     157             :                 }
     158             : 
     159           0 :                 if (!test_and_set_bit_lock(nr, word))
     160             :                         break;
     161             : 
     162           0 :                 hint = nr + 1;
     163           0 :                 if (hint >= depth - 1)
     164           0 :                         hint = 0;
     165             :         }
     166             : 
     167             :         return nr;
     168             : }
     169             : 
     170           0 : static int sbitmap_find_bit_in_index(struct sbitmap *sb, int index,
     171             :                                      unsigned int alloc_hint)
     172             : {
     173           0 :         struct sbitmap_word *map = &sb->map[index];
     174             :         int nr;
     175             : 
     176             :         do {
     177           0 :                 nr = __sbitmap_get_word(&map->word, __map_depth(sb, index),
     178           0 :                                         alloc_hint, !sb->round_robin);
     179           0 :                 if (nr != -1)
     180             :                         break;
     181           0 :                 if (!sbitmap_deferred_clear(map))
     182             :                         break;
     183             :         } while (1);
     184             : 
     185           0 :         return nr;
     186             : }
     187             : 
     188           0 : static int __sbitmap_get(struct sbitmap *sb, unsigned int alloc_hint)
     189             : {
     190             :         unsigned int i, index;
     191           0 :         int nr = -1;
     192             : 
     193           0 :         index = SB_NR_TO_INDEX(sb, alloc_hint);
     194             : 
     195             :         /*
     196             :          * Unless we're doing round robin tag allocation, just use the
     197             :          * alloc_hint to find the right word index. No point in looping
     198             :          * twice in find_next_zero_bit() for that case.
     199             :          */
     200           0 :         if (sb->round_robin)
     201           0 :                 alloc_hint = SB_NR_TO_BIT(sb, alloc_hint);
     202             :         else
     203             :                 alloc_hint = 0;
     204             : 
     205           0 :         for (i = 0; i < sb->map_nr; i++) {
     206           0 :                 nr = sbitmap_find_bit_in_index(sb, index, alloc_hint);
     207           0 :                 if (nr != -1) {
     208           0 :                         nr += index << sb->shift;
     209           0 :                         break;
     210             :                 }
     211             : 
     212             :                 /* Jump to next index. */
     213           0 :                 alloc_hint = 0;
     214           0 :                 if (++index >= sb->map_nr)
     215           0 :                         index = 0;
     216             :         }
     217             : 
     218           0 :         return nr;
     219             : }
     220             : 
     221           0 : int sbitmap_get(struct sbitmap *sb)
     222             : {
     223             :         int nr;
     224             :         unsigned int hint, depth;
     225             : 
     226           0 :         if (WARN_ON_ONCE(unlikely(!sb->alloc_hint)))
     227             :                 return -1;
     228             : 
     229           0 :         depth = READ_ONCE(sb->depth);
     230           0 :         hint = update_alloc_hint_before_get(sb, depth);
     231           0 :         nr = __sbitmap_get(sb, hint);
     232           0 :         update_alloc_hint_after_get(sb, depth, hint, nr);
     233             : 
     234           0 :         return nr;
     235             : }
     236             : EXPORT_SYMBOL_GPL(sbitmap_get);
     237             : 
     238           0 : static int __sbitmap_get_shallow(struct sbitmap *sb,
     239             :                                  unsigned int alloc_hint,
     240             :                                  unsigned long shallow_depth)
     241             : {
     242             :         unsigned int i, index;
     243           0 :         int nr = -1;
     244             : 
     245           0 :         index = SB_NR_TO_INDEX(sb, alloc_hint);
     246             : 
     247           0 :         for (i = 0; i < sb->map_nr; i++) {
     248             : again:
     249           0 :                 nr = __sbitmap_get_word(&sb->map[index].word,
     250           0 :                                         min_t(unsigned int,
     251             :                                               __map_depth(sb, index),
     252             :                                               shallow_depth),
     253           0 :                                         SB_NR_TO_BIT(sb, alloc_hint), true);
     254           0 :                 if (nr != -1) {
     255           0 :                         nr += index << sb->shift;
     256           0 :                         break;
     257             :                 }
     258             : 
     259           0 :                 if (sbitmap_deferred_clear(&sb->map[index]))
     260             :                         goto again;
     261             : 
     262             :                 /* Jump to next index. */
     263           0 :                 index++;
     264           0 :                 alloc_hint = index << sb->shift;
     265             : 
     266           0 :                 if (index >= sb->map_nr) {
     267           0 :                         index = 0;
     268           0 :                         alloc_hint = 0;
     269             :                 }
     270             :         }
     271             : 
     272           0 :         return nr;
     273             : }
     274             : 
     275           0 : int sbitmap_get_shallow(struct sbitmap *sb, unsigned long shallow_depth)
     276             : {
     277             :         int nr;
     278             :         unsigned int hint, depth;
     279             : 
     280           0 :         if (WARN_ON_ONCE(unlikely(!sb->alloc_hint)))
     281             :                 return -1;
     282             : 
     283           0 :         depth = READ_ONCE(sb->depth);
     284           0 :         hint = update_alloc_hint_before_get(sb, depth);
     285           0 :         nr = __sbitmap_get_shallow(sb, hint, shallow_depth);
     286           0 :         update_alloc_hint_after_get(sb, depth, hint, nr);
     287             : 
     288           0 :         return nr;
     289             : }
     290             : EXPORT_SYMBOL_GPL(sbitmap_get_shallow);
     291             : 
     292           0 : bool sbitmap_any_bit_set(const struct sbitmap *sb)
     293             : {
     294             :         unsigned int i;
     295             : 
     296           0 :         for (i = 0; i < sb->map_nr; i++) {
     297           0 :                 if (sb->map[i].word & ~sb->map[i].cleared)
     298             :                         return true;
     299             :         }
     300             :         return false;
     301             : }
     302             : EXPORT_SYMBOL_GPL(sbitmap_any_bit_set);
     303             : 
     304           0 : static unsigned int __sbitmap_weight(const struct sbitmap *sb, bool set)
     305             : {
     306           0 :         unsigned int i, weight = 0;
     307             : 
     308           0 :         for (i = 0; i < sb->map_nr; i++) {
     309           0 :                 const struct sbitmap_word *word = &sb->map[i];
     310           0 :                 unsigned int word_depth = __map_depth(sb, i);
     311             : 
     312           0 :                 if (set)
     313           0 :                         weight += bitmap_weight(&word->word, word_depth);
     314             :                 else
     315           0 :                         weight += bitmap_weight(&word->cleared, word_depth);
     316             :         }
     317           0 :         return weight;
     318             : }
     319             : 
     320             : static unsigned int sbitmap_cleared(const struct sbitmap *sb)
     321             : {
     322           0 :         return __sbitmap_weight(sb, false);
     323             : }
     324             : 
     325           0 : unsigned int sbitmap_weight(const struct sbitmap *sb)
     326             : {
     327           0 :         return __sbitmap_weight(sb, true) - sbitmap_cleared(sb);
     328             : }
     329             : EXPORT_SYMBOL_GPL(sbitmap_weight);
     330             : 
     331           0 : void sbitmap_show(struct sbitmap *sb, struct seq_file *m)
     332             : {
     333           0 :         seq_printf(m, "depth=%u\n", sb->depth);
     334           0 :         seq_printf(m, "busy=%u\n", sbitmap_weight(sb));
     335           0 :         seq_printf(m, "cleared=%u\n", sbitmap_cleared(sb));
     336           0 :         seq_printf(m, "bits_per_word=%u\n", 1U << sb->shift);
     337           0 :         seq_printf(m, "map_nr=%u\n", sb->map_nr);
     338           0 : }
     339             : EXPORT_SYMBOL_GPL(sbitmap_show);
     340             : 
     341           0 : static inline void emit_byte(struct seq_file *m, unsigned int offset, u8 byte)
     342             : {
     343           0 :         if ((offset & 0xf) == 0) {
     344           0 :                 if (offset != 0)
     345           0 :                         seq_putc(m, '\n');
     346           0 :                 seq_printf(m, "%08x:", offset);
     347             :         }
     348           0 :         if ((offset & 0x1) == 0)
     349           0 :                 seq_putc(m, ' ');
     350           0 :         seq_printf(m, "%02x", byte);
     351           0 : }
     352             : 
     353           0 : void sbitmap_bitmap_show(struct sbitmap *sb, struct seq_file *m)
     354             : {
     355           0 :         u8 byte = 0;
     356           0 :         unsigned int byte_bits = 0;
     357           0 :         unsigned int offset = 0;
     358             :         int i;
     359             : 
     360           0 :         for (i = 0; i < sb->map_nr; i++) {
     361           0 :                 unsigned long word = READ_ONCE(sb->map[i].word);
     362           0 :                 unsigned long cleared = READ_ONCE(sb->map[i].cleared);
     363           0 :                 unsigned int word_bits = __map_depth(sb, i);
     364             : 
     365           0 :                 word &= ~cleared;
     366             : 
     367           0 :                 while (word_bits > 0) {
     368           0 :                         unsigned int bits = min(8 - byte_bits, word_bits);
     369             : 
     370           0 :                         byte |= (word & (BIT(bits) - 1)) << byte_bits;
     371           0 :                         byte_bits += bits;
     372           0 :                         if (byte_bits == 8) {
     373           0 :                                 emit_byte(m, offset, byte);
     374           0 :                                 byte = 0;
     375           0 :                                 byte_bits = 0;
     376           0 :                                 offset++;
     377             :                         }
     378           0 :                         word >>= bits;
     379           0 :                         word_bits -= bits;
     380             :                 }
     381             :         }
     382           0 :         if (byte_bits) {
     383           0 :                 emit_byte(m, offset, byte);
     384           0 :                 offset++;
     385             :         }
     386           0 :         if (offset)
     387           0 :                 seq_putc(m, '\n');
     388           0 : }
     389             : EXPORT_SYMBOL_GPL(sbitmap_bitmap_show);
     390             : 
     391             : static unsigned int sbq_calc_wake_batch(struct sbitmap_queue *sbq,
     392             :                                         unsigned int depth)
     393             : {
     394             :         unsigned int wake_batch;
     395             :         unsigned int shallow_depth;
     396             : 
     397             :         /*
     398             :          * For each batch, we wake up one queue. We need to make sure that our
     399             :          * batch size is small enough that the full depth of the bitmap,
     400             :          * potentially limited by a shallow depth, is enough to wake up all of
     401             :          * the queues.
     402             :          *
     403             :          * Each full word of the bitmap has bits_per_word bits, and there might
     404             :          * be a partial word. There are depth / bits_per_word full words and
     405             :          * depth % bits_per_word bits left over. In bitwise arithmetic:
     406             :          *
     407             :          * bits_per_word = 1 << shift
     408             :          * depth / bits_per_word = depth >> shift
     409             :          * depth % bits_per_word = depth & ((1 << shift) - 1)
     410             :          *
     411             :          * Each word can be limited to sbq->min_shallow_depth bits.
     412             :          */
     413           0 :         shallow_depth = min(1U << sbq->sb.shift, sbq->min_shallow_depth);
     414           0 :         depth = ((depth >> sbq->sb.shift) * shallow_depth +
     415           0 :                  min(depth & ((1U << sbq->sb.shift) - 1), shallow_depth));
     416           0 :         wake_batch = clamp_t(unsigned int, depth / SBQ_WAIT_QUEUES, 1,
     417             :                              SBQ_WAKE_BATCH);
     418             : 
     419             :         return wake_batch;
     420             : }
     421             : 
     422           0 : int sbitmap_queue_init_node(struct sbitmap_queue *sbq, unsigned int depth,
     423             :                             int shift, bool round_robin, gfp_t flags, int node)
     424             : {
     425             :         int ret;
     426             :         int i;
     427             : 
     428           0 :         ret = sbitmap_init_node(&sbq->sb, depth, shift, flags, node,
     429             :                                 round_robin, true);
     430           0 :         if (ret)
     431             :                 return ret;
     432             : 
     433           0 :         sbq->min_shallow_depth = UINT_MAX;
     434           0 :         sbq->wake_batch = sbq_calc_wake_batch(sbq, depth);
     435           0 :         atomic_set(&sbq->wake_index, 0);
     436           0 :         atomic_set(&sbq->ws_active, 0);
     437             : 
     438           0 :         sbq->ws = kzalloc_node(SBQ_WAIT_QUEUES * sizeof(*sbq->ws), flags, node);
     439           0 :         if (!sbq->ws) {
     440           0 :                 sbitmap_free(&sbq->sb);
     441           0 :                 return -ENOMEM;
     442             :         }
     443             : 
     444           0 :         for (i = 0; i < SBQ_WAIT_QUEUES; i++) {
     445           0 :                 init_waitqueue_head(&sbq->ws[i].wait);
     446           0 :                 atomic_set(&sbq->ws[i].wait_cnt, sbq->wake_batch);
     447             :         }
     448             : 
     449             :         return 0;
     450             : }
     451             : EXPORT_SYMBOL_GPL(sbitmap_queue_init_node);
     452             : 
     453             : static inline void __sbitmap_queue_update_wake_batch(struct sbitmap_queue *sbq,
     454             :                                             unsigned int wake_batch)
     455             : {
     456             :         int i;
     457             : 
     458           0 :         if (sbq->wake_batch != wake_batch) {
     459           0 :                 WRITE_ONCE(sbq->wake_batch, wake_batch);
     460             :                 /*
     461             :                  * Pairs with the memory barrier in sbitmap_queue_wake_up()
     462             :                  * to ensure that the batch size is updated before the wait
     463             :                  * counts.
     464             :                  */
     465           0 :                 smp_mb();
     466           0 :                 for (i = 0; i < SBQ_WAIT_QUEUES; i++)
     467           0 :                         atomic_set(&sbq->ws[i].wait_cnt, 1);
     468             :         }
     469             : }
     470             : 
     471           0 : static void sbitmap_queue_update_wake_batch(struct sbitmap_queue *sbq,
     472             :                                             unsigned int depth)
     473             : {
     474             :         unsigned int wake_batch;
     475             : 
     476           0 :         wake_batch = sbq_calc_wake_batch(sbq, depth);
     477           0 :         __sbitmap_queue_update_wake_batch(sbq, wake_batch);
     478           0 : }
     479             : 
     480           0 : void sbitmap_queue_recalculate_wake_batch(struct sbitmap_queue *sbq,
     481             :                                             unsigned int users)
     482             : {
     483             :         unsigned int wake_batch;
     484             :         unsigned int min_batch;
     485           0 :         unsigned int depth = (sbq->sb.depth + users - 1) / users;
     486             : 
     487           0 :         min_batch = sbq->sb.depth >= (4 * SBQ_WAIT_QUEUES) ? 4 : 1;
     488             : 
     489           0 :         wake_batch = clamp_val(depth / SBQ_WAIT_QUEUES,
     490             :                         min_batch, SBQ_WAKE_BATCH);
     491           0 :         __sbitmap_queue_update_wake_batch(sbq, wake_batch);
     492           0 : }
     493             : EXPORT_SYMBOL_GPL(sbitmap_queue_recalculate_wake_batch);
     494             : 
     495           0 : void sbitmap_queue_resize(struct sbitmap_queue *sbq, unsigned int depth)
     496             : {
     497           0 :         sbitmap_queue_update_wake_batch(sbq, depth);
     498           0 :         sbitmap_resize(&sbq->sb, depth);
     499           0 : }
     500             : EXPORT_SYMBOL_GPL(sbitmap_queue_resize);
     501             : 
     502           0 : int __sbitmap_queue_get(struct sbitmap_queue *sbq)
     503             : {
     504           0 :         return sbitmap_get(&sbq->sb);
     505             : }
     506             : EXPORT_SYMBOL_GPL(__sbitmap_queue_get);
     507             : 
     508           0 : unsigned long __sbitmap_queue_get_batch(struct sbitmap_queue *sbq, int nr_tags,
     509             :                                         unsigned int *offset)
     510             : {
     511           0 :         struct sbitmap *sb = &sbq->sb;
     512             :         unsigned int hint, depth;
     513             :         unsigned long index, nr;
     514             :         int i;
     515             : 
     516           0 :         if (unlikely(sb->round_robin))
     517             :                 return 0;
     518             : 
     519           0 :         depth = READ_ONCE(sb->depth);
     520           0 :         hint = update_alloc_hint_before_get(sb, depth);
     521             : 
     522           0 :         index = SB_NR_TO_INDEX(sb, hint);
     523             : 
     524           0 :         for (i = 0; i < sb->map_nr; i++) {
     525           0 :                 struct sbitmap_word *map = &sb->map[index];
     526             :                 unsigned long get_mask;
     527           0 :                 unsigned int map_depth = __map_depth(sb, index);
     528             : 
     529           0 :                 sbitmap_deferred_clear(map);
     530           0 :                 if (map->word == (1UL << (map_depth - 1)) - 1)
     531           0 :                         continue;
     532             : 
     533           0 :                 nr = find_first_zero_bit(&map->word, map_depth);
     534           0 :                 if (nr + nr_tags <= map_depth) {
     535           0 :                         atomic_long_t *ptr = (atomic_long_t *) &map->word;
     536           0 :                         int map_tags = min_t(int, nr_tags, map_depth);
     537             :                         unsigned long val, ret;
     538             : 
     539           0 :                         get_mask = ((1UL << map_tags) - 1) << nr;
     540             :                         do {
     541           0 :                                 val = READ_ONCE(map->word);
     542           0 :                                 ret = atomic_long_cmpxchg(ptr, val, get_mask | val);
     543           0 :                         } while (ret != val);
     544           0 :                         get_mask = (get_mask & ~ret) >> nr;
     545           0 :                         if (get_mask) {
     546           0 :                                 *offset = nr + (index << sb->shift);
     547           0 :                                 update_alloc_hint_after_get(sb, depth, hint,
     548           0 :                                                         *offset + map_tags - 1);
     549           0 :                                 return get_mask;
     550             :                         }
     551             :                 }
     552             :                 /* Jump to next index. */
     553           0 :                 if (++index >= sb->map_nr)
     554           0 :                         index = 0;
     555             :         }
     556             : 
     557             :         return 0;
     558             : }
     559             : 
     560           0 : int sbitmap_queue_get_shallow(struct sbitmap_queue *sbq,
     561             :                               unsigned int shallow_depth)
     562             : {
     563           0 :         WARN_ON_ONCE(shallow_depth < sbq->min_shallow_depth);
     564             : 
     565           0 :         return sbitmap_get_shallow(&sbq->sb, shallow_depth);
     566             : }
     567             : EXPORT_SYMBOL_GPL(sbitmap_queue_get_shallow);
     568             : 
     569           0 : void sbitmap_queue_min_shallow_depth(struct sbitmap_queue *sbq,
     570             :                                      unsigned int min_shallow_depth)
     571             : {
     572           0 :         sbq->min_shallow_depth = min_shallow_depth;
     573           0 :         sbitmap_queue_update_wake_batch(sbq, sbq->sb.depth);
     574           0 : }
     575             : EXPORT_SYMBOL_GPL(sbitmap_queue_min_shallow_depth);
     576             : 
     577             : static struct sbq_wait_state *sbq_wake_ptr(struct sbitmap_queue *sbq)
     578             : {
     579             :         int i, wake_index;
     580             : 
     581           0 :         if (!atomic_read(&sbq->ws_active))
     582             :                 return NULL;
     583             : 
     584           0 :         wake_index = atomic_read(&sbq->wake_index);
     585           0 :         for (i = 0; i < SBQ_WAIT_QUEUES; i++) {
     586           0 :                 struct sbq_wait_state *ws = &sbq->ws[wake_index];
     587             : 
     588           0 :                 if (waitqueue_active(&ws->wait)) {
     589           0 :                         if (wake_index != atomic_read(&sbq->wake_index))
     590           0 :                                 atomic_set(&sbq->wake_index, wake_index);
     591             :                         return ws;
     592             :                 }
     593             : 
     594           0 :                 wake_index = sbq_index_inc(wake_index);
     595             :         }
     596             : 
     597             :         return NULL;
     598             : }
     599             : 
     600           0 : static bool __sbq_wake_up(struct sbitmap_queue *sbq)
     601             : {
     602             :         struct sbq_wait_state *ws;
     603             :         unsigned int wake_batch;
     604             :         int wait_cnt;
     605             : 
     606           0 :         ws = sbq_wake_ptr(sbq);
     607           0 :         if (!ws)
     608             :                 return false;
     609             : 
     610           0 :         wait_cnt = atomic_dec_return(&ws->wait_cnt);
     611           0 :         if (wait_cnt <= 0) {
     612             :                 int ret;
     613             : 
     614           0 :                 wake_batch = READ_ONCE(sbq->wake_batch);
     615             : 
     616             :                 /*
     617             :                  * Pairs with the memory barrier in sbitmap_queue_resize() to
     618             :                  * ensure that we see the batch size update before the wait
     619             :                  * count is reset.
     620             :                  */
     621           0 :                 smp_mb__before_atomic();
     622             : 
     623             :                 /*
     624             :                  * For concurrent callers of this, the one that failed the
     625             :                  * atomic_cmpxhcg() race should call this function again
     626             :                  * to wakeup a new batch on a different 'ws'.
     627             :                  */
     628           0 :                 ret = atomic_cmpxchg(&ws->wait_cnt, wait_cnt, wake_batch);
     629           0 :                 if (ret == wait_cnt) {
     630           0 :                         sbq_index_atomic_inc(&sbq->wake_index);
     631           0 :                         wake_up_nr(&ws->wait, wake_batch);
     632           0 :                         return false;
     633             :                 }
     634             : 
     635             :                 return true;
     636             :         }
     637             : 
     638             :         return false;
     639             : }
     640             : 
     641           0 : void sbitmap_queue_wake_up(struct sbitmap_queue *sbq)
     642             : {
     643           0 :         while (__sbq_wake_up(sbq))
     644             :                 ;
     645           0 : }
     646             : EXPORT_SYMBOL_GPL(sbitmap_queue_wake_up);
     647             : 
     648             : static inline void sbitmap_update_cpu_hint(struct sbitmap *sb, int cpu, int tag)
     649             : {
     650           0 :         if (likely(!sb->round_robin && tag < sb->depth))
     651           0 :                 data_race(*per_cpu_ptr(sb->alloc_hint, cpu) = tag);
     652             : }
     653             : 
     654           0 : void sbitmap_queue_clear_batch(struct sbitmap_queue *sbq, int offset,
     655             :                                 int *tags, int nr_tags)
     656             : {
     657           0 :         struct sbitmap *sb = &sbq->sb;
     658           0 :         unsigned long *addr = NULL;
     659           0 :         unsigned long mask = 0;
     660             :         int i;
     661             : 
     662           0 :         smp_mb__before_atomic();
     663           0 :         for (i = 0; i < nr_tags; i++) {
     664           0 :                 const int tag = tags[i] - offset;
     665             :                 unsigned long *this_addr;
     666             : 
     667             :                 /* since we're clearing a batch, skip the deferred map */
     668           0 :                 this_addr = &sb->map[SB_NR_TO_INDEX(sb, tag)].word;
     669           0 :                 if (!addr) {
     670             :                         addr = this_addr;
     671           0 :                 } else if (addr != this_addr) {
     672           0 :                         atomic_long_andnot(mask, (atomic_long_t *) addr);
     673           0 :                         mask = 0;
     674           0 :                         addr = this_addr;
     675             :                 }
     676           0 :                 mask |= (1UL << SB_NR_TO_BIT(sb, tag));
     677             :         }
     678             : 
     679           0 :         if (mask)
     680           0 :                 atomic_long_andnot(mask, (atomic_long_t *) addr);
     681             : 
     682           0 :         smp_mb__after_atomic();
     683           0 :         sbitmap_queue_wake_up(sbq);
     684           0 :         sbitmap_update_cpu_hint(&sbq->sb, raw_smp_processor_id(),
     685           0 :                                         tags[nr_tags - 1] - offset);
     686           0 : }
     687             : 
     688           0 : void sbitmap_queue_clear(struct sbitmap_queue *sbq, unsigned int nr,
     689             :                          unsigned int cpu)
     690             : {
     691             :         /*
     692             :          * Once the clear bit is set, the bit may be allocated out.
     693             :          *
     694             :          * Orders READ/WRITE on the associated instance(such as request
     695             :          * of blk_mq) by this bit for avoiding race with re-allocation,
     696             :          * and its pair is the memory barrier implied in __sbitmap_get_word.
     697             :          *
     698             :          * One invariant is that the clear bit has to be zero when the bit
     699             :          * is in use.
     700             :          */
     701           0 :         smp_mb__before_atomic();
     702           0 :         sbitmap_deferred_clear_bit(&sbq->sb, nr);
     703             : 
     704             :         /*
     705             :          * Pairs with the memory barrier in set_current_state() to ensure the
     706             :          * proper ordering of clear_bit_unlock()/waitqueue_active() in the waker
     707             :          * and test_and_set_bit_lock()/prepare_to_wait()/finish_wait() in the
     708             :          * waiter. See the comment on waitqueue_active().
     709             :          */
     710           0 :         smp_mb__after_atomic();
     711           0 :         sbitmap_queue_wake_up(sbq);
     712           0 :         sbitmap_update_cpu_hint(&sbq->sb, cpu, nr);
     713           0 : }
     714             : EXPORT_SYMBOL_GPL(sbitmap_queue_clear);
     715             : 
     716           0 : void sbitmap_queue_wake_all(struct sbitmap_queue *sbq)
     717             : {
     718             :         int i, wake_index;
     719             : 
     720             :         /*
     721             :          * Pairs with the memory barrier in set_current_state() like in
     722             :          * sbitmap_queue_wake_up().
     723             :          */
     724           0 :         smp_mb();
     725           0 :         wake_index = atomic_read(&sbq->wake_index);
     726           0 :         for (i = 0; i < SBQ_WAIT_QUEUES; i++) {
     727           0 :                 struct sbq_wait_state *ws = &sbq->ws[wake_index];
     728             : 
     729           0 :                 if (waitqueue_active(&ws->wait))
     730           0 :                         wake_up(&ws->wait);
     731             : 
     732           0 :                 wake_index = sbq_index_inc(wake_index);
     733             :         }
     734           0 : }
     735             : EXPORT_SYMBOL_GPL(sbitmap_queue_wake_all);
     736             : 
     737           0 : void sbitmap_queue_show(struct sbitmap_queue *sbq, struct seq_file *m)
     738             : {
     739             :         bool first;
     740             :         int i;
     741             : 
     742           0 :         sbitmap_show(&sbq->sb, m);
     743             : 
     744           0 :         seq_puts(m, "alloc_hint={");
     745           0 :         first = true;
     746           0 :         for_each_possible_cpu(i) {
     747           0 :                 if (!first)
     748           0 :                         seq_puts(m, ", ");
     749           0 :                 first = false;
     750           0 :                 seq_printf(m, "%u", *per_cpu_ptr(sbq->sb.alloc_hint, i));
     751             :         }
     752           0 :         seq_puts(m, "}\n");
     753             : 
     754           0 :         seq_printf(m, "wake_batch=%u\n", sbq->wake_batch);
     755           0 :         seq_printf(m, "wake_index=%d\n", atomic_read(&sbq->wake_index));
     756           0 :         seq_printf(m, "ws_active=%d\n", atomic_read(&sbq->ws_active));
     757             : 
     758           0 :         seq_puts(m, "ws={\n");
     759           0 :         for (i = 0; i < SBQ_WAIT_QUEUES; i++) {
     760           0 :                 struct sbq_wait_state *ws = &sbq->ws[i];
     761             : 
     762           0 :                 seq_printf(m, "\t{.wait_cnt=%d, .wait=%s},\n",
     763           0 :                            atomic_read(&ws->wait_cnt),
     764           0 :                            waitqueue_active(&ws->wait) ? "active" : "inactive");
     765             :         }
     766           0 :         seq_puts(m, "}\n");
     767             : 
     768           0 :         seq_printf(m, "round_robin=%d\n", sbq->sb.round_robin);
     769           0 :         seq_printf(m, "min_shallow_depth=%u\n", sbq->min_shallow_depth);
     770           0 : }
     771             : EXPORT_SYMBOL_GPL(sbitmap_queue_show);
     772             : 
     773           0 : void sbitmap_add_wait_queue(struct sbitmap_queue *sbq,
     774             :                             struct sbq_wait_state *ws,
     775             :                             struct sbq_wait *sbq_wait)
     776             : {
     777           0 :         if (!sbq_wait->sbq) {
     778           0 :                 sbq_wait->sbq = sbq;
     779           0 :                 atomic_inc(&sbq->ws_active);
     780           0 :                 add_wait_queue(&ws->wait, &sbq_wait->wait);
     781             :         }
     782           0 : }
     783             : EXPORT_SYMBOL_GPL(sbitmap_add_wait_queue);
     784             : 
     785           0 : void sbitmap_del_wait_queue(struct sbq_wait *sbq_wait)
     786             : {
     787           0 :         list_del_init(&sbq_wait->wait.entry);
     788           0 :         if (sbq_wait->sbq) {
     789           0 :                 atomic_dec(&sbq_wait->sbq->ws_active);
     790           0 :                 sbq_wait->sbq = NULL;
     791             :         }
     792           0 : }
     793             : EXPORT_SYMBOL_GPL(sbitmap_del_wait_queue);
     794             : 
     795           0 : void sbitmap_prepare_to_wait(struct sbitmap_queue *sbq,
     796             :                              struct sbq_wait_state *ws,
     797             :                              struct sbq_wait *sbq_wait, int state)
     798             : {
     799           0 :         if (!sbq_wait->sbq) {
     800           0 :                 atomic_inc(&sbq->ws_active);
     801           0 :                 sbq_wait->sbq = sbq;
     802             :         }
     803           0 :         prepare_to_wait_exclusive(&ws->wait, &sbq_wait->wait, state);
     804           0 : }
     805             : EXPORT_SYMBOL_GPL(sbitmap_prepare_to_wait);
     806             : 
     807           0 : void sbitmap_finish_wait(struct sbitmap_queue *sbq, struct sbq_wait_state *ws,
     808             :                          struct sbq_wait *sbq_wait)
     809             : {
     810           0 :         finish_wait(&ws->wait, &sbq_wait->wait);
     811           0 :         if (sbq_wait->sbq) {
     812           0 :                 atomic_dec(&sbq->ws_active);
     813           0 :                 sbq_wait->sbq = NULL;
     814             :         }
     815           0 : }
     816             : EXPORT_SYMBOL_GPL(sbitmap_finish_wait);

Generated by: LCOV version 1.14