[CRIU] [PATCH 1/2] bitmap -- Add few helpers for bits manipulations

Cyrill Gorcunov gorcunov at openvz.org
Mon Nov 9 10:54:18 PST 2015


Grabbed from kernel. Probably worth to gather
all bits manipulators here in future.

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 Makefile.crtools |  1 +
 bitmap.c         | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/bitmap.h |  7 +++++++
 3 files changed, 62 insertions(+)
 create mode 100644 bitmap.c
 create mode 100644 include/bitmap.h

diff --git a/Makefile.crtools b/Makefile.crtools
index ea813e539430..847b11dafd15 100644
--- a/Makefile.crtools
+++ b/Makefile.crtools
@@ -48,6 +48,7 @@ obj-y	+= fsnotify.o
 obj-y	+= irmap.o
 obj-y	+= signalfd.o
 obj-y	+= pstree.o
+obj-y	+= bitmap.o
 obj-y	+= protobuf.o
 obj-y	+= protobuf-desc.o
 obj-y	+= tty.o
diff --git a/bitmap.c b/bitmap.c
new file mode 100644
index 000000000000..65a501e728cb
--- /dev/null
+++ b/bitmap.c
@@ -0,0 +1,54 @@
+#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;
+	}
+}
diff --git a/include/bitmap.h b/include/bitmap.h
new file mode 100644
index 000000000000..9e701b66cc2c
--- /dev/null
+++ b/include/bitmap.h
@@ -0,0 +1,7 @@
+#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__ */
-- 
2.4.3



More information about the CRIU mailing list