mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] nodemask_t definitions [1/7]
@ 2004-03-18 23:04 Matthew Dobson
  0 siblings, 0 replies; only message in thread
From: Matthew Dobson @ 2004-03-18 23:04 UTC (permalink / raw)
  To: linux-kernel, mbligh, akpm, wli, haveblue

[-- Attachment #1: Type: text/plain, Size: 369 bytes --]

nodemask_t-01-definitions.patch - The basic definitions of the
nodemask_t type: include/linux/nodemask.h,
include/asm-generic/{nodemask.h, nodemask_arith.h, nodemask_array.h,
nodemask_const_reference.h, nodemask_const_value.h, nodemask_nonuma.h},
and some small changes to include/linux/mmzone.h (removing extistant
definition of node_online_map and helper functions).

[-- Attachment #2: nodemask_t-01-definitions.patch --]
[-- Type: text/x-patch, Size: 14928 bytes --]

diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/asm-generic/nodemask.h linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask.h
--- linux-2.6.4-vanilla/include/asm-generic/nodemask.h	Wed Dec 31 16:00:00 1969
+++ linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask.h	Thu Mar 11 11:57:34 2004
@@ -0,0 +1,44 @@
+#ifndef __ASM_GENERIC_NODEMASK_H
+#define __ASM_GENERIC_NODEMASK_H
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/numa.h>
+#include <linux/types.h>
+#include <linux/bitmap.h>
+
+
+#if MAX_NUMNODES > BITS_PER_LONG
+
+#define NODE_ARRAY_SIZE		BITS_TO_LONGS(MAX_NUMNODES)
+struct nodemask
+{
+	unsigned long mask[NODE_ARRAY_SIZE];
+};
+typedef struct nodemask nodemask_t;
+
+#else /* MAX_NUMNODES <= BITS_PER_LONG */
+typedef unsigned long nodemask_t;
+#endif
+
+
+#ifdef CONFIG_NUMA
+
+#if MAX_NUMNODES > BITS_PER_LONG
+#include <asm-generic/nodemask_array.h>
+#else
+#include <asm-generic/nodemask_arith.h>
+#endif
+
+#else /* !CONFIG_NUMA */
+#include <asm-generic/nodemask_nonuma.h>
+#endif /* CONFIG_NUMA */
+
+
+#if MAX_NUMNODES <= 4*BITS_PER_LONG
+#include <asm-generic/nodemask_const_value.h>
+#else
+#include <asm-generic/nodemask_const_reference.h>
+#endif
+
+#endif /* __ASM_GENERIC_NODEMASK_H */
diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/asm-generic/nodemask_arith.h linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_arith.h
--- linux-2.6.4-vanilla/include/asm-generic/nodemask_arith.h	Wed Dec 31 16:00:00 1969
+++ linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_arith.h	Thu Mar 11 11:57:34 2004
@@ -0,0 +1,48 @@
+#ifndef __ASM_GENERIC_NODEMASK_ARITH_H
+#define __ASM_GENERIC_NODEMASK_ARITH_H
+
+/*
+ * Arithmetic-based node bitmaps. A single unsigned long is used to contain the
+ * whole node bitmap.
+ */
+
+#define node_set(node, map)		set_bit(node, &(map))
+#define node_clear(node, map)		clear_bit(node, &(map))
+#define node_isset(node, map)		test_bit(node, &(map))
+#define node_test_and_set(node, map)	test_and_set_bit(node, &(map))
+
+#define nodes_and(d, s1, s2)		do { d = (s1) & (s2); } while (0)
+#define nodes_or(d, s1, s2)		do { d = (s1) | (s2); } while (0)
+#define nodes_clear(map)		do { map = 0UL; } while (0)
+#define nodes_complement(map)		do { map = ~(map); } while (0)
+#define nodes_equal(map1, map2)		((map1) == (map2))
+#define nodes_empty(map)		((map) == 0UL)
+#define nodes_addr(map)			(&(map))
+
+#if BITS_PER_LONG == 32
+#define nodes_weight(map)		hweight32(map)
+#elif BITS_PER_LONG == 64
+#define nodes_weight(map)		hweight64(map)
+#endif
+
+#define nodes_shift_right(d, s, n)	do { d = (s) >> (n); } while (0)
+#define nodes_shift_left(d, s, n)	do { d = (s) << (n); } while (0)
+
+#define first_node(map)			__ffs(map)
+#define next_node(node, map)		find_next_bit(&(map), MAX_NUMNODES, node + 1)
+#define any_online_node(map)					\
+({								\
+	nodemask_t __tmp__;					\
+	nodes_and(__tmp__, map, node_online_map);		\
+	__tmp__ ? first_node(__tmp__) : MAX_NUMNODES;		\
+})
+#define nodemask_of_node(node)		({ ((nodemask_t)1) << (node); })
+
+/* only ever use this for things that are _never_ used on large boxen */
+#define nodes_coerce(map)		((unsigned long)(map))
+#define nodes_promote(map)		({ map; })
+
+#define NODE_MASK_ALL	(~((nodemask_t)0) >> (8*sizeof(nodemask_t) - MAX_NUMNODES))
+#define NODE_MASK_NONE	((nodemask_t)0)
+
+#endif /* __ASM_GENERIC_NODEMASK_ARITH_H */
diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/asm-generic/nodemask_array.h linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_array.h
--- linux-2.6.4-vanilla/include/asm-generic/nodemask_array.h	Wed Dec 31 16:00:00 1969
+++ linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_array.h	Thu Mar 11 11:57:34 2004
@@ -0,0 +1,51 @@
+#ifndef __ASM_GENERIC_NODEMASK_ARRAY_H
+#define __ASM_GENERIC_NODEMASK_ARRAY_H
+
+/*
+ * Array-based node bitmaps. An array of unsigned longs is used to contain
+ * the bitmap, and then contained in a structure so it may be passed by value.
+ */
+
+#define node_set(node, map)	set_bit(node, (map).mask)
+#define node_clear(node, map)	clear_bit(node, (map).mask)
+#define node_isset(node, map)	test_bit(node, (map).mask)
+#define node_test_and_set(node, map) test_and_set_bit(node, (map).mask)
+
+#define nodes_and(d,s1,s2)	bitmap_and((d).mask,(s1).mask, (s2).mask, MAX_NUMNODES)
+#define nodes_or(d,s1,s2)	bitmap_or((d).mask, (s1).mask, (s2).mask, MAX_NUMNODES)
+#define nodes_clear(map)	bitmap_clear((map).mask, MAX_NUMNODES)
+#define nodes_complement(map)	bitmap_complement((map).mask, MAX_NUMNODES)
+#define nodes_equal(map1, map2)	bitmap_equal((map1).mask, (map2).mask, MAX_NUMNODES)
+#define nodes_empty(map)	bitmap_empty((map).mask, MAX_NUMNODES)
+#define nodes_addr(map)		((map).mask)
+
+#define nodes_weight(map)	bitmap_weight((map).mask, MAX_NUMNODES)
+
+#define nodes_shift_right(d, s, n) bitmap_shift_right((d).mask, (s).mask, n, MAX_NUMNODES)
+#define nodes_shift_left(d, s, n)   bitmap_shift_left((d).mask, (s).mask, n, MAX_NUMNODES)
+
+#define first_node(map)		find_first_bit((map).mask, MAX_NUMNODES)
+#define next_node(node, map)	find_next_bit((map).mask, MAX_NUMNODES, node + 1)
+#define any_online_node(map)	({ nodemask_t __tmp__;				\
+				   nodes_and(__tmp__, map, node_online_map);	\
+				   find_first_bit(__tmp__.mask, MAX_NUMNODES);	\
+				})
+#define nodemask_of_node(node)	({ nodemask_t __node_mask = NODE_MASK_NONE;	\
+				   node_set(node, __node_mask);			\
+				   __node_mask;					\
+				})
+
+/* only ever use this for things that are _never_ used on large boxen */
+#define nodes_coerce(map)	((map).mask[0])
+#define nodes_promote(map)	({ nodemask_t __node_mask = NODE_MASK_NONE;	\
+				   __node_mask.mask[0] = map;			\
+				   __node_mask;					\
+				})
+
+/*
+ * um, these need to be usable as static initializers
+ */
+#define NODE_MASK_ALL	{ {[0 ... NODE_ARRAY_SIZE-1] = ~0UL} }
+#define NODE_MASK_NONE	{ {[0 ... NODE_ARRAY_SIZE-1] =  0UL} }
+
+#endif /* __ASM_GENERIC_NODEMASK_ARRAY_H */
diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/asm-generic/nodemask_const_reference.h linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_const_reference.h
--- linux-2.6.4-vanilla/include/asm-generic/nodemask_const_reference.h	Wed Dec 31 16:00:00 1969
+++ linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_const_reference.h	Thu Mar 11 11:57:34 2004
@@ -0,0 +1,27 @@
+#ifndef __ASM_GENERIC_NODEMASK_CONST_REFERENCE_H
+#define __ASM_GENERIC_NODEMASK_CONST_REFERENCE_H
+
+struct nodemask_ref {
+	const nodemask_t *val;
+};
+
+typedef const struct nodemask_ref nodemask_const_t;
+
+#define mk_nodemask_const(map)		((nodemask_const_t){ &(map) })
+#define node_isset_const(node, map)	node_isset(node, *(map).val)
+
+#define nodes_and_const(dst,src1,src2)	nodes_and(dst,*(src1).val,*(src2).val)
+#define nodes_or_const(dst,src1,src2)	nodes_or(dst,*(src1).val,*(src2).val)
+#define nodes_equal_const(map1, map2)	nodes_equal(*(map1).val, *(map2).val)
+#define nodes_copy_const(map1, map2)	bitmap_copy((map1).mask, (map2).val->mask, MAX_NUMNODES)
+
+#define nodes_empty_const(map)		nodes_empty(*(map).val)
+#define nodes_weight_const(map)		nodes_weight(*(map).val)
+#define first_node_const(map)		first_node(*(map).val)
+#define next_node_const(node, map)	next_node(node, *(map).val)
+
+/* only ever use this for things that are _never_ used on large boxen */
+#define nodes_coerce_const(map)		nodes_coerce(*(map).val)
+#define any_online_node_const(map)	any_online_node(*(map).val)
+
+#endif /* __ASM_GENERIC_NODEMASK_CONST_REFERENCE_H */
diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/asm-generic/nodemask_const_value.h linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_const_value.h
--- linux-2.6.4-vanilla/include/asm-generic/nodemask_const_value.h	Wed Dec 31 16:00:00 1969
+++ linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_const_value.h	Thu Mar 11 11:57:34 2004
@@ -0,0 +1,21 @@
+#ifndef __ASM_GENERIC_NODEMASK_CONST_VALUE_H
+#define __ASM_GENERIC_NODEMASK_CONST_VALUE_H
+
+typedef const nodemask_t nodemask_const_t;
+
+#define mk_nodemask_const(map)		(map)
+#define node_isset_const(node, map)	node_isset(node, map)
+#define nodes_and_const(dst,src1,src2)	nodes_and(dst, src1, src2)
+#define nodes_or_const(dst,src1,src2)	nodes_or(dst, src1, src2)
+#define nodes_equal_const(map1, map2)	nodes_equal(map1, map2)
+#define nodes_empty_const(map)		nodes_empty(map)
+#define nodes_copy_const(map1, map2)	do { map1 = (nodemask_t)map2; } while (0)
+#define nodes_weight_const(map)		nodes_weight(map)
+#define first_node_const(map)		first_node(map)
+#define next_node_const(node, map)	next_node(node, map)
+
+/* only ever use this for things that are _never_ used on large boxen */
+#define nodes_coerce_const(map)		nodes_coerce(map)
+#define any_online_node_const(map)	any_online_node(map)
+
+#endif /* __ASM_GENERIC_NODEMASK_CONST_VALUE_H */
diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/asm-generic/nodemask_nonuma.h linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_nonuma.h
--- linux-2.6.4-vanilla/include/asm-generic/nodemask_nonuma.h	Wed Dec 31 16:00:00 1969
+++ linux-2.6.4-nodemask_t-definitions/include/asm-generic/nodemask_nonuma.h	Thu Mar 11 11:57:34 2004
@@ -0,0 +1,47 @@
+#ifndef __ASM_GENERIC_NODEMASK_NONUMA_H
+#define __ASM_GENERIC_NODEMASK_NONUMA_H
+
+/*
+ * Arithmetic-based node bitmaps for non-NUMA systems. A single unsigned long
+ * is used, but only the first bit is ever set/cleared.
+ */
+
+#define node_set(node, map)		do { if ((node) == 0) map = 1UL; } while (0)
+#define node_clear(node, map)		do { if ((node) == 0) map = 0UL; } while (0)
+#define node_isset(node, map)		((node) == 0 && (map) != 0UL)
+#define node_test_and_set(node, map)	((node) == 0 ? test_and_set_bit(0, &(map)) : 0)
+
+#define nodes_and(d, s1, s2)		do { d = (s1) & (s2); } while (0)
+#define nodes_or(d, s1, s2)		do { d = (s1) | (s2); } while (0)
+#define nodes_clear(map)		do { map = 0UL; } while (0)
+#define nodes_complement(map)		do { map = !(map); } while (0)
+#define nodes_equal(map1, map2)		((map1) == (map2))
+#define nodes_empty(map)		((map) == 0UL)
+#define nodes_addr(map)			(&(map))
+
+#define nodes_weight(map)		((map) != 0UL ? 1 : 0)
+
+#define nodes_shift_right(d, s, n)	do { d = (n) == 0 ? (s) : 0UL; } while (0)
+#define nodes_shift_left(d, s, n)	do { d = (n) == 0 ? (s) : 0UL; } while (0)
+
+#define first_node(map)			(nodes_empty(map) ? MAX_NUMNODES : 0)
+#define next_node(node, map)		(MAX_NUMNODES)
+#define any_online_node(map)		(first_node(map))
+#define nodemask_of_node(node)		((node) == 0 ? 1UL : 0UL)
+
+/* only ever use this for things that are _never_ used on large boxen */
+#define nodes_coerce(map)		((unsigned long)(map))
+#define nodes_promote(map)					\
+	({							\
+		nodemask_t __tmp__;				\
+		nodes_coerce(__tmp__) = map;			\
+		__tmp__;					\
+	})
+
+/*
+ * um, these need to be usable as static initializers
+ */
+#define NODE_MASK_ALL	1UL
+#define NODE_MASK_NONE	0UL
+
+#endif /* __ASM_GENERIC_NODEMASK_NONUMA_H */
diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/linux/mmzone.h linux-2.6.4-nodemask_t-definitions/include/linux/mmzone.h
--- linux-2.6.4-vanilla/include/linux/mmzone.h	Wed Mar 10 18:55:28 2004
+++ linux-2.6.4-nodemask_t-definitions/include/linux/mmzone.h	Mon Mar 15 16:57:21 2004
@@ -11,6 +11,7 @@
 #include <linux/cache.h>
 #include <linux/threads.h>
 #include <linux/numa.h>
+#include <linux/nodemask.h>
 #include <asm/atomic.h>
 
 /* Free memory management - zoned buddy allocator.  */
@@ -218,7 +219,6 @@ typedef struct pglist_data {
 #define node_present_pages(nid)	(NODE_DATA(nid)->node_present_pages)
 #define node_spanned_pages(nid)	(NODE_DATA(nid)->node_spanned_pages)
 
-extern int numnodes;
 extern struct pglist_data *pgdat_list;
 
 void get_zone_counts(unsigned long *active, unsigned long *inactive,
@@ -336,35 +336,6 @@ extern struct pglist_data contig_page_da
 #error ZONES_SHIFT > MAX_ZONES_SHIFT
 #endif
 
-extern DECLARE_BITMAP(node_online_map, MAX_NUMNODES);
-
-#if defined(CONFIG_DISCONTIGMEM) || defined(CONFIG_NUMA)
-
-#define node_online(node)	test_bit(node, node_online_map)
-#define node_set_online(node)	set_bit(node, node_online_map)
-#define node_set_offline(node)	clear_bit(node, node_online_map)
-static inline unsigned int num_online_nodes(void)
-{
-	int i, num = 0;
-
-	for(i = 0; i < MAX_NUMNODES; i++){
-		if (node_online(i))
-			num++;
-	}
-	return num;
-}
-
-#else /* !CONFIG_DISCONTIGMEM && !CONFIG_NUMA */
-
-#define node_online(node) \
-	({ BUG_ON((node) != 0); test_bit(node, node_online_map); })
-#define node_set_online(node) \
-	({ BUG_ON((node) != 0); set_bit(node, node_online_map); })
-#define node_set_offline(node) \
-	({ BUG_ON((node) != 0); clear_bit(node, node_online_map); })
-#define num_online_nodes()	1
-
-#endif /* CONFIG_DISCONTIGMEM || CONFIG_NUMA */
 #endif /* !__ASSEMBLY__ */
 #endif /* __KERNEL__ */
 #endif /* _LINUX_MMZONE_H */
diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/linux/nodemask.h linux-2.6.4-nodemask_t-definitions/include/linux/nodemask.h
--- linux-2.6.4-vanilla/include/linux/nodemask.h	Wed Dec 31 16:00:00 1969
+++ linux-2.6.4-nodemask_t-definitions/include/linux/nodemask.h	Tue Mar 16 15:52:04 2004
@@ -0,0 +1,44 @@
+#ifndef __LINUX_NODEMASK_H
+#define __LINUX_NODEMASK_H
+
+#include <linux/numa.h>
+#include <linux/bitmap.h>
+#include <asm-generic/nodemask.h>
+#include <asm/bug.h>
+
+extern nodemask_t node_online_map;
+extern nodemask_t node_possible_map;
+
+#ifdef CONFIG_NUMA
+
+#define num_online_nodes()		nodes_weight(node_online_map)
+#define node_online(node)		node_isset(node, node_online_map)
+#define node_possible(node)		node_isset(node, node_possible_map)
+#define node_set_online(node)		node_set(node, node_online_map)
+#define node_set_offline(node)		node_clear(node, node_online_map)
+
+#else /* !CONFIG_NUMA */
+
+#define num_online_nodes()		(1)
+#define node_online(node)		({ BUG_ON((node) != 0); 1; })
+#define node_possible(node)		({ BUG_ON((node) != 0); 1; })
+#define node_set_online(node)		({ BUG_ON((node) != 0); })
+#define node_set_offline(node)		({ BUG(); })
+
+#endif /* CONFIG_NUMA */
+
+#define for_each_node_mask(node, mask)					\
+	for (node = first_node_const(mk_nodemask_const(mask));		\
+		node < MAX_NUMNODES;					\
+		node = next_node_const(node, mk_nodemask_const(mask)))
+
+#define for_each_node(node) 		for_each_node_mask(node, node_possible_map)
+#define for_each_online_node(node)	for_each_node_mask(node, node_online_map)
+
+#define nodemask_snprintf(buf, buflen, map)				\
+	bitmap_snprintf(buf, buflen, nodes_addr(map), MAX_NUMNODES)
+
+#define nodemask_parse(buf, buflen, map)				\
+	bitmap_parse(buf, buflen, nodes_addr(map), MAX_NUMNODES)
+
+#endif /* __LINUX_NODEMASK_H */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-03-18 23:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-03-18 23:04 [PATCH] nodemask_t definitions [1/7] Matthew Dobson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®