*参照元 [#m62aa080]
#backlinks

*説明 [#vcd067d0]
-パス: [[linux-4.4.1/lib/bitmap.c]]

-FIXME: これは何?
--説明


**引数 [#ve3c9b5c]
-unsigned long *bitmap
--
-unsigned int pos
--
-int order
--
-int reg_op
--


**返り値 [#z491f938]
-int
--


**参考 [#u79c50fc]


*実装 [#oae25ad7]

 enum {
         REG_OP_ISFREE,          /* true if region is all zero bits */
         REG_OP_ALLOC,           /* set all bits in region */
         REG_OP_RELEASE,         /* clear all bits in region */
 };
 
 static int __reg_op(unsigned long *bitmap, unsigned int pos, int order, int reg_op)
 {
         int nbits_reg;          /* number of bits in region */
         int index;              /* index first long of region in bitmap */
         int offset;             /* bit offset region in bitmap[index] */
         int nlongs_reg;         /* num longs spanned by region in bitmap */
         int nbitsinlong;        /* num bits of region in each spanned long */
         unsigned long mask;     /* bitmask for one long of region */
         int i;                  /* scans bitmap by longs */
         int ret = 0;            /* return value */
 
         /*
          * Either nlongs_reg == 1 (for small orders that fit in one long)
          * or (offset == 0 && mask == ~0UL) (for larger multiword orders.)
          */
         nbits_reg = 1 << order;
         index = pos / BITS_PER_LONG;
         offset = pos - (index * BITS_PER_LONG);
         nlongs_reg = BITS_TO_LONGS(nbits_reg);
         nbitsinlong = min(nbits_reg,  BITS_PER_LONG);
 
-
--[[linux-4.4.1/BITS_PER_LONG]]

         /*
          * Can't do "mask = (1UL << nbitsinlong) - 1", as that
          * overflows if nbitsinlong == BITS_PER_LONG.
          */
         mask = (1UL << (nbitsinlong - 1));
         mask += mask - 1;
         mask <<= offset;
 
         switch (reg_op) {
         case REG_OP_ISFREE:
                 for (i = 0; i < nlongs_reg; i++) {
                         if (bitmap[index + i] & mask)
                                 goto done;
                 }
                 ret = 1;        /* all bits in region free (zero) */
                 break;
 
         case REG_OP_ALLOC:
                 for (i = 0; i < nlongs_reg; i++)
                         bitmap[index + i] |= mask;
                 break;
 
         case REG_OP_RELEASE:
                 for (i = 0; i < nlongs_reg; i++)
                         bitmap[index + i] &= ~mask;
                 break;
         }
 done:
         return ret;
 }


*コメント [#m2f48ff5]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS