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-rc3-acha @ Mon Jul 31 20:08:06 PDT 2023 Lines: 49 49 100.0 %
Date: 2023-07-31 20:08:07 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  2192692255 : xfs_bitmap_empty(uint *map, uint size)
      21             : {
      22  2192692255 :         uint i;
      23             : 
      24  2271793265 :         for (i = 0; i < size; i++) {
      25  2206643357 :                 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  5302608773 : xfs_contig_bits(uint *map, uint size, uint start_bit)
      38             : {
      39  5302608773 :         uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT);
      40  5302608773 :         uint result = 0;
      41  5302608773 :         uint tmp;
      42             : 
      43  5302608773 :         size <<= BIT_TO_WORD_SHIFT;
      44             : 
      45  5302608773 :         ASSERT(start_bit < size);
      46  5302608773 :         size -= start_bit & ~(NBWORD - 1);
      47  5302608773 :         start_bit &= (NBWORD - 1);
      48  5302608773 :         if (start_bit) {
      49  1828445635 :                 tmp = *p++;
      50             :                 /* set to one first offset bits prior to start */
      51  1828445635 :                 tmp |= (~0U >> (NBWORD-start_bit));
      52  1828445635 :                 if (tmp != ~0U)
      53  1603637079 :                         goto found;
      54   224808556 :                 result += NBWORD;
      55   224808556 :                 size -= NBWORD;
      56             :         }
      57  4762202640 :         while (size) {
      58  3643353309 :                 if ((tmp = *p++) != ~0U)
      59  2580122363 :                         goto found;
      60  1063230946 :                 result += NBWORD;
      61  1063230946 :                 size -= NBWORD;
      62             :         }
      63  1118849331 :         return result - start_bit;
      64  4183759442 : found:
      65  4183759442 :         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 76347813730 : int xfs_next_bit(uint *map, uint size, uint start_bit)
      77             : {
      78 76347813730 :         uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT);
      79 76347813730 :         uint result = start_bit & ~(NBWORD - 1);
      80 76347813730 :         uint tmp;
      81             : 
      82 76347813730 :         size <<= BIT_TO_WORD_SHIFT;
      83             : 
      84 76347813730 :         if (start_bit >= size)
      85             :                 return -1;
      86 75118220094 :         size -= result;
      87 75118220094 :         start_bit &= (NBWORD - 1);
      88 75118220094 :         if (start_bit) {
      89 64143744277 :                 tmp = *p++;
      90             :                 /* set to zero first offset bits prior to start */
      91 64143744277 :                 tmp &= (~0U << start_bit);
      92 64143744277 :                 if (tmp != 0U)
      93 54230504829 :                         goto found;
      94  9913239448 :                 result += NBWORD;
      95  9913239448 :                 size -= NBWORD;
      96             :         }
      97 21030677848 :         while (size) {
      98 11265763638 :                 if ((tmp = *p++) != 0U)
      99 11122801055 :                         goto found;
     100   142962583 :                 result += NBWORD;
     101   142962583 :                 size -= NBWORD;
     102             :         }
     103             :         return -1;
     104 65353305884 : found:
     105 65353305884 :         return result + ffs(tmp) - 1;
     106             : }

Generated by: LCOV version 1.14