LCOV - code coverage report
Current view: top level - fs/xfs/libxfs - xfs_bit.c (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsa @ Mon Jul 31 20:08:27 PDT 2023 Lines: 49 49 100.0 %
Date: 2023-07-31 20:08:27 Functions: 3 3 100.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
       4             :  * All Rights Reserved.
       5             :  */
       6             : #include "xfs.h"
       7             : #include "xfs_log_format.h"
       8             : #include "xfs_bit.h"
       9             : 
      10             : /*
      11             :  * XFS bit manipulation routines, used in non-realtime code.
      12             :  */
      13             : 
      14             : /*
      15             :  * Return whether bitmap is empty.
      16             :  * Size is number of words in the bitmap, which is padded to word boundary
      17             :  * Returns 1 for empty, 0 for non-empty.
      18             :  */
      19             : int
      20  2538099831 : xfs_bitmap_empty(uint *map, uint size)
      21             : {
      22  2538099831 :         uint i;
      23             : 
      24  2622593652 :         for (i = 0; i < size; i++) {
      25  2550857358 :                 if (map[i] != 0)
      26             :                         return 0;
      27             :         }
      28             : 
      29             :         return 1;
      30             : }
      31             : 
      32             : /*
      33             :  * Count the number of contiguous bits set in the bitmap starting with bit
      34             :  * start_bit.  Size is the size of the bitmap in words.
      35             :  */
      36             : int
      37  7087320922 : xfs_contig_bits(uint *map, uint size, uint start_bit)
      38             : {
      39  7087320922 :         uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT);
      40  7087320922 :         uint result = 0;
      41  7087320922 :         uint tmp;
      42             : 
      43  7087320922 :         size <<= BIT_TO_WORD_SHIFT;
      44             : 
      45  7087320922 :         ASSERT(start_bit < size);
      46  7087320922 :         size -= start_bit & ~(NBWORD - 1);
      47  7087320922 :         start_bit &= (NBWORD - 1);
      48  7087320922 :         if (start_bit) {
      49  2847685490 :                 tmp = *p++;
      50             :                 /* set to one first offset bits prior to start */
      51  2847685490 :                 tmp |= (~0U >> (NBWORD-start_bit));
      52  2847685490 :                 if (tmp != ~0U)
      53  2495553473 :                         goto found;
      54   352132017 :                 result += NBWORD;
      55   352132017 :                 size -= NBWORD;
      56             :         }
      57  5918405106 :         while (size) {
      58  4408918952 :                 if ((tmp = *p++) != ~0U)
      59  3082281295 :                         goto found;
      60  1326637657 :                 result += NBWORD;
      61  1326637657 :                 size -= NBWORD;
      62             :         }
      63  1509486154 :         return result - start_bit;
      64  5577834768 : found:
      65  5577834768 :         return result + ffz(tmp) - start_bit;
      66             : }
      67             : 
      68             : /*
      69             :  * This takes the bit number to start looking from and
      70             :  * returns the next set bit from there.  It returns -1
      71             :  * if there are no more bits set or the start bit is
      72             :  * beyond the end of the bitmap.
      73             :  *
      74             :  * Size is the number of words, not bytes, in the bitmap.
      75             :  */
      76 84875373133 : int xfs_next_bit(uint *map, uint size, uint start_bit)
      77             : {
      78 84875373133 :         uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT);
      79 84875373133 :         uint result = start_bit & ~(NBWORD - 1);
      80 84875373133 :         uint tmp;
      81             : 
      82 84875373133 :         size <<= BIT_TO_WORD_SHIFT;
      83             : 
      84 84875373133 :         if (start_bit >= size)
      85             :                 return -1;
      86 83168420759 :         size -= result;
      87 83168420759 :         start_bit &= (NBWORD - 1);
      88 83168420759 :         if (start_bit) {
      89 70727122252 :                 tmp = *p++;
      90             :                 /* set to zero first offset bits prior to start */
      91 70727122252 :                 tmp &= (~0U << start_bit);
      92 70727122252 :                 if (tmp != 0U)
      93 59838295194 :                         goto found;
      94 10888827058 :                 result += NBWORD;
      95 10888827058 :                 size -= NBWORD;
      96             :         }
      97 23479988226 :         while (size) {
      98 12717479345 :                 if ((tmp = *p++) != 0U)
      99 12567616684 :                         goto found;
     100   149862661 :                 result += NBWORD;
     101   149862661 :                 size -= NBWORD;
     102             :         }
     103             :         return -1;
     104 72405911878 : found:
     105 72405911878 :         return result + ffs(tmp) - 1;
     106             : }

Generated by: LCOV version 1.14