|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] xen/mask: Convert {cpu, node}mask_test() to be static inline
commit da34ef393a0d8df486b246a27885d90d3912cfeb
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Tue Jun 25 10:48:22 2019 +0100
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Wed Jul 31 14:18:45 2019 +0100
xen/mask: Convert {cpu,node}mask_test() to be static inline
The buggy version of GCC isn't supported by Xen, so reimplement the helpers
with type checking, using Xen's latest type expectations.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/srat.c | 2 +-
xen/common/page_alloc.c | 2 +-
xen/include/xen/cpumask.h | 18 +++++-------------
xen/include/xen/nodemask.h | 18 +++++++-----------
4 files changed, 14 insertions(+), 26 deletions(-)
diff --git a/xen/arch/x86/srat.c b/xen/arch/x86/srat.c
index 47a4267220..506a56d66b 100644
--- a/xen/arch/x86/srat.c
+++ b/xen/arch/x86/srat.c
@@ -495,7 +495,7 @@ int __init acpi_scan_nodes(u64 start, u64 end)
for (i = 0; i < nr_cpu_ids; i++) {
if (cpu_to_node[i] == NUMA_NO_NODE)
continue;
- if (!node_isset(cpu_to_node[i], processor_nodes_parsed))
+ if (!nodemask_test(cpu_to_node[i], &processor_nodes_parsed))
numa_set_node(i, NUMA_NO_NODE);
}
numa_init_array();
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 4b16ef0d54..b29c070c3d 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -887,7 +887,7 @@ static struct page_info *get_free_buddy(unsigned int
zone_lo,
return NULL;
/* Pick next node. */
- if ( !node_isset(node, nodemask) )
+ if ( !nodemask_test(node, &nodemask) )
{
/* Very first node may be caller-specified and outside nodemask. */
ASSERT(!nodemask_retry);
diff --git a/xen/include/xen/cpumask.h b/xen/include/xen/cpumask.h
index 9448f5c6f8..ae902275c8 100644
--- a/xen/include/xen/cpumask.h
+++ b/xen/include/xen/cpumask.h
@@ -14,7 +14,7 @@
* void cpumask_clear_cpu(cpu, mask) turn off bit 'cpu' in mask
* void cpumask_setall(mask) set all bits
* void cpumask_clear(mask) clear all bits
- * int cpumask_test_cpu(cpu, mask) true iff bit 'cpu' set in mask
+ * bool cpumask_test_cpu(cpu, mask) true iff bit 'cpu' set in mask
* int cpumask_test_and_set_cpu(cpu, mask) test and set bit 'cpu' in mask
* int cpumask_test_and_clear_cpu(cpu, mask) test and clear bit 'cpu' in mask
*
@@ -53,15 +53,6 @@
* for_each_possible_cpu(cpu) for-loop cpu over cpu_possible_map
* for_each_online_cpu(cpu) for-loop cpu over cpu_online_map
* for_each_present_cpu(cpu) for-loop cpu over cpu_present_map
- *
- * Subtlety:
- * 1) The 'type-checked' form of cpumask_test_cpu() causes gcc (3.3.2, anyway)
- * to generate slightly worse code. Note for example the additional
- * 40 lines of assembly code compiling the "for each possible cpu"
- * loops buried in the disk_stat_read() macros calls when compiling
- * drivers/block/genhd.c (arch i386, CONFIG_SMP=y). So use a simple
- * one-line #define for cpumask_test_cpu(), instead of wrapping an inline
- * inside a macro, the way we do the other calls.
*/
#include <xen/bitmap.h>
@@ -117,9 +108,10 @@ static inline void cpumask_clear(cpumask_t *dstp)
bitmap_zero(dstp->bits, nr_cpumask_bits);
}
-/* No static inline type checking - see Subtlety (1) above. */
-#define cpumask_test_cpu(cpu, cpumask) \
- test_bit(cpumask_check(cpu), (cpumask)->bits)
+static inline bool cpumask_test_cpu(unsigned int cpu, const cpumask_t *src)
+{
+ return test_bit(cpumask_check(cpu), src->bits);
+}
static inline int cpumask_test_and_set_cpu(int cpu, volatile cpumask_t *addr)
{
diff --git a/xen/include/xen/nodemask.h b/xen/include/xen/nodemask.h
index c28dd3c768..7ab8b794c6 100644
--- a/xen/include/xen/nodemask.h
+++ b/xen/include/xen/nodemask.h
@@ -14,7 +14,7 @@
* void node_clear(node, mask) turn off bit 'node' in mask
* void nodes_setall(mask) set all bits
* void nodes_clear(mask) clear all bits
- * int node_isset(node, mask) true iff bit 'node' set in mask
+ * bool nodemask_test(node, mask) true iff bit 'node' set in mask
* int node_test_and_set(node, mask) test and set bit 'node' in mask
*
* void nodes_and(dst, src1, src2) dst = src1 & src2 [intersection]
@@ -45,18 +45,12 @@
*
* int num_online_nodes() Number of online Nodes
*
- * int node_online(node) Is some node online?
+ * bool node_online(node) Is this node online?
*
* node_set_online(node) set bit 'node' in node_online_map
* node_set_offline(node) clear bit 'node' in node_online_map
*
* for_each_online_node(node) for-loop node over node_online_map
- *
- * Subtlety:
- * 1) The 'type-checked' form of node_isset() causes gcc (3.3.2, anyway)
- * to generate slightly worse code. So use a simple one-line #define
- * for node_isset(), instead of wrapping an inline inside a macro, the
- * way we do the other calls.
*/
#include <xen/kernel.h>
@@ -90,8 +84,10 @@ static inline void __nodes_clear(nodemask_t *dstp, int nbits)
bitmap_zero(dstp->bits, nbits);
}
-/* No static inline type checking - see Subtlety (1) above. */
-#define node_isset(node, nodemask) test_bit((node), (nodemask).bits)
+static inline bool nodemask_test(unsigned int node, const nodemask_t *dst)
+{
+ return test_bit(node, dst->bits);
+}
#define node_test_and_set(node, nodemask) \
__node_test_and_set((node), &(nodemask))
@@ -276,7 +272,7 @@ extern nodemask_t node_online_map;
#if MAX_NUMNODES > 1
#define num_online_nodes() nodes_weight(node_online_map)
-#define node_online(node) node_isset((node), node_online_map)
+#define node_online(node) nodemask_test(node, &node_online_map)
#else
#define num_online_nodes() 1
#define node_online(node) ((node) == 0)
--
generated by git-patchbot for /home/xen/git/xen.git#staging
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |