diff options
| -rw-r--r-- | bitops.h | 26 | ||||
| -rwxr-xr-x | configure | 33 | ||||
| -rw-r--r-- | cpus.c | 3 | ||||
| -rw-r--r-- | hw/pc.c | 3 | ||||
| -rw-r--r-- | sysemu.h | 3 | ||||
| -rw-r--r-- | vl.c | 43 |
6 files changed, 56 insertions, 55 deletions
diff --git a/bitops.h b/bitops.h index c45623245f..74e14e5724 100644 --- a/bitops.h +++ b/bitops.h @@ -114,10 +114,10 @@ static inline unsigned long ffz(unsigned long word) * @nr: the bit to set * @addr: the address to start counting from */ -static inline void set_bit(int nr, volatile unsigned long *addr) +static inline void set_bit(int nr, unsigned long *addr) { unsigned long mask = BIT_MASK(nr); - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long *p = addr + BIT_WORD(nr); *p |= mask; } @@ -127,10 +127,10 @@ static inline void set_bit(int nr, volatile unsigned long *addr) * @nr: Bit to clear * @addr: Address to start counting from */ -static inline void clear_bit(int nr, volatile unsigned long *addr) +static inline void clear_bit(int nr, unsigned long *addr) { unsigned long mask = BIT_MASK(nr); - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long *p = addr + BIT_WORD(nr); *p &= ~mask; } @@ -140,10 +140,10 @@ static inline void clear_bit(int nr, volatile unsigned long *addr) * @nr: Bit to change * @addr: Address to start counting from */ -static inline void change_bit(int nr, volatile unsigned long *addr) +static inline void change_bit(int nr, unsigned long *addr) { unsigned long mask = BIT_MASK(nr); - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long *p = addr + BIT_WORD(nr); *p ^= mask; } @@ -153,10 +153,10 @@ static inline void change_bit(int nr, volatile unsigned long *addr) * @nr: Bit to set * @addr: Address to count from */ -static inline int test_and_set_bit(int nr, volatile unsigned long *addr) +static inline int test_and_set_bit(int nr, unsigned long *addr) { unsigned long mask = BIT_MASK(nr); - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long *p = addr + BIT_WORD(nr); unsigned long old = *p; *p = old | mask; @@ -168,10 +168,10 @@ static inline int test_and_set_bit(int nr, volatile unsigned long *addr) * @nr: Bit to clear * @addr: Address to count from */ -static inline int test_and_clear_bit(int nr, volatile unsigned long *addr) +static inline int test_and_clear_bit(int nr, unsigned long *addr) { unsigned long mask = BIT_MASK(nr); - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long *p = addr + BIT_WORD(nr); unsigned long old = *p; *p = old & ~mask; @@ -183,10 +183,10 @@ static inline int test_and_clear_bit(int nr, volatile unsigned long *addr) * @nr: Bit to change * @addr: Address to count from */ -static inline int test_and_change_bit(int nr, volatile unsigned long *addr) +static inline int test_and_change_bit(int nr, unsigned long *addr) { unsigned long mask = BIT_MASK(nr); - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long *p = addr + BIT_WORD(nr); unsigned long old = *p; *p = old ^ mask; @@ -198,7 +198,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr) * @nr: bit number to test * @addr: Address to start counting from */ -static inline int test_bit(int nr, const volatile unsigned long *addr) +static inline int test_bit(int nr, const unsigned long *addr) { return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); } diff --git a/configure b/configure index 3ca13a6ce1..280726c3f8 100755 --- a/configure +++ b/configure @@ -1396,8 +1396,8 @@ EOF xen=no # Xen unstable - elif ( - cat > $TMPC <<EOF + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xenstore.h> #include <stdint.h> @@ -1417,12 +1417,12 @@ int main(void) { } EOF compile_prog "" "$xen_libs" - ) ; then + then xen_ctrl_version=420 xen=yes - elif ( - cat > $TMPC <<EOF + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xs.h> #include <stdint.h> @@ -1431,9 +1431,8 @@ EOF # error HVM_MAX_VCPUS not defined #endif int main(void) { - xc_interface *xc; xs_daemon_open(); - xc = xc_interface_open(0, 0, 0); + xc_interface_open(0, 0, 0); xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); xc_gnttab_open(NULL, 0); xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0); @@ -1441,13 +1440,13 @@ int main(void) { } EOF compile_prog "" "$xen_libs" - ) ; then + then xen_ctrl_version=410 xen=yes # Xen 4.0.0 - elif ( - cat > $TMPC <<EOF + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xs.h> #include <stdint.h> @@ -1468,13 +1467,13 @@ int main(void) { } EOF compile_prog "" "$xen_libs" - ) ; then + then xen_ctrl_version=400 xen=yes # Xen 3.4.0 - elif ( - cat > $TMPC <<EOF + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xs.h> int main(void) { @@ -1490,13 +1489,13 @@ int main(void) { } EOF compile_prog "" "$xen_libs" - ) ; then + then xen_ctrl_version=340 xen=yes # Xen 3.3.0 - elif ( - cat > $TMPC <<EOF + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xs.h> int main(void) { @@ -1508,7 +1507,7 @@ int main(void) { } EOF compile_prog "" "$xen_libs" - ) ; then + then xen_ctrl_version=330 xen=yes diff --git a/cpus.c b/cpus.c index b61f60eb95..3de2e27f41 100644 --- a/cpus.c +++ b/cpus.c @@ -36,6 +36,7 @@ #include "cpus.h" #include "qtest.h" #include "main-loop.h" +#include "bitmap.h" #ifndef _WIN32 #include "compatfd.h" @@ -1159,7 +1160,7 @@ void set_numa_modes(void) for (env = first_cpu; env != NULL; env = env->next_cpu) { for (i = 0; i < nb_numa_nodes; i++) { - if (node_cpumask[i] & (1 << env->cpu_index)) { + if (test_bit(env->cpu_index, node_cpumask[i])) { env->numa_node = i; } } diff --git a/hw/pc.c b/hw/pc.c index bd193f3333..81c391cd6a 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -49,6 +49,7 @@ #include "memory.h" #include "exec-memory.h" #include "arch_init.h" +#include "bitmap.h" /* output Bochs bios info messages */ //#define DEBUG_BIOS @@ -625,7 +626,7 @@ static void *bochs_bios_init(void) numa_fw_cfg[0] = cpu_to_le64(nb_numa_nodes); for (i = 0; i < max_cpus; i++) { for (j = 0; j < nb_numa_nodes; j++) { - if (node_cpumask[j] & (1 << i)) { + if (test_bit(i, node_cpumask[j])) { numa_fw_cfg[i + 1] = cpu_to_le64(j); break; } diff --git a/sysemu.h b/sysemu.h index 6540c7912f..4669348a12 100644 --- a/sysemu.h +++ b/sysemu.h @@ -134,9 +134,10 @@ extern uint8_t qemu_extra_params_fw[2]; extern QEMUClock *rtc_clock; #define MAX_NODES 64 +#define MAX_CPUMASK_BITS 255 extern int nb_numa_nodes; extern uint64_t node_mem[MAX_NODES]; -extern uint64_t node_cpumask[MAX_NODES]; +extern unsigned long *node_cpumask[MAX_NODES]; #define MAX_OPTION_ROMS 16 typedef struct QEMUOptionRom { diff --git a/vl.c b/vl.c index 6d2ce45fef..e71cb30ecf 100644 --- a/vl.c +++ b/vl.c @@ -28,6 +28,7 @@ #include <errno.h> #include <sys/time.h> #include <zlib.h> +#include "bitmap.h" /* Needed early for CONFIG_BSD etc. */ #include "config-host.h" @@ -241,7 +242,7 @@ QTAILQ_HEAD(, FWBootEntry) fw_boot_order = QTAILQ_HEAD_INITIALIZER(fw_boot_order int nb_numa_nodes; uint64_t node_mem[MAX_NODES]; -uint64_t node_cpumask[MAX_NODES]; +unsigned long *node_cpumask[MAX_NODES]; uint8_t qemu_uuid[16]; @@ -952,6 +953,8 @@ static void numa_add(const char *optarg) unsigned long long value, endvalue; int nodenr; + value = endvalue = 0ULL; + optarg = get_opt_name(option, 128, optarg, ',') + 1; if (!strcmp(option, "node")) { if (get_param_value(option, 128, "nodeid", optarg) == 0) { @@ -971,27 +974,22 @@ static void numa_add(const char *optarg) } node_mem[nodenr] = sval; } - if (get_param_value(option, 128, "cpus", optarg) == 0) { - node_cpumask[nodenr] = 0; - } else { + if (get_param_value(option, 128, "cpus", optarg) != 0) { value = strtoull(option, &endptr, 10); - if (value >= 64) { - value = 63; - fprintf(stderr, "only 64 CPUs in NUMA mode supported.\n"); + if (*endptr == '-') { + endvalue = strtoull(endptr+1, &endptr, 10); } else { - if (*endptr == '-') { - endvalue = strtoull(endptr+1, &endptr, 10); - if (endvalue >= 63) { - endvalue = 62; - fprintf(stderr, - "only 63 CPUs in NUMA mode supported.\n"); - } - value = (2ULL << endvalue) - (1ULL << value); - } else { - value = 1ULL << value; - } + endvalue = value; + } + + if (!(endvalue < MAX_CPUMASK_BITS)) { + endvalue = MAX_CPUMASK_BITS - 1; + fprintf(stderr, + "A max of %d CPUs are supported in a guest\n", + MAX_CPUMASK_BITS); } - node_cpumask[nodenr] = value; + + bitmap_set(node_cpumask[nodenr], value, endvalue-value+1); } nb_numa_nodes++; } @@ -2331,7 +2329,7 @@ int main(int argc, char **argv, char **envp) for (i = 0; i < MAX_NODES; i++) { node_mem[i] = 0; - node_cpumask[i] = 0; + node_cpumask[i] = bitmap_new(MAX_CPUMASK_BITS); } nb_numa_nodes = 0; @@ -3468,8 +3466,9 @@ int main(int argc, char **argv, char **envp) } for (i = 0; i < nb_numa_nodes; i++) { - if (node_cpumask[i] != 0) + if (!bitmap_empty(node_cpumask[i], MAX_CPUMASK_BITS)) { break; + } } /* assigning the VCPUs round-robin is easier to implement, guest OSes * must cope with this anyway, because there are BIOSes out there in @@ -3477,7 +3476,7 @@ int main(int argc, char **argv, char **envp) */ if (i == nb_numa_nodes) { for (i = 0; i < max_cpus; i++) { - node_cpumask[i % nb_numa_nodes] |= 1 << i; + set_bit(i, node_cpumask[i % nb_numa_nodes]); } } } |