[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 04/10] 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> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Wei Liu <wl@xxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> CC: Julien Grall <julien.grall@xxxxxxx> CC: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx> v3: * New --- 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 efa437c7df..77e649d065 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -878,7 +878,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..478ec66e5b 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 *dst) +{ + return test_bit(cpumask_check(cpu), dst->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) -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |