* [PATCH v2] kvm tools: Support multiple net devices @ 2011-09-25 11:11 Sasha Levin 2011-09-26 6:10 ` Pekka Enberg 2011-09-26 11:57 ` Asias He 0 siblings, 2 replies; 12+ messages in thread From: Sasha Levin @ 2011-09-25 11:11 UTC (permalink / raw) To: penberg; +Cc: kvm, mingo, asias.hejun, gorcunov, Sasha Levin This patch adds support for multiple network devices. The command line syntax changes to the following: --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] [host_ip= [host_ip]] [guest_mac=[guest_mac]] [script=[script]] Each of the parameters is optional, and the config defaults to a TAP based networking with a sequential MAC. Signed-off-by: Sasha Levin <levinsasha928@gmail.com> --- tools/kvm/builtin-run.c | 146 ++++++++++++++++++++++++++++++++------------ tools/kvm/virtio/net.c | 155 +++++++++++++++++++++++++--------------------- 2 files changed, 191 insertions(+), 110 deletions(-) diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c index 28dc95a..070b1b6 100644 --- a/tools/kvm/builtin-run.c +++ b/tools/kvm/builtin-run.c @@ -87,9 +87,12 @@ static bool sdl; static bool balloon; static bool using_rootfs; static bool custom_rootfs; +static bool no_net; extern bool ioport_debug; extern int active_console; extern int debug_iodelay; +struct virtio_net_parameters *net_params; +int num_net_devices; bool do_debug_print = false; @@ -182,6 +185,89 @@ static int tty_parser(const struct option *opt, const char *arg, int unset) return 0; } +static inline void str_to_mac(const char *str, char *mac) +{ + sscanf(str, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + mac, mac+1, mac+2, mac+3, mac+4, mac+5); +} +static int set_net_param(struct virtio_net_parameters *p, const char *param, + const char *val) +{ + if (strcmp(param, "guest_mac") == 0) { + str_to_mac(val, p->guest_mac); + } else if (strcmp(param, "mode") == 0) { + if (!strncmp(val, "user", 4)) { + int i; + + for (i = 0; i < num_net_devices; i++) + if (net_params[i].mode == NET_MODE_USER) + die("Only one usermode network device allowed at a time"); + p->mode = NET_MODE_USER; + } else if (!strncmp(val, "tap", 3)) { + p->mode = NET_MODE_TAP; + } else if (!strncmp(val, "none", 4)) { + no_net = 1; + return -1; + } else + die("Unkown network mode %s, please use user, tap or none", network); + } else if (strcmp(param, "script") == 0) { + p->script = val; + } else if (strcmp(param, "guest_ip") == 0) { + p->guest_ip = val; + } else if (strcmp(param, "host_ip") == 0) { + p->host_ip = val; + } + + return 0; +} + +static int netdev_parser(const struct option *opt, const char *arg, int unset) +{ + struct virtio_net_parameters p; + char *buf, *cmd = NULL, *cur = NULL; + bool on_cmd = true; + + if (arg) { + buf = strdup(arg); + if (buf == NULL) + die("Failed allocating new net buffer"); + cur = strtok(buf, ",="); + } + + p = (struct virtio_net_parameters) { + .guest_ip = DEFAULT_GUEST_ADDR, + .host_ip = DEFAULT_HOST_ADDR, + .script = DEFAULT_SCRIPT, + .mode = NET_MODE_TAP, + }; + + str_to_mac(DEFAULT_GUEST_MAC, p.guest_mac); + p.guest_mac[5] += num_net_devices; + + while (cur) { + if (on_cmd) { + cmd = cur; + } else { + if (set_net_param(&p, cmd, cur) < 0) + goto done; + } + on_cmd = !on_cmd; + + cur = strtok(NULL, ",="); + }; + + num_net_devices++; + + net_params = realloc(net_params, num_net_devices * sizeof(*net_params)); + if (net_params == NULL) + die("Failed adding new network device"); + + net_params[num_net_devices - 1] = p; + +done: + return 0; +} + static int shmem_parser(const struct option *opt, const char *arg, int unset) { const u64 default_size = SHMEM_DEFAULT_SIZE; @@ -339,18 +425,9 @@ static const struct option options[] = { "Kernel command line arguments"), OPT_GROUP("Networking options:"), - OPT_STRING('n', "network", &network, "user, tap, none", - "Network to use"), - OPT_STRING('\0', "host-ip", &host_ip, "a.b.c.d", - "Assign this address to the host side networking"), - OPT_STRING('\0', "guest-ip", &guest_ip, "a.b.c.d", - "Assign this address to the guest side networking"), - OPT_STRING('\0', "host-mac", &host_mac, "aa:bb:cc:dd:ee:ff", - "Assign this address to the host side NIC"), - OPT_STRING('\0', "guest-mac", &guest_mac, "aa:bb:cc:dd:ee:ff", - "Assign this address to the guest side NIC"), - OPT_STRING('\0', "tapscript", &script, "Script path", - "Assign a script to process created tap device"), + OPT_CALLBACK_DEFAULT('n', "network", NULL, "network params", + "Create a new guest NIC", + netdev_parser, NULL), OPT_GROUP("BIOS options:"), OPT_INTEGER('\0', "vidmode", &vidmode, @@ -615,7 +692,6 @@ void kvm_run_help(void) int kvm_cmd_run(int argc, const char **argv, const char *prefix) { - struct virtio_net_parameters net_params; static char real_cmdline[2048], default_name[20]; struct framebuffer *fb = NULL; unsigned int nr_online_cpus; @@ -823,32 +899,24 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix) virtio_9p__init(kvm); - if (strncmp(network, "none", 4)) { - net_params.guest_ip = guest_ip; - net_params.host_ip = host_ip; - net_params.kvm = kvm; - net_params.script = script; - sscanf(guest_mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", - net_params.guest_mac, - net_params.guest_mac+1, - net_params.guest_mac+2, - net_params.guest_mac+3, - net_params.guest_mac+4, - net_params.guest_mac+5); - sscanf(host_mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", - net_params.host_mac, - net_params.host_mac+1, - net_params.host_mac+2, - net_params.host_mac+3, - net_params.host_mac+4, - net_params.host_mac+5); - - if (!strncmp(network, "user", 4)) - net_params.mode = NET_MODE_USER; - else if (!strncmp(network, "tap", 3)) - net_params.mode = NET_MODE_TAP; - else - die("Unkown network mode %s, please use -network user, tap, none", network); + for (i = 0; i < num_net_devices; i++) { + net_params[i].kvm = kvm; + virtio_net__init(&net_params[i]); + } + + if (num_net_devices == 0 && no_net == 0) { + struct virtio_net_parameters net_params; + + net_params = (struct virtio_net_parameters) { + .guest_ip = guest_ip, + .host_ip = host_ip, + .kvm = kvm, + .script = script, + .mode = NET_MODE_USER, + }; + str_to_mac(guest_mac, net_params.guest_mac); + str_to_mac(host_mac, net_params.host_mac); + virtio_net__init(&net_params); } diff --git a/tools/kvm/virtio/net.c b/tools/kvm/virtio/net.c index 4700483..1e33891 100644 --- a/tools/kvm/virtio/net.c +++ b/tools/kvm/virtio/net.c @@ -43,6 +43,7 @@ struct net_dev_operations { struct net_dev { pthread_mutex_t mutex; struct virtio_pci vpci; + struct list_head list; struct virt_queue vqs[VIRTIO_NET_NUM_QUEUES]; struct virtio_net_config config; @@ -64,48 +65,41 @@ struct net_dev { struct uip_info info; struct net_dev_operations *ops; + struct kvm *kvm; }; -static struct net_dev ndev = { - .mutex = PTHREAD_MUTEX_INITIALIZER, - - .config = { - .status = VIRTIO_NET_S_LINK_UP, - }, - .info = { - .buf_nr = 20, - } -}; +static LIST_HEAD(ndevs); static void *virtio_net_rx_thread(void *p) { struct iovec iov[VIRTIO_NET_QUEUE_SIZE]; struct virt_queue *vq; struct kvm *kvm; + struct net_dev *ndev = p; u16 out, in; u16 head; int len; - kvm = p; - vq = &ndev.vqs[VIRTIO_NET_RX_QUEUE]; + kvm = ndev->kvm; + vq = &ndev->vqs[VIRTIO_NET_RX_QUEUE]; while (1) { - mutex_lock(&ndev.io_rx_lock); + mutex_lock(&ndev->io_rx_lock); if (!virt_queue__available(vq)) - pthread_cond_wait(&ndev.io_rx_cond, &ndev.io_rx_lock); - mutex_unlock(&ndev.io_rx_lock); + pthread_cond_wait(&ndev->io_rx_cond, &ndev->io_rx_lock); + mutex_unlock(&ndev->io_rx_lock); while (virt_queue__available(vq)) { head = virt_queue__get_iov(vq, iov, &out, &in, kvm); - len = ndev.ops->rx(iov, in, &ndev); + len = ndev->ops->rx(iov, in, ndev); virt_queue__set_used_elem(vq, head, len); /* We should interrupt guest right now, otherwise latency is huge. */ - virtio_pci__signal_vq(kvm, &ndev.vpci, VIRTIO_NET_RX_QUEUE); + virtio_pci__signal_vq(kvm, &ndev->vpci, VIRTIO_NET_RX_QUEUE); } } @@ -120,29 +114,30 @@ static void *virtio_net_tx_thread(void *p) struct iovec iov[VIRTIO_NET_QUEUE_SIZE]; struct virt_queue *vq; struct kvm *kvm; + struct net_dev *ndev = p; u16 out, in; u16 head; int len; - kvm = p; - vq = &ndev.vqs[VIRTIO_NET_TX_QUEUE]; + kvm = ndev->kvm; + vq = &ndev->vqs[VIRTIO_NET_TX_QUEUE]; while (1) { - mutex_lock(&ndev.io_tx_lock); + mutex_lock(&ndev->io_tx_lock); if (!virt_queue__available(vq)) - pthread_cond_wait(&ndev.io_tx_cond, &ndev.io_tx_lock); - mutex_unlock(&ndev.io_tx_lock); + pthread_cond_wait(&ndev->io_tx_cond, &ndev->io_tx_lock); + mutex_unlock(&ndev->io_tx_lock); while (virt_queue__available(vq)) { head = virt_queue__get_iov(vq, iov, &out, &in, kvm); - len = ndev.ops->tx(iov, out, &ndev); + len = ndev->ops->tx(iov, out, ndev); virt_queue__set_used_elem(vq, head, len); } - virtio_pci__signal_vq(kvm, &ndev.vpci, VIRTIO_NET_TX_QUEUE); + virtio_pci__signal_vq(kvm, &ndev->vpci, VIRTIO_NET_TX_QUEUE); } pthread_exit(NULL); @@ -151,58 +146,58 @@ static void *virtio_net_tx_thread(void *p) } -static void virtio_net_handle_callback(struct kvm *kvm, u16 queue_index) +static void virtio_net_handle_callback(struct kvm *kvm, struct net_dev *ndev, int queue) { - switch (queue_index) { + switch (queue) { case VIRTIO_NET_TX_QUEUE: - mutex_lock(&ndev.io_tx_lock); - pthread_cond_signal(&ndev.io_tx_cond); - mutex_unlock(&ndev.io_tx_lock); + mutex_lock(&ndev->io_tx_lock); + pthread_cond_signal(&ndev->io_tx_cond); + mutex_unlock(&ndev->io_tx_lock); break; case VIRTIO_NET_RX_QUEUE: - mutex_lock(&ndev.io_rx_lock); - pthread_cond_signal(&ndev.io_rx_cond); - mutex_unlock(&ndev.io_rx_lock); + mutex_lock(&ndev->io_rx_lock); + pthread_cond_signal(&ndev->io_rx_cond); + mutex_unlock(&ndev->io_rx_lock); break; default: - pr_warning("Unknown queue index %u", queue_index); + pr_warning("Unknown queue index %u", queue); } } -static bool virtio_net__tap_init(const struct virtio_net_parameters *params) +static bool virtio_net__tap_init(const struct virtio_net_parameters *params, + struct net_dev *ndev) { int sock = socket(AF_INET, SOCK_STREAM, 0); int pid, status, offload, hdr_len; struct sockaddr_in sin = {0}; struct ifreq ifr; - ndev.tap_fd = open("/dev/net/tun", O_RDWR); - if (ndev.tap_fd < 0) { + ndev->tap_fd = open("/dev/net/tun", O_RDWR); + if (ndev->tap_fd < 0) { pr_warning("Unable to open /dev/net/tun"); goto fail; } memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR; - if (ioctl(ndev.tap_fd, TUNSETIFF, &ifr) < 0) { + if (ioctl(ndev->tap_fd, TUNSETIFF, &ifr) < 0) { pr_warning("Config tap device error. Are you root?"); goto fail; } - strncpy(ndev.tap_name, ifr.ifr_name, sizeof(ndev.tap_name)); + strncpy(ndev->tap_name, ifr.ifr_name, sizeof(ndev->tap_name)); - if (ioctl(ndev.tap_fd, TUNSETNOCSUM, 1) < 0) { + if (ioctl(ndev->tap_fd, TUNSETNOCSUM, 1) < 0) { pr_warning("Config tap device TUNSETNOCSUM error"); goto fail; } hdr_len = sizeof(struct virtio_net_hdr); - if (ioctl(ndev.tap_fd, TUNSETVNETHDRSZ, &hdr_len) < 0) { + if (ioctl(ndev->tap_fd, TUNSETVNETHDRSZ, &hdr_len) < 0) pr_warning("Config tap device TUNSETVNETHDRSZ error"); - } offload = TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | TUN_F_UFO; - if (ioctl(ndev.tap_fd, TUNSETOFFLOAD, offload) < 0) { + if (ioctl(ndev->tap_fd, TUNSETOFFLOAD, offload) < 0) { pr_warning("Config tap device TUNSETOFFLOAD error"); goto fail; } @@ -210,7 +205,7 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) if (strcmp(params->script, "none")) { pid = fork(); if (pid == 0) { - execl(params->script, params->script, ndev.tap_name, NULL); + execl(params->script, params->script, ndev->tap_name, NULL); _exit(1); } else { waitpid(pid, &status, 0); @@ -221,7 +216,7 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) } } else { memset(&ifr, 0, sizeof(ifr)); - strncpy(ifr.ifr_name, ndev.tap_name, sizeof(ndev.tap_name)); + strncpy(ifr.ifr_name, ndev->tap_name, sizeof(ndev->tap_name)); sin.sin_addr.s_addr = inet_addr(params->host_ip); memcpy(&(ifr.ifr_addr), &sin, sizeof(ifr.ifr_addr)); ifr.ifr_addr.sa_family = AF_INET; @@ -232,7 +227,7 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) } memset(&ifr, 0, sizeof(ifr)); - strncpy(ifr.ifr_name, ndev.tap_name, sizeof(ndev.tap_name)); + strncpy(ifr.ifr_name, ndev->tap_name, sizeof(ndev->tap_name)); ioctl(sock, SIOCGIFFLAGS, &ifr); ifr.ifr_flags |= IFF_UP | IFF_RUNNING; if (ioctl(sock, SIOCSIFFLAGS, &ifr) < 0) @@ -245,22 +240,22 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) fail: if (sock >= 0) close(sock); - if (ndev.tap_fd >= 0) - close(ndev.tap_fd); + if (ndev->tap_fd >= 0) + close(ndev->tap_fd); return 0; } -static void virtio_net__io_thread_init(struct kvm *kvm) +static void virtio_net__io_thread_init(struct kvm *kvm, struct net_dev *ndev) { - pthread_mutex_init(&ndev.io_rx_lock, NULL); - pthread_cond_init(&ndev.io_tx_cond, NULL); + pthread_mutex_init(&ndev->io_rx_lock, NULL); + pthread_cond_init(&ndev->io_tx_cond, NULL); - pthread_mutex_init(&ndev.io_rx_lock, NULL); - pthread_cond_init(&ndev.io_tx_cond, NULL); + pthread_mutex_init(&ndev->io_rx_lock, NULL); + pthread_cond_init(&ndev->io_tx_cond, NULL); - pthread_create(&ndev.io_rx_thread, NULL, virtio_net_rx_thread, (void *)kvm); - pthread_create(&ndev.io_tx_thread, NULL, virtio_net_tx_thread, (void *)kvm); + pthread_create(&ndev->io_rx_thread, NULL, virtio_net_rx_thread, ndev); + pthread_create(&ndev->io_tx_thread, NULL, virtio_net_tx_thread, ndev); } static inline int tap_ops_tx(struct iovec *iov, u16 out, struct net_dev *ndev) @@ -345,7 +340,9 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 pfn) static int notify_vq(struct kvm *kvm, void *dev, u32 vq) { - virtio_net_handle_callback(kvm, vq); + struct net_dev *ndev = dev; + + virtio_net_handle_callback(kvm, ndev, vq); return 0; } @@ -365,27 +362,43 @@ static int get_size_vq(struct kvm *kvm, void *dev, u32 vq) void virtio_net__init(const struct virtio_net_parameters *params) { int i; + struct net_dev *ndev; + + if (!params) + return; + + ndev = calloc(1, sizeof(struct net_dev)); + if (ndev == NULL) + die("Failed allocating ndev"); + + list_add_tail(&ndev->list, &ndevs); + + ndev->kvm = params->kvm; + + mutex_init(&ndev->mutex); + ndev->config.status = VIRTIO_NET_S_LINK_UP; for (i = 0 ; i < 6 ; i++) { - ndev.config.mac[i] = params->guest_mac[i]; - ndev.info.guest_mac.addr[i] = params->guest_mac[i]; - ndev.info.host_mac.addr[i] = params->host_mac[i]; + ndev->config.mac[i] = params->guest_mac[i]; + ndev->info.guest_mac.addr[i] = params->guest_mac[i]; + ndev->info.host_mac.addr[i] = params->host_mac[i]; } - ndev.mode = params->mode; - if (ndev.mode == NET_MODE_TAP) { - virtio_net__tap_init(params); - ndev.ops = &tap_ops; + ndev->mode = params->mode; + if (ndev->mode == NET_MODE_TAP) { + virtio_net__tap_init(params, ndev); + ndev->ops = &tap_ops; } else { - ndev.info.host_ip = ntohl(inet_addr(params->host_ip)); - ndev.info.guest_ip = ntohl(inet_addr(params->guest_ip)); - ndev.info.guest_netmask = ntohl(inet_addr("255.255.255.0")); - uip_init(&ndev.info); - ndev.ops = &uip_ops; + ndev->info.host_ip = ntohl(inet_addr(params->host_ip)); + ndev->info.guest_ip = ntohl(inet_addr(params->guest_ip)); + ndev->info.guest_netmask = ntohl(inet_addr("255.255.255.0")); + ndev->info.buf_nr = 20, + uip_init(&ndev->info); + ndev->ops = &uip_ops; } - virtio_pci__init(kvm, &ndev.vpci, &ndev, PCI_DEVICE_ID_VIRTIO_NET, VIRTIO_ID_NET); - ndev.vpci.ops = (struct virtio_pci_ops) { + virtio_pci__init(kvm, &ndev->vpci, ndev, PCI_DEVICE_ID_VIRTIO_NET, VIRTIO_ID_NET); + ndev->vpci.ops = (struct virtio_pci_ops) { .set_config = set_config, .get_config = get_config, .get_host_features = get_host_features, @@ -396,9 +409,9 @@ void virtio_net__init(const struct virtio_net_parameters *params) .get_size_vq = get_size_vq, }; - virtio_net__io_thread_init(params->kvm); + virtio_net__io_thread_init(params->kvm, ndev); - ndev.compat_id = compat__add_message("virtio-net device was not detected", + ndev->compat_id = compat__add_message("virtio-net device was not detected", "While you have requested a virtio-net device, " "the guest kernel didn't seem to detect it.\n" "Please make sure that the kernel was compiled " -- 1.7.6.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-25 11:11 [PATCH v2] kvm tools: Support multiple net devices Sasha Levin @ 2011-09-26 6:10 ` Pekka Enberg 2011-09-26 11:57 ` Asias He 1 sibling, 0 replies; 12+ messages in thread From: Pekka Enberg @ 2011-09-26 6:10 UTC (permalink / raw) To: Sasha Levin; +Cc: kvm, mingo, asias.hejun, gorcunov On Sun, Sep 25, 2011 at 2:11 PM, Sasha Levin <levinsasha928@gmail.com> wrote: > This patch adds support for multiple network devices. The command line syntax > changes to the following: > > --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] [host_ip= > [host_ip]] [guest_mac=[guest_mac]] [script=[script]] > > Each of the parameters is optional, and the config defaults to a TAP based > networking with a sequential MAC. > > Signed-off-by: Sasha Levin <levinsasha928@gmail.com> Seems reasonable. Asias, is v2 OK to merge? ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-25 11:11 [PATCH v2] kvm tools: Support multiple net devices Sasha Levin 2011-09-26 6:10 ` Pekka Enberg @ 2011-09-26 11:57 ` Asias He 2011-09-26 11:59 ` Sasha Levin 2011-09-26 14:54 ` Pekka Enberg 1 sibling, 2 replies; 12+ messages in thread From: Asias He @ 2011-09-26 11:57 UTC (permalink / raw) To: Sasha Levin; +Cc: penberg, kvm, mingo, gorcunov On 09/25/2011 07:11 PM, Sasha Levin wrote: > This patch adds support for multiple network devices. The command line syntax > changes to the following: > > --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] [host_ip= > [host_ip]] [guest_mac=[guest_mac]] [script=[script]] This syntax is actually, no? --network/-n mode=tap,guest_ip=x.x.x.x not --network/-n mode=tag guest_ip=x.x.x.x This works for me: $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ -n mode=tap,host_ip=192.168.100.1 -n mode=tap,host_ip=192.168.200.1 This does not work for me: $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ -n mode=tap host_ip=192.168.100.1 -n mode=tap host_ip=192.168.200.1 > > Each of the parameters is optional, and the config defaults to a TAP based > networking with a sequential MAC. > > Signed-off-by: Sasha Levin <levinsasha928@gmail.com> > --- > tools/kvm/builtin-run.c | 146 ++++++++++++++++++++++++++++++++------------ > tools/kvm/virtio/net.c | 155 +++++++++++++++++++++++++--------------------- > 2 files changed, 191 insertions(+), 110 deletions(-) > > diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c > index 28dc95a..070b1b6 100644 > --- a/tools/kvm/builtin-run.c > +++ b/tools/kvm/builtin-run.c > @@ -87,9 +87,12 @@ static bool sdl; > static bool balloon; > static bool using_rootfs; > static bool custom_rootfs; > +static bool no_net; > extern bool ioport_debug; > extern int active_console; > extern int debug_iodelay; > +struct virtio_net_parameters *net_params; > +int num_net_devices; > > bool do_debug_print = false; > > @@ -182,6 +185,89 @@ static int tty_parser(const struct option *opt, const char *arg, int unset) > return 0; > } > > +static inline void str_to_mac(const char *str, char *mac) > +{ > + sscanf(str, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", > + mac, mac+1, mac+2, mac+3, mac+4, mac+5); > +} > +static int set_net_param(struct virtio_net_parameters *p, const char *param, > + const char *val) > +{ > + if (strcmp(param, "guest_mac") == 0) { > + str_to_mac(val, p->guest_mac); > + } else if (strcmp(param, "mode") == 0) { > + if (!strncmp(val, "user", 4)) { > + int i; > + > + for (i = 0; i < num_net_devices; i++) > + if (net_params[i].mode == NET_MODE_USER) > + die("Only one usermode network device allowed at a time"); > + p->mode = NET_MODE_USER; > + } else if (!strncmp(val, "tap", 3)) { > + p->mode = NET_MODE_TAP; > + } else if (!strncmp(val, "none", 4)) { > + no_net = 1; > + return -1; > + } else > + die("Unkown network mode %s, please use user, tap or none", network); > + } else if (strcmp(param, "script") == 0) { > + p->script = val; > + } else if (strcmp(param, "guest_ip") == 0) { > + p->guest_ip = val; > + } else if (strcmp(param, "host_ip") == 0) { > + p->host_ip = val; > + } > + > + return 0; > +} > + > +static int netdev_parser(const struct option *opt, const char *arg, int unset) > +{ > + struct virtio_net_parameters p; > + char *buf, *cmd = NULL, *cur = NULL; > + bool on_cmd = true; > + > + if (arg) { > + buf = strdup(arg); > + if (buf == NULL) > + die("Failed allocating new net buffer"); > + cur = strtok(buf, ",="); > + } > + > + p = (struct virtio_net_parameters) { > + .guest_ip = DEFAULT_GUEST_ADDR, > + .host_ip = DEFAULT_HOST_ADDR, > + .script = DEFAULT_SCRIPT, > + .mode = NET_MODE_TAP, > + }; > + > + str_to_mac(DEFAULT_GUEST_MAC, p.guest_mac); > + p.guest_mac[5] += num_net_devices; > + > + while (cur) { > + if (on_cmd) { > + cmd = cur; > + } else { > + if (set_net_param(&p, cmd, cur) < 0) > + goto done; > + } > + on_cmd = !on_cmd; > + > + cur = strtok(NULL, ",="); > + }; > + > + num_net_devices++; > + > + net_params = realloc(net_params, num_net_devices * sizeof(*net_params)); > + if (net_params == NULL) > + die("Failed adding new network device"); > + > + net_params[num_net_devices - 1] = p; > + > +done: > + return 0; > +} > + > static int shmem_parser(const struct option *opt, const char *arg, int unset) > { > const u64 default_size = SHMEM_DEFAULT_SIZE; > @@ -339,18 +425,9 @@ static const struct option options[] = { > "Kernel command line arguments"), > > OPT_GROUP("Networking options:"), > - OPT_STRING('n', "network", &network, "user, tap, none", > - "Network to use"), > - OPT_STRING('\0', "host-ip", &host_ip, "a.b.c.d", > - "Assign this address to the host side networking"), > - OPT_STRING('\0', "guest-ip", &guest_ip, "a.b.c.d", > - "Assign this address to the guest side networking"), > - OPT_STRING('\0', "host-mac", &host_mac, "aa:bb:cc:dd:ee:ff", > - "Assign this address to the host side NIC"), > - OPT_STRING('\0', "guest-mac", &guest_mac, "aa:bb:cc:dd:ee:ff", > - "Assign this address to the guest side NIC"), > - OPT_STRING('\0', "tapscript", &script, "Script path", > - "Assign a script to process created tap device"), > + OPT_CALLBACK_DEFAULT('n', "network", NULL, "network params", > + "Create a new guest NIC", > + netdev_parser, NULL), > > OPT_GROUP("BIOS options:"), > OPT_INTEGER('\0', "vidmode", &vidmode, > @@ -615,7 +692,6 @@ void kvm_run_help(void) > > int kvm_cmd_run(int argc, const char **argv, const char *prefix) > { > - struct virtio_net_parameters net_params; > static char real_cmdline[2048], default_name[20]; > struct framebuffer *fb = NULL; > unsigned int nr_online_cpus; > @@ -823,32 +899,24 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix) > > virtio_9p__init(kvm); > > - if (strncmp(network, "none", 4)) { > - net_params.guest_ip = guest_ip; > - net_params.host_ip = host_ip; > - net_params.kvm = kvm; > - net_params.script = script; > - sscanf(guest_mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", > - net_params.guest_mac, > - net_params.guest_mac+1, > - net_params.guest_mac+2, > - net_params.guest_mac+3, > - net_params.guest_mac+4, > - net_params.guest_mac+5); > - sscanf(host_mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", > - net_params.host_mac, > - net_params.host_mac+1, > - net_params.host_mac+2, > - net_params.host_mac+3, > - net_params.host_mac+4, > - net_params.host_mac+5); > - > - if (!strncmp(network, "user", 4)) > - net_params.mode = NET_MODE_USER; > - else if (!strncmp(network, "tap", 3)) > - net_params.mode = NET_MODE_TAP; > - else > - die("Unkown network mode %s, please use -network user, tap, none", network); > + for (i = 0; i < num_net_devices; i++) { > + net_params[i].kvm = kvm; > + virtio_net__init(&net_params[i]); > + } > + > + if (num_net_devices == 0 && no_net == 0) { > + struct virtio_net_parameters net_params; > + > + net_params = (struct virtio_net_parameters) { > + .guest_ip = guest_ip, > + .host_ip = host_ip, > + .kvm = kvm, > + .script = script, > + .mode = NET_MODE_USER, > + }; > + str_to_mac(guest_mac, net_params.guest_mac); > + str_to_mac(host_mac, net_params.host_mac); > + > virtio_net__init(&net_params); > } > > diff --git a/tools/kvm/virtio/net.c b/tools/kvm/virtio/net.c > index 4700483..1e33891 100644 > --- a/tools/kvm/virtio/net.c > +++ b/tools/kvm/virtio/net.c > @@ -43,6 +43,7 @@ struct net_dev_operations { > struct net_dev { > pthread_mutex_t mutex; > struct virtio_pci vpci; > + struct list_head list; > > struct virt_queue vqs[VIRTIO_NET_NUM_QUEUES]; > struct virtio_net_config config; > @@ -64,48 +65,41 @@ struct net_dev { > > struct uip_info info; > struct net_dev_operations *ops; > + struct kvm *kvm; > }; > > -static struct net_dev ndev = { > - .mutex = PTHREAD_MUTEX_INITIALIZER, > - > - .config = { > - .status = VIRTIO_NET_S_LINK_UP, > - }, > - .info = { > - .buf_nr = 20, > - } > -}; > +static LIST_HEAD(ndevs); > > static void *virtio_net_rx_thread(void *p) > { > struct iovec iov[VIRTIO_NET_QUEUE_SIZE]; > struct virt_queue *vq; > struct kvm *kvm; > + struct net_dev *ndev = p; > u16 out, in; > u16 head; > int len; > > - kvm = p; > - vq = &ndev.vqs[VIRTIO_NET_RX_QUEUE]; > + kvm = ndev->kvm; > + vq = &ndev->vqs[VIRTIO_NET_RX_QUEUE]; > > while (1) { > > - mutex_lock(&ndev.io_rx_lock); > + mutex_lock(&ndev->io_rx_lock); > if (!virt_queue__available(vq)) > - pthread_cond_wait(&ndev.io_rx_cond, &ndev.io_rx_lock); > - mutex_unlock(&ndev.io_rx_lock); > + pthread_cond_wait(&ndev->io_rx_cond, &ndev->io_rx_lock); > + mutex_unlock(&ndev->io_rx_lock); > > while (virt_queue__available(vq)) { > > head = virt_queue__get_iov(vq, iov, &out, &in, kvm); > > - len = ndev.ops->rx(iov, in, &ndev); > + len = ndev->ops->rx(iov, in, ndev); > > virt_queue__set_used_elem(vq, head, len); > > /* We should interrupt guest right now, otherwise latency is huge. */ > - virtio_pci__signal_vq(kvm, &ndev.vpci, VIRTIO_NET_RX_QUEUE); > + virtio_pci__signal_vq(kvm, &ndev->vpci, VIRTIO_NET_RX_QUEUE); > } > > } > @@ -120,29 +114,30 @@ static void *virtio_net_tx_thread(void *p) > struct iovec iov[VIRTIO_NET_QUEUE_SIZE]; > struct virt_queue *vq; > struct kvm *kvm; > + struct net_dev *ndev = p; > u16 out, in; > u16 head; > int len; > > - kvm = p; > - vq = &ndev.vqs[VIRTIO_NET_TX_QUEUE]; > + kvm = ndev->kvm; > + vq = &ndev->vqs[VIRTIO_NET_TX_QUEUE]; > > while (1) { > - mutex_lock(&ndev.io_tx_lock); > + mutex_lock(&ndev->io_tx_lock); > if (!virt_queue__available(vq)) > - pthread_cond_wait(&ndev.io_tx_cond, &ndev.io_tx_lock); > - mutex_unlock(&ndev.io_tx_lock); > + pthread_cond_wait(&ndev->io_tx_cond, &ndev->io_tx_lock); > + mutex_unlock(&ndev->io_tx_lock); > > while (virt_queue__available(vq)) { > > head = virt_queue__get_iov(vq, iov, &out, &in, kvm); > > - len = ndev.ops->tx(iov, out, &ndev); > + len = ndev->ops->tx(iov, out, ndev); > > virt_queue__set_used_elem(vq, head, len); > } > > - virtio_pci__signal_vq(kvm, &ndev.vpci, VIRTIO_NET_TX_QUEUE); > + virtio_pci__signal_vq(kvm, &ndev->vpci, VIRTIO_NET_TX_QUEUE); > } > > pthread_exit(NULL); > @@ -151,58 +146,58 @@ static void *virtio_net_tx_thread(void *p) > > } > > -static void virtio_net_handle_callback(struct kvm *kvm, u16 queue_index) > +static void virtio_net_handle_callback(struct kvm *kvm, struct net_dev *ndev, int queue) > { > - switch (queue_index) { > + switch (queue) { > case VIRTIO_NET_TX_QUEUE: > - mutex_lock(&ndev.io_tx_lock); > - pthread_cond_signal(&ndev.io_tx_cond); > - mutex_unlock(&ndev.io_tx_lock); > + mutex_lock(&ndev->io_tx_lock); > + pthread_cond_signal(&ndev->io_tx_cond); > + mutex_unlock(&ndev->io_tx_lock); > break; > case VIRTIO_NET_RX_QUEUE: > - mutex_lock(&ndev.io_rx_lock); > - pthread_cond_signal(&ndev.io_rx_cond); > - mutex_unlock(&ndev.io_rx_lock); > + mutex_lock(&ndev->io_rx_lock); > + pthread_cond_signal(&ndev->io_rx_cond); > + mutex_unlock(&ndev->io_rx_lock); > break; > default: > - pr_warning("Unknown queue index %u", queue_index); > + pr_warning("Unknown queue index %u", queue); > } > } > > -static bool virtio_net__tap_init(const struct virtio_net_parameters *params) > +static bool virtio_net__tap_init(const struct virtio_net_parameters *params, > + struct net_dev *ndev) > { > int sock = socket(AF_INET, SOCK_STREAM, 0); > int pid, status, offload, hdr_len; > struct sockaddr_in sin = {0}; > struct ifreq ifr; > > - ndev.tap_fd = open("/dev/net/tun", O_RDWR); > - if (ndev.tap_fd < 0) { > + ndev->tap_fd = open("/dev/net/tun", O_RDWR); > + if (ndev->tap_fd < 0) { > pr_warning("Unable to open /dev/net/tun"); > goto fail; > } > > memset(&ifr, 0, sizeof(ifr)); > ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR; > - if (ioctl(ndev.tap_fd, TUNSETIFF, &ifr) < 0) { > + if (ioctl(ndev->tap_fd, TUNSETIFF, &ifr) < 0) { > pr_warning("Config tap device error. Are you root?"); > goto fail; > } > > - strncpy(ndev.tap_name, ifr.ifr_name, sizeof(ndev.tap_name)); > + strncpy(ndev->tap_name, ifr.ifr_name, sizeof(ndev->tap_name)); > > - if (ioctl(ndev.tap_fd, TUNSETNOCSUM, 1) < 0) { > + if (ioctl(ndev->tap_fd, TUNSETNOCSUM, 1) < 0) { > pr_warning("Config tap device TUNSETNOCSUM error"); > goto fail; > } > > hdr_len = sizeof(struct virtio_net_hdr); > - if (ioctl(ndev.tap_fd, TUNSETVNETHDRSZ, &hdr_len) < 0) { > + if (ioctl(ndev->tap_fd, TUNSETVNETHDRSZ, &hdr_len) < 0) > pr_warning("Config tap device TUNSETVNETHDRSZ error"); > - } > > offload = TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | TUN_F_UFO; > - if (ioctl(ndev.tap_fd, TUNSETOFFLOAD, offload) < 0) { > + if (ioctl(ndev->tap_fd, TUNSETOFFLOAD, offload) < 0) { > pr_warning("Config tap device TUNSETOFFLOAD error"); > goto fail; > } > @@ -210,7 +205,7 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) > if (strcmp(params->script, "none")) { > pid = fork(); > if (pid == 0) { > - execl(params->script, params->script, ndev.tap_name, NULL); > + execl(params->script, params->script, ndev->tap_name, NULL); > _exit(1); > } else { > waitpid(pid, &status, 0); > @@ -221,7 +216,7 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) > } > } else { > memset(&ifr, 0, sizeof(ifr)); > - strncpy(ifr.ifr_name, ndev.tap_name, sizeof(ndev.tap_name)); > + strncpy(ifr.ifr_name, ndev->tap_name, sizeof(ndev->tap_name)); > sin.sin_addr.s_addr = inet_addr(params->host_ip); > memcpy(&(ifr.ifr_addr), &sin, sizeof(ifr.ifr_addr)); > ifr.ifr_addr.sa_family = AF_INET; > @@ -232,7 +227,7 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) > } > > memset(&ifr, 0, sizeof(ifr)); > - strncpy(ifr.ifr_name, ndev.tap_name, sizeof(ndev.tap_name)); > + strncpy(ifr.ifr_name, ndev->tap_name, sizeof(ndev->tap_name)); > ioctl(sock, SIOCGIFFLAGS, &ifr); > ifr.ifr_flags |= IFF_UP | IFF_RUNNING; > if (ioctl(sock, SIOCSIFFLAGS, &ifr) < 0) > @@ -245,22 +240,22 @@ static bool virtio_net__tap_init(const struct virtio_net_parameters *params) > fail: > if (sock >= 0) > close(sock); > - if (ndev.tap_fd >= 0) > - close(ndev.tap_fd); > + if (ndev->tap_fd >= 0) > + close(ndev->tap_fd); > > return 0; > } > > -static void virtio_net__io_thread_init(struct kvm *kvm) > +static void virtio_net__io_thread_init(struct kvm *kvm, struct net_dev *ndev) > { > - pthread_mutex_init(&ndev.io_rx_lock, NULL); > - pthread_cond_init(&ndev.io_tx_cond, NULL); > + pthread_mutex_init(&ndev->io_rx_lock, NULL); > + pthread_cond_init(&ndev->io_tx_cond, NULL); > > - pthread_mutex_init(&ndev.io_rx_lock, NULL); > - pthread_cond_init(&ndev.io_tx_cond, NULL); > + pthread_mutex_init(&ndev->io_rx_lock, NULL); > + pthread_cond_init(&ndev->io_tx_cond, NULL); > > - pthread_create(&ndev.io_rx_thread, NULL, virtio_net_rx_thread, (void *)kvm); > - pthread_create(&ndev.io_tx_thread, NULL, virtio_net_tx_thread, (void *)kvm); > + pthread_create(&ndev->io_rx_thread, NULL, virtio_net_rx_thread, ndev); > + pthread_create(&ndev->io_tx_thread, NULL, virtio_net_tx_thread, ndev); > } > > static inline int tap_ops_tx(struct iovec *iov, u16 out, struct net_dev *ndev) > @@ -345,7 +340,9 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 pfn) > > static int notify_vq(struct kvm *kvm, void *dev, u32 vq) > { > - virtio_net_handle_callback(kvm, vq); > + struct net_dev *ndev = dev; > + > + virtio_net_handle_callback(kvm, ndev, vq); > > return 0; > } > @@ -365,27 +362,43 @@ static int get_size_vq(struct kvm *kvm, void *dev, u32 vq) > void virtio_net__init(const struct virtio_net_parameters *params) > { > int i; > + struct net_dev *ndev; > + > + if (!params) > + return; > + > + ndev = calloc(1, sizeof(struct net_dev)); > + if (ndev == NULL) > + die("Failed allocating ndev"); > + > + list_add_tail(&ndev->list, &ndevs); > + > + ndev->kvm = params->kvm; > + > + mutex_init(&ndev->mutex); > + ndev->config.status = VIRTIO_NET_S_LINK_UP; > > for (i = 0 ; i < 6 ; i++) { > - ndev.config.mac[i] = params->guest_mac[i]; > - ndev.info.guest_mac.addr[i] = params->guest_mac[i]; > - ndev.info.host_mac.addr[i] = params->host_mac[i]; > + ndev->config.mac[i] = params->guest_mac[i]; > + ndev->info.guest_mac.addr[i] = params->guest_mac[i]; > + ndev->info.host_mac.addr[i] = params->host_mac[i]; > } > > - ndev.mode = params->mode; > - if (ndev.mode == NET_MODE_TAP) { > - virtio_net__tap_init(params); we need to check if virtio_net__tap_init is successful. if it fails, for example lack of permission, we should exit and give up this net device. Otherwise, we will have this: $ ./kvm run -n mode=tap [ 1.490781] registered taskstats version 1 [ 1.492781] BUG: unable to handle kernel NULL pointer dereference at 0000001c [ 1.493781] IP: [<c14f3236>] virtnet_poll+0x16e/0x408 [ 1.493781] *pde = 00000000 [ 1.493781] Oops: 0000 [#1] PREEMPT SMP [ 1.493781] Modules linked in: [ 1.493781] [ 1.493781] Pid: 1, comm: swapper Tainted: G W 3.1.0-rc3+ #77 [ 1.493781] EIP: 0060:[<c14f3236>] EFLAGS: 00010286 CPU: 1 [ 1.493781] EIP is at virtnet_poll+0x16e/0x408 [ 1.493781] EAX: 00001000 EBX: db4bb0c0 ECX: db7cd778 EDX: 00001000 [ 1.493781] ESI: 00000000 EDI: db7cd6c0 EBP: db487fa8 ESP: db487f64 [ 1.493781] DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 [ 1.493781] Process swapper (pid: 1, ti=db486000 task=db450000 task.ti=db458000) [ 1.493781] Stack: [ 1.493781] db487f98 19dfb000 db5e1400 00000080 c1b0df60 db6ff000 00000000 00000010 [ 1.493781] 00000080 dbcebfe0 db5e1414 db5e1000 ffffffff fffec005 db5e1414 db906dc0 [ 1.493781] c1a39a0c db487fd4 c15e4869 fffb71f7 db906dc8 00000080 0000012c 00000000 [ 1.493781] Call Trace: [ 1.493781] [<c15e4869>] net_rx_action+0x8e/0x177 [ 1.493781] [<c1066128>] __do_softirq+0xa7/0x158 [ 1.493781] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b [ 1.493781] <IRQ> [ 1.493781] [<c1065e82>] ? _local_bh_enable_ip.isra.9+0x65/0x86 [ 1.493781] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa [ 1.493781] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a [ 1.493781] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 [ 1.493781] [<c15e5a5f>] ? __dev_open+0x96/0xa6 [ 1.493781] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e [ 1.493781] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f [ 1.493781] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 [ 1.493781] [<c1393c86>] ? extract_entropy+0x45/0x71 [ 1.493781] [<c1059e35>] ? get_parent_ip+0xb/0x31 [ 1.493781] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 [ 1.493781] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 [ 1.493781] [<c1629173>] ? tcp_set_default_congestion_control+0x8c/0x95 [ 1.493781] [<c1001159>] ? do_one_initcall+0x71/0x114 [ 1.493781] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 [ 1.493781] [<c1a9c7ab>] ? kernel_init+0xab/0x11d [ 1.493781] [<c1a9c700>] ? start_kernel+0x301/0x301 [ 1.493781] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd [ 1.493781] Code: 89 d8 e8 23 94 0e 00 8b 4d dc 89 c7 f3 a4 8b 55 dc 8b 4d d8 29 55 f0 8b 75 e0 01 d1 eb 13 8d 45 f0 89 f2 50 89 d8 e8 ae f2 ff ff <8b> 76 1c 31 c9 58 83 7d f0 00 75 e7 85 f6 89 75 e0 0f 84 6e 02 [ 1.493781] EIP: [<c14f3236>] virtnet_poll+0x16e/0x408 SS:ESP 0068:db487f64 [ 1.493781] CR2: 000000000000001c [ 1.549772] ---[ end trace 4eaa2a86a8e2da27 ]--- [ 1.550772] Kernel panic - not syncing: Fatal exception in interrupt [ 1.551772] Pid: 1, comm: swapper Tainted: G D W 3.1.0-rc3+ #77 [ 1.553771] Call Trace: [ 1.553771] [<c169ca33>] panic+0x58/0x156 [ 1.554771] [<c16a921a>] oops_end+0x8c/0x9b [ 1.555771] [<c169c4e7>] no_context+0x116/0x120 [ 1.555771] [<c169c5e1>] __bad_area_nosemaphore+0xf0/0xf8 [ 1.557771] [<c169c5f6>] bad_area_nosemaphore+0xd/0x10 [ 1.558771] [<c16aa4b5>] do_page_fault+0x174/0x2fa [ 1.559770] [<c107bad0>] ? sched_clock_local+0x10/0x14b [ 1.560770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 [ 1.561770] [<c10e9b84>] ? __kmalloc_track_caller+0xb7/0xc7 [ 1.563770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 [ 1.564770] [<c16aa341>] ? spurious_fault+0xa8/0xa8 [ 1.565770] [<c16a89d6>] error_code+0x5a/0x60 [ 1.566769] [<c16aa341>] ? spurious_fault+0xa8/0xa8 [ 1.567769] [<c14f3236>] ? virtnet_poll+0x16e/0x408 [ 1.567769] [<c15e4869>] net_rx_action+0x8e/0x177 [ 1.568769] [<c1066128>] __do_softirq+0xa7/0x158 [ 1.569769] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b [ 1.569769] <IRQ> [<c1065e82>] ? _local_bh_enable_ip.isra.9+0x65/0x86 [ 1.570769] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa [ 1.571769] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a [ 1.571769] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 [ 1.572768] [<c15e5a5f>] ? __dev_open+0x96/0xa6 [ 1.573768] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e [ 1.573768] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f [ 1.574768] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 [ 1.574768] [<c1393c86>] ? extract_entropy+0x45/0x71 [ 1.575768] [<c1059e35>] ? get_parent_ip+0xb/0x31 [ 1.576768] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 [ 1.576768] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 [ 1.577768] [<c1629173>] ? tcp_set_default_congestion_control+0x8c/0x95 [ 1.578768] [<c1001159>] ? do_one_initcall+0x71/0x114 [ 1.578768] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 [ 1.579767] [<c1a9c7ab>] ? kernel_init+0xab/0x11d [ 1.580767] [<c1a9c700>] ? start_kernel+0x301/0x301 [ 1.581767] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd [ 1.582767] Rebooting in 1 seconds.. # KVM session ended normally. > - ndev.ops = &tap_ops; > + ndev->mode = params->mode; > + if (ndev->mode == NET_MODE_TAP) { > + virtio_net__tap_init(params, ndev); > + ndev->ops = &tap_ops; > } else { > - ndev.info.host_ip = ntohl(inet_addr(params->host_ip)); > - ndev.info.guest_ip = ntohl(inet_addr(params->guest_ip)); > - ndev.info.guest_netmask = ntohl(inet_addr("255.255.255.0")); > - uip_init(&ndev.info); > - ndev.ops = &uip_ops; > + ndev->info.host_ip = ntohl(inet_addr(params->host_ip)); > + ndev->info.guest_ip = ntohl(inet_addr(params->guest_ip)); > + ndev->info.guest_netmask = ntohl(inet_addr("255.255.255.0")); > + ndev->info.buf_nr = 20, > + uip_init(&ndev->info); > + ndev->ops = &uip_ops; > } > > - virtio_pci__init(kvm, &ndev.vpci, &ndev, PCI_DEVICE_ID_VIRTIO_NET, VIRTIO_ID_NET); > - ndev.vpci.ops = (struct virtio_pci_ops) { > + virtio_pci__init(kvm, &ndev->vpci, ndev, PCI_DEVICE_ID_VIRTIO_NET, VIRTIO_ID_NET); > + ndev->vpci.ops = (struct virtio_pci_ops) { > .set_config = set_config, > .get_config = get_config, > .get_host_features = get_host_features, > @@ -396,9 +409,9 @@ void virtio_net__init(const struct virtio_net_parameters *params) > .get_size_vq = get_size_vq, > }; > > - virtio_net__io_thread_init(params->kvm); > + virtio_net__io_thread_init(params->kvm, ndev); > > - ndev.compat_id = compat__add_message("virtio-net device was not detected", > + ndev->compat_id = compat__add_message("virtio-net device was not detected", > "While you have requested a virtio-net device, " > "the guest kernel didn't seem to detect it.\n" > "Please make sure that the kernel was compiled " -- Asias He ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 11:57 ` Asias He @ 2011-09-26 11:59 ` Sasha Levin 2011-09-26 12:11 ` Asias He 2011-09-26 14:54 ` Pekka Enberg 1 sibling, 1 reply; 12+ messages in thread From: Sasha Levin @ 2011-09-26 11:59 UTC (permalink / raw) To: Asias He; +Cc: penberg, kvm, mingo, gorcunov On Mon, 2011-09-26 at 19:57 +0800, Asias He wrote: > On 09/25/2011 07:11 PM, Sasha Levin wrote: > > This patch adds support for multiple network devices. The command > line syntax > > changes to the following: > > > > --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] > [host_ip= > > [host_ip]] [guest_mac=[guest_mac]] [script=[script]] > > This syntax is actually, no? > > --network/-n mode=tap,guest_ip=x.x.x.x > > not > > --network/-n mode=tag guest_ip=x.x.x.x > > > This works for me: > $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ > -n mode=tap,host_ip=192.168.100.1 -n mode=tap,host_ip=192.168.200.1 > > This does not work for me: > $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ > -n mode=tap host_ip=192.168.100.1 -n mode=tap host_ip=192.168.200.1 Yes, with ',' ofcourse :) -- Sasha. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 11:59 ` Sasha Levin @ 2011-09-26 12:11 ` Asias He 2011-09-26 12:14 ` Sasha Levin 0 siblings, 1 reply; 12+ messages in thread From: Asias He @ 2011-09-26 12:11 UTC (permalink / raw) To: Sasha Levin; +Cc: penberg, kvm, mingo, gorcunov On 09/26/2011 07:59 PM, Sasha Levin wrote: > On Mon, 2011-09-26 at 19:57 +0800, Asias He wrote: >> On 09/25/2011 07:11 PM, Sasha Levin wrote: >>> This patch adds support for multiple network devices. The command >> line syntax >>> changes to the following: >>> >>> --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] >> [host_ip= >>> [host_ip]] [guest_mac=[guest_mac]] [script=[script]] >> >> This syntax is actually, no? >> >> --network/-n mode=tap,guest_ip=x.x.x.x >> >> not >> >> --network/-n mode=tag guest_ip=x.x.x.x >> >> >> This works for me: >> $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ >> -n mode=tap,host_ip=192.168.100.1 -n mode=tap,host_ip=192.168.200.1 >> >> This does not work for me: >> $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ >> -n mode=tap host_ip=192.168.100.1 -n mode=tap host_ip=192.168.200.1 > > Yes, with ',' ofcourse :) Sasha, Can you drop these []? There are way too many []. Although [] tells user this option is optional. --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] [host_ip= [host_ip]] [guest_mac=[guest_mac]] [script=[script]] Does this look ok? --network/-n mode=tap|user|none,guest_ip=x.x.x.x,host_ip=x.x.x.x,guest_mac=xx:xx:xx:xx:xx:xx,script=script.sh -- Asias He ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 12:11 ` Asias He @ 2011-09-26 12:14 ` Sasha Levin 2011-09-26 12:22 ` Asias He 0 siblings, 1 reply; 12+ messages in thread From: Sasha Levin @ 2011-09-26 12:14 UTC (permalink / raw) To: Asias He; +Cc: penberg, kvm, mingo, gorcunov On Mon, 2011-09-26 at 20:11 +0800, Asias He wrote: > On 09/26/2011 07:59 PM, Sasha Levin wrote: > > On Mon, 2011-09-26 at 19:57 +0800, Asias He wrote: > >> On 09/25/2011 07:11 PM, Sasha Levin wrote: > >>> This patch adds support for multiple network devices. The command > >> line syntax > >>> changes to the following: > >>> > >>> --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] > >> [host_ip= > >>> [host_ip]] [guest_mac=[guest_mac]] [script=[script]] > >> > >> This syntax is actually, no? > >> > >> --network/-n mode=tap,guest_ip=x.x.x.x > >> > >> not > >> > >> --network/-n mode=tag guest_ip=x.x.x.x > >> > >> > >> This works for me: > >> $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ > >> -n mode=tap,host_ip=192.168.100.1 -n mode=tap,host_ip=192.168.200.1 > >> > >> This does not work for me: > >> $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ > >> -n mode=tap host_ip=192.168.100.1 -n mode=tap host_ip=192.168.200.1 > > > > Yes, with ',' ofcourse :) > > Sasha, Can you drop these []? There are way too many []. Although [] > tells user this option is optional. > > --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] [host_ip= > [host_ip]] [guest_mac=[guest_mac]] [script=[script]] > > > Does this look ok? > --network/-n > mode=tap|user|none,guest_ip=x.x.x.x,host_ip=x.x.x.x,guest_mac=xx:xx:xx:xx:xx:xx,script=script.sh We really need them to specify they are optional. How about this: --network/-n [mode=tap/user/none][,guest_ip=ip][,host_ip=ip][,guest_mac=mac][,script=file] -- Sasha. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 12:14 ` Sasha Levin @ 2011-09-26 12:22 ` Asias He 0 siblings, 0 replies; 12+ messages in thread From: Asias He @ 2011-09-26 12:22 UTC (permalink / raw) To: Sasha Levin; +Cc: penberg, kvm, mingo, gorcunov On 09/26/2011 08:14 PM, Sasha Levin wrote: > On Mon, 2011-09-26 at 20:11 +0800, Asias He wrote: >> On 09/26/2011 07:59 PM, Sasha Levin wrote: >>> On Mon, 2011-09-26 at 19:57 +0800, Asias He wrote: >>>> On 09/25/2011 07:11 PM, Sasha Levin wrote: >>>>> This patch adds support for multiple network devices. The command >>>> line syntax >>>>> changes to the following: >>>>> >>>>> --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] >>>> [host_ip= >>>>> [host_ip]] [guest_mac=[guest_mac]] [script=[script]] >>>> >>>> This syntax is actually, no? >>>> >>>> --network/-n mode=tap,guest_ip=x.x.x.x >>>> >>>> not >>>> >>>> --network/-n mode=tag guest_ip=x.x.x.x >>>> >>>> >>>> This works for me: >>>> $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ >>>> -n mode=tap,host_ip=192.168.100.1 -n mode=tap,host_ip=192.168.200.1 >>>> >>>> This does not work for me: >>>> $ sudo ./kvm run -d sid.img -p root=/dev/vda1 -k bzImage \ >>>> -n mode=tap host_ip=192.168.100.1 -n mode=tap host_ip=192.168.200.1 >>> >>> Yes, with ',' ofcourse :) >> >> Sasha, Can you drop these []? There are way too many []. Although [] >> tells user this option is optional. >> >> --network/-n [mode=[tap/user/none]] [guest_ip=[guest ip]] [host_ip= >> [host_ip]] [guest_mac=[guest_mac]] [script=[script]] >> >> >> Does this look ok? >> --network/-n >> mode=tap|user|none,guest_ip=x.x.x.x,host_ip=x.x.x.x,guest_mac=xx:xx:xx:xx:xx:xx,script=script.sh > > We really need them to specify they are optional. > > How about this: > > --network/-n > [mode=tap/user/none][,guest_ip=ip][,host_ip=ip][,guest_mac=mac][,script=file] OK. -- Asias He ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 11:57 ` Asias He 2011-09-26 11:59 ` Sasha Levin @ 2011-09-26 14:54 ` Pekka Enberg 2011-09-26 15:05 ` Asias He 2011-09-26 16:21 ` Avi Kivity 1 sibling, 2 replies; 12+ messages in thread From: Pekka Enberg @ 2011-09-26 14:54 UTC (permalink / raw) To: Asias He; +Cc: Sasha Levin, kvm, mingo, gorcunov On Mon, 26 Sep 2011, Asias He wrote: > $ ./kvm run -n mode=tap > > > [ 1.490781] registered taskstats version 1 > [ 1.492781] BUG: unable to handle kernel NULL pointer dereference at > 0000001c > [ 1.493781] IP: [<c14f3236>] virtnet_poll+0x16e/0x408 > [ 1.493781] *pde = 00000000 > [ 1.493781] Oops: 0000 [#1] PREEMPT SMP > [ 1.493781] Modules linked in: > [ 1.493781] > [ 1.493781] Pid: 1, comm: swapper Tainted: G W 3.1.0-rc3+ #77 > [ 1.493781] EIP: 0060:[<c14f3236>] EFLAGS: 00010286 CPU: 1 > [ 1.493781] EIP is at virtnet_poll+0x16e/0x408 > [ 1.493781] EAX: 00001000 EBX: db4bb0c0 ECX: db7cd778 EDX: 00001000 > [ 1.493781] ESI: 00000000 EDI: db7cd6c0 EBP: db487fa8 ESP: db487f64 > [ 1.493781] DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 > [ 1.493781] Process swapper (pid: 1, ti=db486000 task=db450000 > task.ti=db458000) > [ 1.493781] Stack: > [ 1.493781] db487f98 19dfb000 db5e1400 00000080 c1b0df60 db6ff000 > 00000000 00000010 > [ 1.493781] 00000080 dbcebfe0 db5e1414 db5e1000 ffffffff fffec005 > db5e1414 db906dc0 > [ 1.493781] c1a39a0c db487fd4 c15e4869 fffb71f7 db906dc8 00000080 > 0000012c 00000000 > [ 1.493781] Call Trace: > [ 1.493781] [<c15e4869>] net_rx_action+0x8e/0x177 > [ 1.493781] [<c1066128>] __do_softirq+0xa7/0x158 > [ 1.493781] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b > [ 1.493781] <IRQ> > [ 1.493781] [<c1065e82>] ? _local_bh_enable_ip.isra.9+0x65/0x86 > [ 1.493781] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa > [ 1.493781] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a > [ 1.493781] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 > [ 1.493781] [<c15e5a5f>] ? __dev_open+0x96/0xa6 > [ 1.493781] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e > [ 1.493781] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f > [ 1.493781] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 > [ 1.493781] [<c1393c86>] ? extract_entropy+0x45/0x71 > [ 1.493781] [<c1059e35>] ? get_parent_ip+0xb/0x31 > [ 1.493781] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 > [ 1.493781] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 > [ 1.493781] [<c1629173>] ? tcp_set_default_congestion_control+0x8c/0x95 > [ 1.493781] [<c1001159>] ? do_one_initcall+0x71/0x114 > [ 1.493781] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 > [ 1.493781] [<c1a9c7ab>] ? kernel_init+0xab/0x11d > [ 1.493781] [<c1a9c700>] ? start_kernel+0x301/0x301 > [ 1.493781] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd > [ 1.493781] Code: 89 d8 e8 23 94 0e 00 8b 4d dc 89 c7 f3 a4 8b 55 dc > 8b 4d d8 29 55 f0 8b 75 e0 01 d1 eb 13 8d 45 f0 89 f2 50 89 d8 e8 ae f2 > ff ff <8b> 76 1c 31 c9 58 83 7d f0 00 75 e7 85 f6 89 75 e0 0f 84 6e 02 > [ 1.493781] EIP: [<c14f3236>] virtnet_poll+0x16e/0x408 SS:ESP > 0068:db487f64 > [ 1.493781] CR2: 000000000000001c > [ 1.549772] ---[ end trace 4eaa2a86a8e2da27 ]--- > [ 1.550772] Kernel panic - not syncing: Fatal exception in interrupt > [ 1.551772] Pid: 1, comm: swapper Tainted: G D W 3.1.0-rc3+ #77 > [ 1.553771] Call Trace: > [ 1.553771] [<c169ca33>] panic+0x58/0x156 > [ 1.554771] [<c16a921a>] oops_end+0x8c/0x9b > [ 1.555771] [<c169c4e7>] no_context+0x116/0x120 > [ 1.555771] [<c169c5e1>] __bad_area_nosemaphore+0xf0/0xf8 > [ 1.557771] [<c169c5f6>] bad_area_nosemaphore+0xd/0x10 > [ 1.558771] [<c16aa4b5>] do_page_fault+0x174/0x2fa > [ 1.559770] [<c107bad0>] ? sched_clock_local+0x10/0x14b > [ 1.560770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 > [ 1.561770] [<c10e9b84>] ? __kmalloc_track_caller+0xb7/0xc7 > [ 1.563770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 > [ 1.564770] [<c16aa341>] ? spurious_fault+0xa8/0xa8 > [ 1.565770] [<c16a89d6>] error_code+0x5a/0x60 > [ 1.566769] [<c16aa341>] ? spurious_fault+0xa8/0xa8 > [ 1.567769] [<c14f3236>] ? virtnet_poll+0x16e/0x408 > [ 1.567769] [<c15e4869>] net_rx_action+0x8e/0x177 > [ 1.568769] [<c1066128>] __do_softirq+0xa7/0x158 > [ 1.569769] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b > [ 1.569769] <IRQ> [<c1065e82>] ? _local_bh_enable_ip.isra.9+0x65/0x86 > [ 1.570769] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa > [ 1.571769] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a > [ 1.571769] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 > [ 1.572768] [<c15e5a5f>] ? __dev_open+0x96/0xa6 > [ 1.573768] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e > [ 1.573768] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f > [ 1.574768] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 > [ 1.574768] [<c1393c86>] ? extract_entropy+0x45/0x71 > [ 1.575768] [<c1059e35>] ? get_parent_ip+0xb/0x31 > [ 1.576768] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 > [ 1.576768] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 > [ 1.577768] [<c1629173>] ? tcp_set_default_congestion_control+0x8c/0x95 > [ 1.578768] [<c1001159>] ? do_one_initcall+0x71/0x114 > [ 1.578768] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 > [ 1.579767] [<c1a9c7ab>] ? kernel_init+0xab/0x11d > [ 1.580767] [<c1a9c700>] ? start_kernel+0x301/0x301 > [ 1.581767] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd > [ 1.582767] Rebooting in 1 seconds.. > # KVM session ended normally. This needs fixing before I can apply the patch, right? ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 14:54 ` Pekka Enberg @ 2011-09-26 15:05 ` Asias He 2011-09-26 16:21 ` Avi Kivity 1 sibling, 0 replies; 12+ messages in thread From: Asias He @ 2011-09-26 15:05 UTC (permalink / raw) To: Pekka Enberg; +Cc: Sasha Levin, kvm, mingo, gorcunov On 09/26/2011 10:54 PM, Pekka Enberg wrote: > On Mon, 26 Sep 2011, Asias He wrote: >> $ ./kvm run -n mode=tap >> >> >> [ 1.490781] registered taskstats version 1 >> [ 1.492781] BUG: unable to handle kernel NULL pointer dereference at >> 0000001c >> [ 1.493781] IP: [<c14f3236>] virtnet_poll+0x16e/0x408 >> [ 1.493781] *pde = 00000000 >> [ 1.493781] Oops: 0000 [#1] PREEMPT SMP >> [ 1.493781] Modules linked in: >> [ 1.493781] >> [ 1.493781] Pid: 1, comm: swapper Tainted: G W 3.1.0-rc3+ #77 >> [ 1.493781] EIP: 0060:[<c14f3236>] EFLAGS: 00010286 CPU: 1 >> [ 1.493781] EIP is at virtnet_poll+0x16e/0x408 >> [ 1.493781] EAX: 00001000 EBX: db4bb0c0 ECX: db7cd778 EDX: 00001000 >> [ 1.493781] ESI: 00000000 EDI: db7cd6c0 EBP: db487fa8 ESP: db487f64 >> [ 1.493781] DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 >> [ 1.493781] Process swapper (pid: 1, ti=db486000 task=db450000 >> task.ti=db458000) >> [ 1.493781] Stack: >> [ 1.493781] db487f98 19dfb000 db5e1400 00000080 c1b0df60 db6ff000 >> 00000000 00000010 >> [ 1.493781] 00000080 dbcebfe0 db5e1414 db5e1000 ffffffff fffec005 >> db5e1414 db906dc0 >> [ 1.493781] c1a39a0c db487fd4 c15e4869 fffb71f7 db906dc8 00000080 >> 0000012c 00000000 >> [ 1.493781] Call Trace: >> [ 1.493781] [<c15e4869>] net_rx_action+0x8e/0x177 >> [ 1.493781] [<c1066128>] __do_softirq+0xa7/0x158 >> [ 1.493781] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b >> [ 1.493781] <IRQ> >> [ 1.493781] [<c1065e82>] ? _local_bh_enable_ip.isra.9+0x65/0x86 >> [ 1.493781] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa >> [ 1.493781] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a >> [ 1.493781] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 >> [ 1.493781] [<c15e5a5f>] ? __dev_open+0x96/0xa6 >> [ 1.493781] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e >> [ 1.493781] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f >> [ 1.493781] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 >> [ 1.493781] [<c1393c86>] ? extract_entropy+0x45/0x71 >> [ 1.493781] [<c1059e35>] ? get_parent_ip+0xb/0x31 >> [ 1.493781] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 >> [ 1.493781] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 >> [ 1.493781] [<c1629173>] ? >> tcp_set_default_congestion_control+0x8c/0x95 >> [ 1.493781] [<c1001159>] ? do_one_initcall+0x71/0x114 >> [ 1.493781] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 >> [ 1.493781] [<c1a9c7ab>] ? kernel_init+0xab/0x11d >> [ 1.493781] [<c1a9c700>] ? start_kernel+0x301/0x301 >> [ 1.493781] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd >> [ 1.493781] Code: 89 d8 e8 23 94 0e 00 8b 4d dc 89 c7 f3 a4 8b 55 dc >> 8b 4d d8 29 55 f0 8b 75 e0 01 d1 eb 13 8d 45 f0 89 f2 50 89 d8 e8 ae f2 >> ff ff <8b> 76 1c 31 c9 58 83 7d f0 00 75 e7 85 f6 89 75 e0 0f 84 6e 02 >> [ 1.493781] EIP: [<c14f3236>] virtnet_poll+0x16e/0x408 SS:ESP >> 0068:db487f64 >> [ 1.493781] CR2: 000000000000001c >> [ 1.549772] ---[ end trace 4eaa2a86a8e2da27 ]--- >> [ 1.550772] Kernel panic - not syncing: Fatal exception in interrupt >> [ 1.551772] Pid: 1, comm: swapper Tainted: G D W 3.1.0-rc3+ #77 >> [ 1.553771] Call Trace: >> [ 1.553771] [<c169ca33>] panic+0x58/0x156 >> [ 1.554771] [<c16a921a>] oops_end+0x8c/0x9b >> [ 1.555771] [<c169c4e7>] no_context+0x116/0x120 >> [ 1.555771] [<c169c5e1>] __bad_area_nosemaphore+0xf0/0xf8 >> [ 1.557771] [<c169c5f6>] bad_area_nosemaphore+0xd/0x10 >> [ 1.558771] [<c16aa4b5>] do_page_fault+0x174/0x2fa >> [ 1.559770] [<c107bad0>] ? sched_clock_local+0x10/0x14b >> [ 1.560770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 >> [ 1.561770] [<c10e9b84>] ? __kmalloc_track_caller+0xb7/0xc7 >> [ 1.563770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 >> [ 1.564770] [<c16aa341>] ? spurious_fault+0xa8/0xa8 >> [ 1.565770] [<c16a89d6>] error_code+0x5a/0x60 >> [ 1.566769] [<c16aa341>] ? spurious_fault+0xa8/0xa8 >> [ 1.567769] [<c14f3236>] ? virtnet_poll+0x16e/0x408 >> [ 1.567769] [<c15e4869>] net_rx_action+0x8e/0x177 >> [ 1.568769] [<c1066128>] __do_softirq+0xa7/0x158 >> [ 1.569769] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b >> [ 1.569769] <IRQ> [<c1065e82>] ? >> _local_bh_enable_ip.isra.9+0x65/0x86 >> [ 1.570769] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa >> [ 1.571769] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a >> [ 1.571769] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 >> [ 1.572768] [<c15e5a5f>] ? __dev_open+0x96/0xa6 >> [ 1.573768] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e >> [ 1.573768] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f >> [ 1.574768] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 >> [ 1.574768] [<c1393c86>] ? extract_entropy+0x45/0x71 >> [ 1.575768] [<c1059e35>] ? get_parent_ip+0xb/0x31 >> [ 1.576768] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 >> [ 1.576768] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 >> [ 1.577768] [<c1629173>] ? >> tcp_set_default_congestion_control+0x8c/0x95 >> [ 1.578768] [<c1001159>] ? do_one_initcall+0x71/0x114 >> [ 1.578768] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 >> [ 1.579767] [<c1a9c7ab>] ? kernel_init+0xab/0x11d >> [ 1.580767] [<c1a9c700>] ? start_kernel+0x301/0x301 >> [ 1.581767] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd >> [ 1.582767] Rebooting in 1 seconds.. >> # KVM session ended normally. > > This needs fixing before I can apply the patch, right? Yup. I think so. -- Asias He ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 14:54 ` Pekka Enberg 2011-09-26 15:05 ` Asias He @ 2011-09-26 16:21 ` Avi Kivity 2011-09-26 16:37 ` Sasha Levin 1 sibling, 1 reply; 12+ messages in thread From: Avi Kivity @ 2011-09-26 16:21 UTC (permalink / raw) To: Pekka Enberg; +Cc: Asias He, Sasha Levin, kvm, mingo, gorcunov On 09/26/2011 05:54 PM, Pekka Enberg wrote: > On Mon, 26 Sep 2011, Asias He wrote: >> $ ./kvm run -n mode=tap >> >> >> [ 1.490781] registered taskstats version 1 >> [ 1.492781] BUG: unable to handle kernel NULL pointer dereference at >> 0000001c >> [ 1.493781] IP: [<c14f3236>] virtnet_poll+0x16e/0x408 >> [ 1.493781] *pde = 00000000 >> [ 1.493781] Oops: 0000 [#1] PREEMPT SMP >> [ 1.493781] Modules linked in: >> [ 1.493781] >> [ 1.493781] Pid: 1, comm: swapper Tainted: G W 3.1.0-rc3+ >> #77 >> [ 1.493781] EIP: 0060:[<c14f3236>] EFLAGS: 00010286 CPU: 1 >> [ 1.493781] EIP is at virtnet_poll+0x16e/0x408 >> [ 1.493781] EAX: 00001000 EBX: db4bb0c0 ECX: db7cd778 EDX: 00001000 >> [ 1.493781] ESI: 00000000 EDI: db7cd6c0 EBP: db487fa8 ESP: db487f64 >> [ 1.493781] DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 >> [ 1.493781] Process swapper (pid: 1, ti=db486000 task=db450000 >> task.ti=db458000) >> [ 1.493781] Stack: >> [ 1.493781] db487f98 19dfb000 db5e1400 00000080 c1b0df60 db6ff000 >> 00000000 00000010 >> [ 1.493781] 00000080 dbcebfe0 db5e1414 db5e1000 ffffffff fffec005 >> db5e1414 db906dc0 >> [ 1.493781] c1a39a0c db487fd4 c15e4869 fffb71f7 db906dc8 00000080 >> 0000012c 00000000 >> [ 1.493781] Call Trace: >> [ 1.493781] [<c15e4869>] net_rx_action+0x8e/0x177 >> [ 1.493781] [<c1066128>] __do_softirq+0xa7/0x158 >> [ 1.493781] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b >> [ 1.493781] <IRQ> >> [ 1.493781] [<c1065e82>] ? _local_bh_enable_ip.isra.9+0x65/0x86 >> [ 1.493781] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa >> [ 1.493781] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a >> [ 1.493781] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 >> [ 1.493781] [<c15e5a5f>] ? __dev_open+0x96/0xa6 >> [ 1.493781] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e >> [ 1.493781] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f >> [ 1.493781] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 >> [ 1.493781] [<c1393c86>] ? extract_entropy+0x45/0x71 >> [ 1.493781] [<c1059e35>] ? get_parent_ip+0xb/0x31 >> [ 1.493781] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 >> [ 1.493781] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 >> [ 1.493781] [<c1629173>] ? >> tcp_set_default_congestion_control+0x8c/0x95 >> [ 1.493781] [<c1001159>] ? do_one_initcall+0x71/0x114 >> [ 1.493781] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 >> [ 1.493781] [<c1a9c7ab>] ? kernel_init+0xab/0x11d >> [ 1.493781] [<c1a9c700>] ? start_kernel+0x301/0x301 >> [ 1.493781] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd >> [ 1.493781] Code: 89 d8 e8 23 94 0e 00 8b 4d dc 89 c7 f3 a4 8b 55 dc >> 8b 4d d8 29 55 f0 8b 75 e0 01 d1 eb 13 8d 45 f0 89 f2 50 89 d8 e8 ae f2 >> ff ff <8b> 76 1c 31 c9 58 83 7d f0 00 75 e7 85 f6 89 75 e0 0f 84 6e 02 >> [ 1.493781] EIP: [<c14f3236>] virtnet_poll+0x16e/0x408 SS:ESP >> 0068:db487f64 >> [ 1.493781] CR2: 000000000000001c >> [ 1.549772] ---[ end trace 4eaa2a86a8e2da27 ]--- >> [ 1.550772] Kernel panic - not syncing: Fatal exception in interrupt >> [ 1.551772] Pid: 1, comm: swapper Tainted: G D W 3.1.0-rc3+ >> #77 >> [ 1.553771] Call Trace: >> [ 1.553771] [<c169ca33>] panic+0x58/0x156 >> [ 1.554771] [<c16a921a>] oops_end+0x8c/0x9b >> [ 1.555771] [<c169c4e7>] no_context+0x116/0x120 >> [ 1.555771] [<c169c5e1>] __bad_area_nosemaphore+0xf0/0xf8 >> [ 1.557771] [<c169c5f6>] bad_area_nosemaphore+0xd/0x10 >> [ 1.558771] [<c16aa4b5>] do_page_fault+0x174/0x2fa >> [ 1.559770] [<c107bad0>] ? sched_clock_local+0x10/0x14b >> [ 1.560770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 >> [ 1.561770] [<c10e9b84>] ? __kmalloc_track_caller+0xb7/0xc7 >> [ 1.563770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 >> [ 1.564770] [<c16aa341>] ? spurious_fault+0xa8/0xa8 >> [ 1.565770] [<c16a89d6>] error_code+0x5a/0x60 >> [ 1.566769] [<c16aa341>] ? spurious_fault+0xa8/0xa8 >> [ 1.567769] [<c14f3236>] ? virtnet_poll+0x16e/0x408 >> [ 1.567769] [<c15e4869>] net_rx_action+0x8e/0x177 >> [ 1.568769] [<c1066128>] __do_softirq+0xa7/0x158 >> [ 1.569769] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b >> [ 1.569769] <IRQ> [<c1065e82>] ? >> _local_bh_enable_ip.isra.9+0x65/0x86 >> [ 1.570769] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa >> [ 1.571769] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a >> [ 1.571769] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 >> [ 1.572768] [<c15e5a5f>] ? __dev_open+0x96/0xa6 >> [ 1.573768] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e >> [ 1.573768] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f >> [ 1.574768] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 >> [ 1.574768] [<c1393c86>] ? extract_entropy+0x45/0x71 >> [ 1.575768] [<c1059e35>] ? get_parent_ip+0xb/0x31 >> [ 1.576768] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 >> [ 1.576768] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 >> [ 1.577768] [<c1629173>] ? >> tcp_set_default_congestion_control+0x8c/0x95 >> [ 1.578768] [<c1001159>] ? do_one_initcall+0x71/0x114 >> [ 1.578768] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 >> [ 1.579767] [<c1a9c7ab>] ? kernel_init+0xab/0x11d >> [ 1.580767] [<c1a9c700>] ? start_kernel+0x301/0x301 >> [ 1.581767] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd >> [ 1.582767] Rebooting in 1 seconds.. >> # KVM session ended normally. > > This needs fixing before I can apply the patch, right? Looks like a guest kernel bug, no? -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 16:21 ` Avi Kivity @ 2011-09-26 16:37 ` Sasha Levin 2011-09-26 16:46 ` Pekka Enberg 0 siblings, 1 reply; 12+ messages in thread From: Sasha Levin @ 2011-09-26 16:37 UTC (permalink / raw) To: Avi Kivity; +Cc: Pekka Enberg, Asias He, kvm, mingo, gorcunov On Mon, 2011-09-26 at 19:21 +0300, Avi Kivity wrote: > On 09/26/2011 05:54 PM, Pekka Enberg wrote: > > On Mon, 26 Sep 2011, Asias He wrote: > >> $ ./kvm run -n mode=tap > >> > >> > >> [ 1.490781] registered taskstats version 1 > >> [ 1.492781] BUG: unable to handle kernel NULL pointer dereference at > >> 0000001c > >> [ 1.493781] IP: [<c14f3236>] virtnet_poll+0x16e/0x408 > >> [ 1.493781] *pde = 00000000 > >> [ 1.493781] Oops: 0000 [#1] PREEMPT SMP > >> [ 1.493781] Modules linked in: > >> [ 1.493781] > >> [ 1.493781] Pid: 1, comm: swapper Tainted: G W 3.1.0-rc3+ > >> #77 > >> [ 1.493781] EIP: 0060:[<c14f3236>] EFLAGS: 00010286 CPU: 1 > >> [ 1.493781] EIP is at virtnet_poll+0x16e/0x408 > >> [ 1.493781] EAX: 00001000 EBX: db4bb0c0 ECX: db7cd778 EDX: 00001000 > >> [ 1.493781] ESI: 00000000 EDI: db7cd6c0 EBP: db487fa8 ESP: db487f64 > >> [ 1.493781] DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 > >> [ 1.493781] Process swapper (pid: 1, ti=db486000 task=db450000 > >> task.ti=db458000) > >> [ 1.493781] Stack: > >> [ 1.493781] db487f98 19dfb000 db5e1400 00000080 c1b0df60 db6ff000 > >> 00000000 00000010 > >> [ 1.493781] 00000080 dbcebfe0 db5e1414 db5e1000 ffffffff fffec005 > >> db5e1414 db906dc0 > >> [ 1.493781] c1a39a0c db487fd4 c15e4869 fffb71f7 db906dc8 00000080 > >> 0000012c 00000000 > >> [ 1.493781] Call Trace: > >> [ 1.493781] [<c15e4869>] net_rx_action+0x8e/0x177 > >> [ 1.493781] [<c1066128>] __do_softirq+0xa7/0x158 > >> [ 1.493781] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b > >> [ 1.493781] <IRQ> > >> [ 1.493781] [<c1065e82>] ? _local_bh_enable_ip.isra.9+0x65/0x86 > >> [ 1.493781] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa > >> [ 1.493781] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a > >> [ 1.493781] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 > >> [ 1.493781] [<c15e5a5f>] ? __dev_open+0x96/0xa6 > >> [ 1.493781] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e > >> [ 1.493781] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f > >> [ 1.493781] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 > >> [ 1.493781] [<c1393c86>] ? extract_entropy+0x45/0x71 > >> [ 1.493781] [<c1059e35>] ? get_parent_ip+0xb/0x31 > >> [ 1.493781] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 > >> [ 1.493781] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 > >> [ 1.493781] [<c1629173>] ? > >> tcp_set_default_congestion_control+0x8c/0x95 > >> [ 1.493781] [<c1001159>] ? do_one_initcall+0x71/0x114 > >> [ 1.493781] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 > >> [ 1.493781] [<c1a9c7ab>] ? kernel_init+0xab/0x11d > >> [ 1.493781] [<c1a9c700>] ? start_kernel+0x301/0x301 > >> [ 1.493781] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd > >> [ 1.493781] Code: 89 d8 e8 23 94 0e 00 8b 4d dc 89 c7 f3 a4 8b 55 dc > >> 8b 4d d8 29 55 f0 8b 75 e0 01 d1 eb 13 8d 45 f0 89 f2 50 89 d8 e8 ae f2 > >> ff ff <8b> 76 1c 31 c9 58 83 7d f0 00 75 e7 85 f6 89 75 e0 0f 84 6e 02 > >> [ 1.493781] EIP: [<c14f3236>] virtnet_poll+0x16e/0x408 SS:ESP > >> 0068:db487f64 > >> [ 1.493781] CR2: 000000000000001c > >> [ 1.549772] ---[ end trace 4eaa2a86a8e2da27 ]--- > >> [ 1.550772] Kernel panic - not syncing: Fatal exception in interrupt > >> [ 1.551772] Pid: 1, comm: swapper Tainted: G D W 3.1.0-rc3+ > >> #77 > >> [ 1.553771] Call Trace: > >> [ 1.553771] [<c169ca33>] panic+0x58/0x156 > >> [ 1.554771] [<c16a921a>] oops_end+0x8c/0x9b > >> [ 1.555771] [<c169c4e7>] no_context+0x116/0x120 > >> [ 1.555771] [<c169c5e1>] __bad_area_nosemaphore+0xf0/0xf8 > >> [ 1.557771] [<c169c5f6>] bad_area_nosemaphore+0xd/0x10 > >> [ 1.558771] [<c16aa4b5>] do_page_fault+0x174/0x2fa > >> [ 1.559770] [<c107bad0>] ? sched_clock_local+0x10/0x14b > >> [ 1.560770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 > >> [ 1.561770] [<c10e9b84>] ? __kmalloc_track_caller+0xb7/0xc7 > >> [ 1.563770] [<c15db33f>] ? __netdev_alloc_skb+0x17/0x34 > >> [ 1.564770] [<c16aa341>] ? spurious_fault+0xa8/0xa8 > >> [ 1.565770] [<c16a89d6>] error_code+0x5a/0x60 > >> [ 1.566769] [<c16aa341>] ? spurious_fault+0xa8/0xa8 > >> [ 1.567769] [<c14f3236>] ? virtnet_poll+0x16e/0x408 > >> [ 1.567769] [<c15e4869>] net_rx_action+0x8e/0x177 > >> [ 1.568769] [<c1066128>] __do_softirq+0xa7/0x158 > >> [ 1.569769] [<c1066081>] ? __tasklet_hi_schedule_first+0x2b/0x2b > >> [ 1.569769] <IRQ> [<c1065e82>] ? > >> _local_bh_enable_ip.isra.9+0x65/0x86 > >> [ 1.570769] [<c1065eab>] ? local_bh_enable_ip+0x8/0xa > >> [ 1.571769] [<c16a7a78>] ? _raw_spin_unlock_bh+0x18/0x1a > >> [ 1.571769] [<c15e59c5>] ? dev_set_rx_mode+0x22/0x26 > >> [ 1.572768] [<c15e5a5f>] ? __dev_open+0x96/0xa6 > >> [ 1.573768] [<c15e5c23>] ? __dev_change_flags+0x97/0x10e > >> [ 1.573768] [<c15e5cfe>] ? dev_change_flags+0x13/0x3f > >> [ 1.574768] [<c1acfe6f>] ? ip_auto_config+0x160/0xcf8 > >> [ 1.574768] [<c1393c86>] ? extract_entropy+0x45/0x71 > >> [ 1.575768] [<c1059e35>] ? get_parent_ip+0xb/0x31 > >> [ 1.576768] [<c16aa6b7>] ? sub_preempt_count+0x7c/0x89 > >> [ 1.576768] [<c16a7d24>] ? _raw_spin_unlock+0x1c/0x27 > >> [ 1.577768] [<c1629173>] ? > >> tcp_set_default_congestion_control+0x8c/0x95 > >> [ 1.578768] [<c1001159>] ? do_one_initcall+0x71/0x114 > >> [ 1.578768] [<c1acfd0f>] ? root_nfs_parse_addr+0x91/0x91 > >> [ 1.579767] [<c1a9c7ab>] ? kernel_init+0xab/0x11d > >> [ 1.580767] [<c1a9c700>] ? start_kernel+0x301/0x301 > >> [ 1.581767] [<c16acfb6>] ? kernel_thread_helper+0x6/0xd > >> [ 1.582767] Rebooting in 1 seconds.. > >> # KVM session ended normally. > > > > This needs fixing before I can apply the patch, right? > > Looks like a guest kernel bug, no? It's a kernel bug and should be fixed there, but it's caused by us not passing sane values to virtio-net, which we can fix on our side as well. So my plan is to prevent triggering it from within kvm tools while working on a kernel patch. -- Sasha. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] kvm tools: Support multiple net devices 2011-09-26 16:37 ` Sasha Levin @ 2011-09-26 16:46 ` Pekka Enberg 0 siblings, 0 replies; 12+ messages in thread From: Pekka Enberg @ 2011-09-26 16:46 UTC (permalink / raw) To: Sasha Levin; +Cc: Avi Kivity, Asias He, kvm, mingo, gorcunov On Mon, Sep 26, 2011 at 7:37 PM, Sasha Levin <levinsasha928@gmail.com> wrote: >> > This needs fixing before I can apply the patch, right? >> >> Looks like a guest kernel bug, no? > > It's a kernel bug and should be fixed there, but it's caused by us not > passing sane values to virtio-net, which we can fix on our side as well. > > So my plan is to prevent triggering it from within kvm tools while > working on a kernel patch. Yup, that's what I meant as well. Even if it is a kernel issue, we should do enough validation on our side not to trigger it so easily. Pekka ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2011-09-26 16:46 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-09-25 11:11 [PATCH v2] kvm tools: Support multiple net devices Sasha Levin 2011-09-26 6:10 ` Pekka Enberg 2011-09-26 11:57 ` Asias He 2011-09-26 11:59 ` Sasha Levin 2011-09-26 12:11 ` Asias He 2011-09-26 12:14 ` Sasha Levin 2011-09-26 12:22 ` Asias He 2011-09-26 14:54 ` Pekka Enberg 2011-09-26 15:05 ` Asias He 2011-09-26 16:21 ` Avi Kivity 2011-09-26 16:37 ` Sasha Levin 2011-09-26 16:46 ` Pekka Enberg
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox