Commit ba475b8d authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

bitmap -- Add few helpers for bits manipulations

Grabbed from kernel. Probably worth to gather
all bits manipulators here in future.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 03b217c0
...@@ -48,6 +48,7 @@ obj-y += fsnotify.o ...@@ -48,6 +48,7 @@ obj-y += fsnotify.o
obj-y += irmap.o obj-y += irmap.o
obj-y += signalfd.o obj-y += signalfd.o
obj-y += pstree.o obj-y += pstree.o
obj-y += bitmap.o
obj-y += protobuf.o obj-y += protobuf.o
obj-y += protobuf-desc.o obj-y += protobuf-desc.o
obj-y += tty.o obj-y += tty.o
......
#include "asm/bitsperlong.h"
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
#define BITMAP_FIRST_WORD_MASK(start) (~0ul << ((start) % BITS_PER_LONG))
#define BITMAP_LAST_WORD_MASK(nbits) \
( \
((nbits) % BITS_PER_LONG) ? \
(1ul << ((nbits) % BITS_PER_LONG)) - 1 : ~0ul \
)
#define small_const_nbits(nbits) \
(__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
void bitmap_set(unsigned long *map, int start, int nr)
{
unsigned long *p = map + BIT_WORD(start);
const int size = start + nr;
int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
while (nr - bits_to_set >= 0) {
*p |= mask_to_set;
nr -= bits_to_set;
bits_to_set = BITS_PER_LONG;
mask_to_set = ~0UL;
p++;
}
if (nr) {
mask_to_set &= BITMAP_LAST_WORD_MASK(size);
*p |= mask_to_set;
}
}
void bitmap_clear(unsigned long *map, int start, int nr)
{
unsigned long *p = map + BIT_WORD(start);
const int size = start + nr;
int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
while (nr - bits_to_clear >= 0) {
*p &= ~mask_to_clear;
nr -= bits_to_clear;
bits_to_clear = BITS_PER_LONG;
mask_to_clear = ~0UL;
p++;
}
if (nr) {
mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
*p &= ~mask_to_clear;
}
}
#ifndef __CR_BITMAP_H__
#define __CR_BITMAP_H__
extern void bitmap_set(unsigned long *map, int start, int nr);
extern void bitmap_clear(unsigned long *map, int start, int nr);
#endif /* __CR_BITMAP_H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment