[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH][RFC] vl: move unrelated functions out of vl.c
From: |
li guang |
Subject: |
Re: [Qemu-devel] [PATCH][RFC] vl: move unrelated functions out of vl.c |
Date: |
Tue, 05 Mar 2013 08:30:35 +0800 |
Hi, Anthony
is it reasonable split?
在 2013-02-28四的 12:45 +0800,liguang写道:
> now, lots of other functions which were not related with
> mainloop exist in vl.c, e.g.
>
> numa related functions (numa_add() ...)
> bt related functions (bt_parse() ...)
> usb related functions (usb_parse() ...)
> gui related functions (gui_update())
> system power related functions (qemu_shutdown_requested() ...)
> ...
>
> they can all be moved out of vl.c by function,
> this patch is only a RFC patch, hope
> one can help to decide if I can continue
> to do clean up work.
>
> Signed-off-by: liguang <address@hidden>
> ---
> Makefile.objs | 2 +
> bt-opts.c | 200 ++++++++++++++++++++++++++++
> bt-opts.h | 13 ++
> cpus.c | 2 +-
> hw/pc.c | 10 +-
> hw/spapr.c | 6 +-
> include/sysemu/sysemu.h | 1 -
> monitor.c | 4 +-
> numa-opts.c | 166 +++++++++++++++++++++++
> numa-opts.h | 9 ++
> vl.c | 339
> +----------------------------------------------
> 11 files changed, 406 insertions(+), 346 deletions(-)
> create mode 100644 bt-opts.c
> create mode 100644 bt-opts.h
> create mode 100644 numa-opts.c
> create mode 100644 numa-opts.h
>
> diff --git a/Makefile.objs b/Makefile.objs
> index a68cdac..4bfc559 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -73,6 +73,8 @@ common-obj-y += bt-host.o bt-vhci.o
>
> common-obj-y += dma-helpers.o
> common-obj-y += vl.o
> +common-obj-y += numa-opts.o
> +common-obj-y += bt-opts.o
>
> common-obj-$(CONFIG_SLIRP) += slirp/
>
> diff --git a/bt-opts.c b/bt-opts.c
> new file mode 100644
> index 0000000..d34ac62
> --- /dev/null
> +++ b/bt-opts.c
> @@ -0,0 +1,200 @@
> +#include "bt-opts.h"
> +#include "qemu-common.h"
> +
> +
> +static int nb_hcis;
> +static int cur_hci;
> +static struct HCIInfo *hci_table[MAX_NICS];
> +
> +static struct bt_vlan_s {
> + struct bt_scatternet_s net;
> + int id;
> + struct bt_vlan_s *next;
> +} *first_bt_vlan;
> +
> +static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
> +{
> +}
> +
> +static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
> +{
> + return -ENOTSUP;
> +}
> +
> +/* find or alloc a new bluetooth "VLAN" */
> +static struct HCIInfo null_hci = {
> + .cmd_send = null_hci_send,
> + .sco_send = null_hci_send,
> + .acl_send = null_hci_send,
> + .bdaddr_set = null_hci_addr_set,
> +};
> +
> +struct HCIInfo *qemu_next_hci(void)
> +{
> + if (cur_hci == nb_hcis) {
> + return &null_hci;
> + }
> +
> + return hci_table[cur_hci++];
> +}
> +
> +struct HCIInfo *hci_init(const char *str)
> +{
> + char *endp;
> + struct bt_scatternet_s *vlan = 0;
> +
> + if (!strcmp(str, "null")) {
> + /* null */
> + return &null_hci;
> + } else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] ==
> ':')) {
> + /* host[:hciN] */
> + return bt_host_hci(str[4] ? str + 5 : "hci0");
> + } else if (!strncmp(str, "hci", 3)) {
> + /* hci[,vlan=n] */
> + if (str[3]) {
> + if (!strncmp(str + 3, ",vlan=", 6)) {
> + vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
> + if (*endp) {
> + vlan = 0;
> + }
> + }
> + } else {
> + vlan = qemu_find_bt_vlan(0);
> + }
> + if (vlan) {
> + return bt_new_hci(vlan);
> + }
> + }
> +
> + fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
> +
> + return 0;
> +}
> +
> +static int bt_hci_parse(const char *str)
> +{
> + struct HCIInfo *hci;
> + bdaddr_t bdaddr;
> +
> + if (nb_hcis >= MAX_NICS) {
> + fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n",
> MAX_NICS);
> + return -1;
> + }
> +
> + hci = hci_init(str);
> + if (!hci) {
> + return -1;
> + }
> + bdaddr.b[0] = 0x52;
> + bdaddr.b[1] = 0x54;
> + bdaddr.b[2] = 0x00;
> + bdaddr.b[3] = 0x12;
> + bdaddr.b[4] = 0x34;
> + bdaddr.b[5] = 0x56 + nb_hcis;
> + hci->bdaddr_set(hci, bdaddr.b);
> +
> + hci_table[nb_hcis++] = hci;
> +
> + return 0;
> +}
> +
> +static void bt_vhci_add(int vlan_id)
> +{
> + struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id);
> +
> + if (!vlan->slave) {
> + fprintf(stderr, "qemu: warning: adding a VHCI to "
> + "an empty scatternet %i\n", vlan_id);
> + }
> +
> + bt_vhci_init(bt_new_hci(vlan));
> +}
> +
> +static struct bt_device_s *bt_device_add(const char *opt)
> +{
> + struct bt_scatternet_s *vlan;
> + int vlan_id = 0;
> + char *endp = strstr(opt, ",vlan=");
> + int len = (endp ? endp - opt : strlen(opt)) + 1;
> + char devname[10];
> +
> + pstrcpy(devname, MIN(sizeof(devname), len), opt);
> +
> + if (endp) {
> + vlan_id = strtol(endp + 6, &endp, 0);
> + if (*endp) {
> + fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n");
> + return 0;
> + }
> + }
> +
> + vlan = qemu_find_bt_vlan(vlan_id);
> +
> + if (!vlan->slave) {
> + fprintf(stderr, "qemu: warning: adding a slave device to "
> + "an empty scatternet %i\n", vlan_id);
> + }
> + if (!strcmp(devname, "keyboard")) {
> + return bt_keyboard_init(vlan);
> + }
> + fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname);
> + return 0;
> +}
> +
> +struct bt_scatternet_s *qemu_find_bt_vlan(int id)
> +{
> + struct bt_vlan_s **pvlan, *vlan;
> + for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
> + if (vlan->id == id) {
> + return &vlan->net;
> + }
> + }
> + vlan = g_malloc0(sizeof(struct bt_vlan_s));
> + vlan->id = id;
> + pvlan = &first_bt_vlan;
> + while (*pvlan != NULL) {
> + pvlan = &(*pvlan)->next;
> + }
> + *pvlan = vlan;
> + return &vlan->net;
> +}
> +
> +int bt_parse(const char *opt)
> +{
> + const char *endp, *p;
> + int vlan;
> +
> + if (strstart(opt, "hci", &endp)) {
> + if (!*endp || *endp == ',') {
> + if (*endp) {
> + if (!strstart(endp, ",vlan=", 0)) {
> + opt = endp + 1;
> + }
> + }
> + return bt_hci_parse(opt);
> + }
> + } else if (strstart(opt, "vhci", &endp)) {
> + if (!*endp || *endp == ',') {
> + if (*endp) {
> + if (strstart(endp, ",vlan=", &p)) {
> + vlan = strtol(p, (char **) &endp, 0);
> + if (*endp) {
> + fprintf(stderr, "qemu: bad scatternet '%s'\n", p);
> + return 1;
> + }
> + } else {
> + fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1);
> + return 1;
> + }
> + } else {
> + vlan = 0;
> + }
> + bt_vhci_add(vlan);
> + return 0;
> + }
> + } else if (strstart(opt, "device:", &endp)) {
> + return !bt_device_add(endp);
> + }
> + fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt);
> + return 1;
> +}
> diff --git a/bt-opts.h b/bt-opts.h
> new file mode 100644
> index 0000000..fcd80c1
> --- /dev/null
> +++ b/bt-opts.h
> @@ -0,0 +1,13 @@
> +#ifndef BT_OPTS_H
> +#define BT_OPTS_H
> +
> +#include "net/net.h"
> +#include "bt/bt.h"
> +#include "hw/bt.h"
> +
> +int bt_parse(const char *opt);
> +struct HCIInfo *hci_init(const char *str);
> +struct bt_scatternet_s *qemu_find_bt_vlan(int id);
> +
> +
> +#endif
> diff --git a/cpus.c b/cpus.c
> index c4b021d..9f05390 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -1167,7 +1167,7 @@ void set_numa_modes(void)
>
> for (env = first_cpu; env != NULL; env = env->next_cpu) {
> cpu = ENV_GET_CPU(env);
> - for (i = 0; i < nb_numa_nodes; i++) {
> + for (i = 0; i < get_nr_numa_nodes(); i++) {
> if (test_bit(cpu->cpu_index, node_cpumask[i])) {
> cpu->numa_node = i;
> }
> diff --git a/hw/pc.c b/hw/pc.c
> index 07caba7..6ea9452 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -606,23 +606,23 @@ static void *bochs_bios_init(void)
> * of nodes, one word for each VCPU->node and one word for each node to
> * hold the amount of memory.
> */
> - numa_fw_cfg = g_new0(uint64_t, 1 + apic_id_limit + nb_numa_nodes);
> - numa_fw_cfg[0] = cpu_to_le64(nb_numa_nodes);
> + numa_fw_cfg = g_new0(uint64_t, 1 + apic_id_limit + get_nr_numa_nodes());
> + numa_fw_cfg[0] = cpu_to_le64(get_nr_numa_nodes());
> for (i = 0; i < max_cpus; i++) {
> unsigned int apic_id = x86_cpu_apic_id_from_index(i);
> assert(apic_id < apic_id_limit);
> - for (j = 0; j < nb_numa_nodes; j++) {
> + for (j = 0; j < get_nr_numa_nodes(); j++) {
> if (test_bit(i, node_cpumask[j])) {
> numa_fw_cfg[apic_id + 1] = cpu_to_le64(j);
> break;
> }
> }
> }
> - for (i = 0; i < nb_numa_nodes; i++) {
> + for (i = 0; i < get_nr_numa_nodes(); i++) {
> numa_fw_cfg[apic_id_limit + 1 + i] = cpu_to_le64(node_mem[i]);
> }
> fw_cfg_add_bytes(fw_cfg, FW_CFG_NUMA, numa_fw_cfg,
> - (1 + apic_id_limit + nb_numa_nodes) *
> + (1 + apic_id_limit + get_nr_numa_nodes()) *
> sizeof(*numa_fw_cfg));
>
> return fw_cfg;
> diff --git a/hw/spapr.c b/hw/spapr.c
> index e88a27a..43777f8 100644
> --- a/hw/spapr.c
> +++ b/hw/spapr.c
> @@ -162,7 +162,7 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPREnvironment
> *spapr)
> return offset;
> }
>
> - if (nb_numa_nodes > 1) {
> + if (get_nr_numa_nodes() > 1) {
> ret = fdt_setprop(fdt, offset, "ibm,associativity",
> associativity,
> sizeof(associativity));
> if (ret < 0) {
> @@ -453,7 +453,7 @@ static int spapr_populate_memory(sPAPREnvironment *spapr,
> void *fdt)
> int i, off;
>
> /* memory node(s) */
> - node0_size = (nb_numa_nodes > 1) ? node_mem[0] : ram_size;
> + node0_size = (get_nr_numa_nodes() > 1) ? node_mem[0] : ram_size;
> if (spapr->rma_size > node0_size) {
> spapr->rma_size = node0_size;
> }
> @@ -486,7 +486,7 @@ static int spapr_populate_memory(sPAPREnvironment *spapr,
> void *fdt)
>
> /* RAM: Node 1 and beyond */
> mem_start = node0_size;
> - for (i = 1; i < nb_numa_nodes; i++) {
> + for (i = 1; i < get_nr_numa_nodes(); i++) {
> mem_reg_property[0] = cpu_to_be64(mem_start);
> mem_reg_property[1] = cpu_to_be64(node_mem[i]);
> associativity[3] = associativity[4] = cpu_to_be32(i);
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index b19ec95..1375f3b 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -128,7 +128,6 @@ 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 unsigned long *node_cpumask[MAX_NODES];
>
> diff --git a/monitor.c b/monitor.c
> index 32a6e74..1893766 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -1772,8 +1772,8 @@ static void do_info_numa(Monitor *mon, const QDict
> *qdict)
> CPUArchState *env;
> CPUState *cpu;
>
> - monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
> - for (i = 0; i < nb_numa_nodes; i++) {
> + monitor_printf(mon, "%d nodes\n", get_nr_numa_nodes());
> + for (i = 0; i < get_nr_numa_nodes(); i++) {
> monitor_printf(mon, "node %d cpus:", i);
> for (env = first_cpu; env != NULL; env = env->next_cpu) {
> cpu = ENV_GET_CPU(env);
> diff --git a/numa-opts.c b/numa-opts.c
> new file mode 100644
> index 0000000..ae87c2d
> --- /dev/null
> +++ b/numa-opts.c
> @@ -0,0 +1,166 @@
> +#include "numa-opts.h"
> +#include "sysemu/sysemu.h"
> +#include "qemu-common.h"
> +#include "qemu/bitmap.h"
> +#include "exec/cpu-common.h"
> +
> +extern ram_addr_t ram_size;
> +
> +static int nr_numa_nodes;
> +uint64_t node_mem[MAX_NODES];
> +unsigned long *node_cpumask[MAX_NODES];
> +
> +int get_nr_numa_nodes(void)
> +{
> + return nr_numa_nodes;
> +}
> +
> +void set_nr_numa_nodes(int nr)
> +{
> + nr_numa_nodes = nr;
> +}
> +
> +static void numa_node_parse_cpus(int nodenr, const char *cpus)
> +{
> + char *endptr;
> + unsigned long long value, endvalue;
> +
> + /* Empty CPU range strings will be considered valid, they will simply
> + * not set any bit in the CPU bitmap.
> + */
> + if (!*cpus) {
> + return;
> + }
> +
> + if (parse_uint(cpus, &value, &endptr, 10) < 0) {
> + goto error;
> + }
> + if (*endptr == '-') {
> + if (parse_uint_full(endptr + 1, &endvalue, 10) < 0) {
> + goto error;
> + }
> + } else if (*endptr == '\0') {
> + endvalue = value;
> + } else {
> + goto error;
> + }
> +
> + if (endvalue >= MAX_CPUMASK_BITS) {
> + endvalue = MAX_CPUMASK_BITS - 1;
> + fprintf(stderr,
> + "qemu: NUMA: A max of %d VCPUs are supported\n",
> + MAX_CPUMASK_BITS);
> + }
> +
> + if (endvalue < value) {
> + goto error;
> + }
> +
> + bitmap_set(node_cpumask[nodenr], value, endvalue-value+1);
> + return;
> +
> +error:
> + fprintf(stderr, "qemu: Invalid NUMA CPU range: %s\n", cpus);
> + exit(1);
> +}
> +
> +
> +
> +void numa_add(const char *optarg)
> +{
> + char option[128];
> + char *endptr;
> + unsigned long long nodenr;
> +
> + optarg = get_opt_name(option, 128, optarg, ',');
> + if (*optarg == ',') {
> + optarg++;
> + }
> + if (!strcmp(option, "node")) {
> +
> + if (nr_numa_nodes >= MAX_NODES) {
> + fprintf(stderr, "qemu: too many NUMA nodes\n");
> + exit(1);
> + }
> +
> + if (get_param_value(option, 128, "nodeid", optarg) == 0) {
> + nodenr = nr_numa_nodes;
> + } else {
> + if (parse_uint_full(option, &nodenr, 10) < 0) {
> + fprintf(stderr, "qemu: Invalid NUMA nodeid: %s\n", option);
> + exit(1);
> + }
> + }
> +
> + if (nodenr >= MAX_NODES) {
> + fprintf(stderr, "qemu: invalid NUMA nodeid: %llu\n", nodenr);
> + exit(1);
> + }
> +
> + if (get_param_value(option, 128, "mem", optarg) == 0) {
> + node_mem[nodenr] = 0;
> + } else {
> + int64_t sval;
> + sval = strtosz(option, &endptr);
> + if (sval < 0 || *endptr) {
> + fprintf(stderr, "qemu: invalid numa mem size: %s\n", optarg);
> + exit(1);
> + }
> + node_mem[nodenr] = sval;
> + }
> + if (get_param_value(option, 128, "cpus", optarg) != 0) {
> + numa_node_parse_cpus(nodenr, option);
> + }
> + nr_numa_nodes++;
> + } else {
> + fprintf(stderr, "Invalid -numa option: %s\n", option);
> + exit(1);
> + }
> +}
> +
> +void numa_assignment(void)
> +{
> + int i = 0;
> +
> + if (nr_numa_nodes > 0) {
> + if (nr_numa_nodes > MAX_NODES) {
> + nr_numa_nodes = MAX_NODES;
> + }
> +
> + /* If no memory size if given for any node, assume the default case
> + * and distribute the available memory equally across all nodes
> + */
> + for (i = 0; i < nr_numa_nodes; i++) {
> + if (node_mem[i] != 0) {
> + break;
> + }
> + }
> + if (i == nr_numa_nodes) {
> + uint64_t usedmem = 0;
> +
> + /* On Linux, the each node's border has to be 8MB aligned,
> + * the final node gets the rest.
> + */
> + for (i = 0; i < nr_numa_nodes - 1; i++) {
> + node_mem[i] = (ram_size / nr_numa_nodes) & ~((1 << 23UL) -
> 1);
> + usedmem += node_mem[i];
> + }
> + node_mem[i] = ram_size - usedmem;
> + }
> +
> + for (i = 0; i < nr_numa_nodes; i++) {
> + 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
> + * real machines which also use this scheme.
> + */
> + if (i == nr_numa_nodes) {
> + for (i = 0; i < max_cpus; i++) {
> + set_bit(i, node_cpumask[i % nr_numa_nodes]);
> + }
> + }
> + }
> +}
> diff --git a/numa-opts.h b/numa-opts.h
> new file mode 100644
> index 0000000..9accea3
> --- /dev/null
> +++ b/numa-opts.h
> @@ -0,0 +1,9 @@
> +#ifndef NUMA_OPTS_H
> +#define NUMA_OPTS_H
> +
> +int get_nr_numa_nodes(void);
> +void set_nr_numa_nodes(int nr);
> +void numa_add(const char *optarg);
> +void numa_assignment(void);
> +
> +#endif
> diff --git a/vl.c b/vl.c
> index febd2ea..4e6606f 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -170,6 +170,9 @@ int main(int argc, char **argv)
> #include "ui/qemu-spice.h"
> #include "qapi/string-input-visitor.h"
>
> +#include "numa-opts.h"
> +#include "bt-opts.h"
> +
> //#define DEBUG_NET
> //#define DEBUG_SLIRP
>
> @@ -248,10 +251,6 @@ struct FWBootEntry {
> static QTAILQ_HEAD(, FWBootEntry) fw_boot_order =
> QTAILQ_HEAD_INITIALIZER(fw_boot_order);
>
> -int nb_numa_nodes;
> -uint64_t node_mem[MAX_NODES];
> -unsigned long *node_cpumask[MAX_NODES];
> -
> uint8_t qemu_uuid[16];
>
> static QEMUBootSetHandler *boot_set_handler;
> @@ -769,197 +768,6 @@ static void configure_rtc(QemuOpts *opts)
> }
> }
>
> -/***********************************************************/
> -/* Bluetooth support */
> -static int nb_hcis;
> -static int cur_hci;
> -static struct HCIInfo *hci_table[MAX_NICS];
> -
> -static struct bt_vlan_s {
> - struct bt_scatternet_s net;
> - int id;
> - struct bt_vlan_s *next;
> -} *first_bt_vlan;
> -
> -/* find or alloc a new bluetooth "VLAN" */
> -static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
> -{
> - struct bt_vlan_s **pvlan, *vlan;
> - for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
> - if (vlan->id == id)
> - return &vlan->net;
> - }
> - vlan = g_malloc0(sizeof(struct bt_vlan_s));
> - vlan->id = id;
> - pvlan = &first_bt_vlan;
> - while (*pvlan != NULL)
> - pvlan = &(*pvlan)->next;
> - *pvlan = vlan;
> - return &vlan->net;
> -}
> -
> -static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
> -{
> -}
> -
> -static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
> -{
> - return -ENOTSUP;
> -}
> -
> -static struct HCIInfo null_hci = {
> - .cmd_send = null_hci_send,
> - .sco_send = null_hci_send,
> - .acl_send = null_hci_send,
> - .bdaddr_set = null_hci_addr_set,
> -};
> -
> -struct HCIInfo *qemu_next_hci(void)
> -{
> - if (cur_hci == nb_hcis)
> - return &null_hci;
> -
> - return hci_table[cur_hci++];
> -}
> -
> -static struct HCIInfo *hci_init(const char *str)
> -{
> - char *endp;
> - struct bt_scatternet_s *vlan = 0;
> -
> - if (!strcmp(str, "null"))
> - /* null */
> - return &null_hci;
> - else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
> - /* host[:hciN] */
> - return bt_host_hci(str[4] ? str + 5 : "hci0");
> - else if (!strncmp(str, "hci", 3)) {
> - /* hci[,vlan=n] */
> - if (str[3]) {
> - if (!strncmp(str + 3, ",vlan=", 6)) {
> - vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
> - if (*endp)
> - vlan = 0;
> - }
> - } else
> - vlan = qemu_find_bt_vlan(0);
> - if (vlan)
> - return bt_new_hci(vlan);
> - }
> -
> - fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
> -
> - return 0;
> -}
> -
> -static int bt_hci_parse(const char *str)
> -{
> - struct HCIInfo *hci;
> - bdaddr_t bdaddr;
> -
> - if (nb_hcis >= MAX_NICS) {
> - fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n",
> MAX_NICS);
> - return -1;
> - }
> -
> - hci = hci_init(str);
> - if (!hci)
> - return -1;
> -
> - bdaddr.b[0] = 0x52;
> - bdaddr.b[1] = 0x54;
> - bdaddr.b[2] = 0x00;
> - bdaddr.b[3] = 0x12;
> - bdaddr.b[4] = 0x34;
> - bdaddr.b[5] = 0x56 + nb_hcis;
> - hci->bdaddr_set(hci, bdaddr.b);
> -
> - hci_table[nb_hcis++] = hci;
> -
> - return 0;
> -}
> -
> -static void bt_vhci_add(int vlan_id)
> -{
> - struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id);
> -
> - if (!vlan->slave)
> - fprintf(stderr, "qemu: warning: adding a VHCI to "
> - "an empty scatternet %i\n", vlan_id);
> -
> - bt_vhci_init(bt_new_hci(vlan));
> -}
> -
> -static struct bt_device_s *bt_device_add(const char *opt)
> -{
> - struct bt_scatternet_s *vlan;
> - int vlan_id = 0;
> - char *endp = strstr(opt, ",vlan=");
> - int len = (endp ? endp - opt : strlen(opt)) + 1;
> - char devname[10];
> -
> - pstrcpy(devname, MIN(sizeof(devname), len), opt);
> -
> - if (endp) {
> - vlan_id = strtol(endp + 6, &endp, 0);
> - if (*endp) {
> - fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n");
> - return 0;
> - }
> - }
> -
> - vlan = qemu_find_bt_vlan(vlan_id);
> -
> - if (!vlan->slave)
> - fprintf(stderr, "qemu: warning: adding a slave device to "
> - "an empty scatternet %i\n", vlan_id);
> -
> - if (!strcmp(devname, "keyboard"))
> - return bt_keyboard_init(vlan);
> -
> - fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname);
> - return 0;
> -}
> -
> -static int bt_parse(const char *opt)
> -{
> - const char *endp, *p;
> - int vlan;
> -
> - if (strstart(opt, "hci", &endp)) {
> - if (!*endp || *endp == ',') {
> - if (*endp)
> - if (!strstart(endp, ",vlan=", 0))
> - opt = endp + 1;
> -
> - return bt_hci_parse(opt);
> - }
> - } else if (strstart(opt, "vhci", &endp)) {
> - if (!*endp || *endp == ',') {
> - if (*endp) {
> - if (strstart(endp, ",vlan=", &p)) {
> - vlan = strtol(p, (char **) &endp, 0);
> - if (*endp) {
> - fprintf(stderr, "qemu: bad scatternet '%s'\n", p);
> - return 1;
> - }
> - } else {
> - fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1);
> - return 1;
> - }
> - } else
> - vlan = 0;
> -
> - bt_vhci_add(vlan);
> - return 0;
> - }
> - } else if (strstart(opt, "device:", &endp))
> - return !bt_device_add(endp);
> -
> - fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt);
> - return 1;
> -}
> -
> static int parse_sandbox(QemuOpts *opts, void *opaque)
> {
> /* FIXME: change this to true for 1.3 */
> @@ -1244,102 +1052,6 @@ char *get_boot_devices_list(size_t *size)
> return list;
> }
>
> -static void numa_node_parse_cpus(int nodenr, const char *cpus)
> -{
> - char *endptr;
> - unsigned long long value, endvalue;
> -
> - /* Empty CPU range strings will be considered valid, they will simply
> - * not set any bit in the CPU bitmap.
> - */
> - if (!*cpus) {
> - return;
> - }
> -
> - if (parse_uint(cpus, &value, &endptr, 10) < 0) {
> - goto error;
> - }
> - if (*endptr == '-') {
> - if (parse_uint_full(endptr + 1, &endvalue, 10) < 0) {
> - goto error;
> - }
> - } else if (*endptr == '\0') {
> - endvalue = value;
> - } else {
> - goto error;
> - }
> -
> - if (endvalue >= MAX_CPUMASK_BITS) {
> - endvalue = MAX_CPUMASK_BITS - 1;
> - fprintf(stderr,
> - "qemu: NUMA: A max of %d VCPUs are supported\n",
> - MAX_CPUMASK_BITS);
> - }
> -
> - if (endvalue < value) {
> - goto error;
> - }
> -
> - bitmap_set(node_cpumask[nodenr], value, endvalue-value+1);
> - return;
> -
> -error:
> - fprintf(stderr, "qemu: Invalid NUMA CPU range: %s\n", cpus);
> - exit(1);
> -}
> -
> -static void numa_add(const char *optarg)
> -{
> - char option[128];
> - char *endptr;
> - unsigned long long nodenr;
> -
> - optarg = get_opt_name(option, 128, optarg, ',');
> - if (*optarg == ',') {
> - optarg++;
> - }
> - if (!strcmp(option, "node")) {
> -
> - if (nb_numa_nodes >= MAX_NODES) {
> - fprintf(stderr, "qemu: too many NUMA nodes\n");
> - exit(1);
> - }
> -
> - if (get_param_value(option, 128, "nodeid", optarg) == 0) {
> - nodenr = nb_numa_nodes;
> - } else {
> - if (parse_uint_full(option, &nodenr, 10) < 0) {
> - fprintf(stderr, "qemu: Invalid NUMA nodeid: %s\n", option);
> - exit(1);
> - }
> - }
> -
> - if (nodenr >= MAX_NODES) {
> - fprintf(stderr, "qemu: invalid NUMA nodeid: %llu\n", nodenr);
> - exit(1);
> - }
> -
> - if (get_param_value(option, 128, "mem", optarg) == 0) {
> - node_mem[nodenr] = 0;
> - } else {
> - int64_t sval;
> - sval = strtosz(option, &endptr);
> - if (sval < 0 || *endptr) {
> - fprintf(stderr, "qemu: invalid numa mem size: %s\n", optarg);
> - exit(1);
> - }
> - node_mem[nodenr] = sval;
> - }
> - if (get_param_value(option, 128, "cpus", optarg) != 0) {
> - numa_node_parse_cpus(nodenr, option);
> - }
> - nb_numa_nodes++;
> - } else {
> - fprintf(stderr, "Invalid -numa option: %s\n", option);
> - exit(1);
> - }
> -}
> -
> static void smp_parse(const char *optarg)
> {
> int smp, sockets = 0, threads = 0, cores = 0;
> @@ -2892,7 +2604,7 @@ int main(int argc, char **argv, char **envp)
> node_cpumask[i] = bitmap_new(MAX_CPUMASK_BITS);
> }
>
> - nb_numa_nodes = 0;
> + set_nr_numa_nodes(0);
> nb_nics = 0;
>
> autostart= 1;
> @@ -4141,48 +3853,7 @@ int main(int argc, char **argv, char **envp)
>
> register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL);
>
> - if (nb_numa_nodes > 0) {
> - int i;
> -
> - if (nb_numa_nodes > MAX_NODES) {
> - nb_numa_nodes = MAX_NODES;
> - }
> -
> - /* If no memory size if given for any node, assume the default case
> - * and distribute the available memory equally across all nodes
> - */
> - for (i = 0; i < nb_numa_nodes; i++) {
> - if (node_mem[i] != 0)
> - break;
> - }
> - if (i == nb_numa_nodes) {
> - uint64_t usedmem = 0;
> -
> - /* On Linux, the each node's border has to be 8MB aligned,
> - * the final node gets the rest.
> - */
> - for (i = 0; i < nb_numa_nodes - 1; i++) {
> - node_mem[i] = (ram_size / nb_numa_nodes) & ~((1 << 23UL) -
> 1);
> - usedmem += node_mem[i];
> - }
> - node_mem[i] = ram_size - usedmem;
> - }
> -
> - for (i = 0; i < nb_numa_nodes; i++) {
> - 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
> - * real machines which also use this scheme.
> - */
> - if (i == nb_numa_nodes) {
> - for (i = 0; i < max_cpus; i++) {
> - set_bit(i, node_cpumask[i % nb_numa_nodes]);
> - }
> - }
> - }
> + numa_assignment();
>
> if (qemu_opts_foreach(qemu_find_opts("mon"), mon_init_func, NULL, 1) !=
> 0) {
> exit(1);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PATCH][RFC] vl: move unrelated functions out of vl.c,
li guang <=