Commit ffe6370c9f2a596814bf14e472910fe6ef7e001d
Committed by
Anthony Liguori
1 parent
566e2d3e
qemu/net: flag to control the number of vectors a nic has
Add an option to specify the number of MSI-X vectors for PCI NIC cards. This can also be used to disable MSI-X, for compatibility with old qemu. This option currently only affects virtio cards. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
4 changed files
with
33 additions
and
8 deletions
hw/virtio-net.c
| @@ -745,7 +745,10 @@ VirtIODevice *virtio_net_init(DeviceState *dev) | @@ -745,7 +745,10 @@ VirtIODevice *virtio_net_init(DeviceState *dev) | ||
| 745 | n->mac_table.macs = qemu_mallocz(MAC_TABLE_ENTRIES * ETH_ALEN); | 745 | n->mac_table.macs = qemu_mallocz(MAC_TABLE_ENTRIES * ETH_ALEN); |
| 746 | 746 | ||
| 747 | n->vlans = qemu_mallocz(MAX_VLAN >> 3); | 747 | n->vlans = qemu_mallocz(MAX_VLAN >> 3); |
| 748 | - n->vdev.nvectors = 3; | 748 | + if (dev->nd->nvectors == NIC_NVECTORS_UNSPECIFIED) |
| 749 | + n->vdev.nvectors = 3; | ||
| 750 | + else | ||
| 751 | + n->vdev.nvectors = dev->nd->nvectors; | ||
| 749 | 752 | ||
| 750 | register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION, | 753 | register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION, |
| 751 | virtio_net_save, virtio_net_load, n); | 754 | virtio_net_save, virtio_net_load, n); |
net.c
| @@ -2169,7 +2169,7 @@ int net_client_init(Monitor *mon, const char *device, const char *p) | @@ -2169,7 +2169,7 @@ int net_client_init(Monitor *mon, const char *device, const char *p) | ||
| 2169 | } | 2169 | } |
| 2170 | if (!strcmp(device, "nic")) { | 2170 | if (!strcmp(device, "nic")) { |
| 2171 | static const char * const nic_params[] = { | 2171 | static const char * const nic_params[] = { |
| 2172 | - "vlan", "name", "macaddr", "model", "addr", NULL | 2172 | + "vlan", "name", "macaddr", "model", "addr", "vectors", NULL |
| 2173 | }; | 2173 | }; |
| 2174 | NICInfo *nd; | 2174 | NICInfo *nd; |
| 2175 | uint8_t *macaddr; | 2175 | uint8_t *macaddr; |
| @@ -2207,6 +2207,22 @@ int net_client_init(Monitor *mon, const char *device, const char *p) | @@ -2207,6 +2207,22 @@ int net_client_init(Monitor *mon, const char *device, const char *p) | ||
| 2207 | if (get_param_value(buf, sizeof(buf), "addr", p)) { | 2207 | if (get_param_value(buf, sizeof(buf), "addr", p)) { |
| 2208 | nd->devaddr = strdup(buf); | 2208 | nd->devaddr = strdup(buf); |
| 2209 | } | 2209 | } |
| 2210 | + nd->nvectors = NIC_NVECTORS_UNSPECIFIED; | ||
| 2211 | + if (get_param_value(buf, sizeof(buf), "vectors", p)) { | ||
| 2212 | + char *endptr; | ||
| 2213 | + long vectors = strtol(buf, &endptr, 0); | ||
| 2214 | + if (*endptr) { | ||
| 2215 | + config_error(mon, "invalid syntax for # of vectors\n"); | ||
| 2216 | + ret = -1; | ||
| 2217 | + goto out; | ||
| 2218 | + } | ||
| 2219 | + if (vectors < 0 || vectors > 0x7ffffff) { | ||
| 2220 | + config_error(mon, "invalid # of vectors\n"); | ||
| 2221 | + ret = -1; | ||
| 2222 | + goto out; | ||
| 2223 | + } | ||
| 2224 | + nd->nvectors = vectors; | ||
| 2225 | + } | ||
| 2210 | nd->vlan = vlan; | 2226 | nd->vlan = vlan; |
| 2211 | nd->name = name; | 2227 | nd->name = name; |
| 2212 | nd->used = 1; | 2228 | nd->used = 1; |
net.h
| @@ -84,6 +84,9 @@ int do_set_link(Monitor *mon, const char *name, const char *up_or_down); | @@ -84,6 +84,9 @@ int do_set_link(Monitor *mon, const char *name, const char *up_or_down); | ||
| 84 | /* NIC info */ | 84 | /* NIC info */ |
| 85 | 85 | ||
| 86 | #define MAX_NICS 8 | 86 | #define MAX_NICS 8 |
| 87 | +enum { | ||
| 88 | + NIC_NVECTORS_UNSPECIFIED = -1 | ||
| 89 | +}; | ||
| 87 | 90 | ||
| 88 | struct NICInfo { | 91 | struct NICInfo { |
| 89 | uint8_t macaddr[6]; | 92 | uint8_t macaddr[6]; |
| @@ -94,6 +97,7 @@ struct NICInfo { | @@ -94,6 +97,7 @@ struct NICInfo { | ||
| 94 | void *private; | 97 | void *private; |
| 95 | int used; | 98 | int used; |
| 96 | int bootable; | 99 | int bootable; |
| 100 | + int nvectors; | ||
| 97 | }; | 101 | }; |
| 98 | 102 | ||
| 99 | extern int nb_nics; | 103 | extern int nb_nics; |
qemu-options.hx
| @@ -736,7 +736,7 @@ STEXI | @@ -736,7 +736,7 @@ STEXI | ||
| 736 | ETEXI | 736 | ETEXI |
| 737 | 737 | ||
| 738 | DEF("net", HAS_ARG, QEMU_OPTION_net, | 738 | DEF("net", HAS_ARG, QEMU_OPTION_net, |
| 739 | - "-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str]\n" | 739 | + "-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]\n" |
| 740 | " create a new Network Interface Card and connect it to VLAN 'n'\n" | 740 | " create a new Network Interface Card and connect it to VLAN 'n'\n" |
| 741 | #ifdef CONFIG_SLIRP | 741 | #ifdef CONFIG_SLIRP |
| 742 | "-net user[,vlan=n][,name=str][,hostname=host]\n" | 742 | "-net user[,vlan=n][,name=str][,hostname=host]\n" |
| @@ -777,16 +777,18 @@ DEF("net", HAS_ARG, QEMU_OPTION_net, | @@ -777,16 +777,18 @@ DEF("net", HAS_ARG, QEMU_OPTION_net, | ||
| 777 | "-net none use it alone to have zero network devices; if no -net option\n" | 777 | "-net none use it alone to have zero network devices; if no -net option\n" |
| 778 | " is provided, the default is '-net nic -net user'\n") | 778 | " is provided, the default is '-net nic -net user'\n") |
| 779 | STEXI | 779 | STEXI |
| 780 | -@item -net nic[,vlan=@var{n}][,macaddr=@var{mac}][,model=@var{type}][,name=@var{name}][,addr=@var{addr}] | 780 | +@item -net nic[,vlan=@var{n}][,macaddr=@var{mac}][,model=@var{type}][,name=@var{name}][,addr=@var{addr}][,vectors=@var{v}] |
| 781 | Create a new Network Interface Card and connect it to VLAN @var{n} (@var{n} | 781 | Create a new Network Interface Card and connect it to VLAN @var{n} (@var{n} |
| 782 | = 0 is the default). The NIC is an ne2k_pci by default on the PC | 782 | = 0 is the default). The NIC is an ne2k_pci by default on the PC |
| 783 | target. Optionally, the MAC address can be changed to @var{mac}, the | 783 | target. Optionally, the MAC address can be changed to @var{mac}, the |
| 784 | device address set to @var{addr} (PCI cards only), | 784 | device address set to @var{addr} (PCI cards only), |
| 785 | -and a @var{name} can be assigned for use in monitor commands. If no | ||
| 786 | -@option{-net} option is specified, a single NIC is created. | ||
| 787 | -Qemu can emulate several different models of network card. | 785 | +and a @var{name} can be assigned for use in monitor commands. |
| 786 | +Optionally, for PCI cards, you can specify the number @var{v} of MSI-X vectors | ||
| 787 | +that the card should have; this option currently only affects virtio cards; set | ||
| 788 | +@var{v} = 0 to disable MSI-X. If no @option{-net} option is specified, a single | ||
| 789 | +NIC is created. Qemu can emulate several different models of network card. | ||
| 788 | Valid values for @var{type} are | 790 | Valid values for @var{type} are |
| 789 | -@code{i82551}, @code{i82557b}, @code{i82559er}, | 791 | +@code{virtio}, @code{i82551}, @code{i82557b}, @code{i82559er}, |
| 790 | @code{ne2k_pci}, @code{ne2k_isa}, @code{pcnet}, @code{rtl8139}, | 792 | @code{ne2k_pci}, @code{ne2k_isa}, @code{pcnet}, @code{rtl8139}, |
| 791 | @code{e1000}, @code{smc91c111}, @code{lance} and @code{mcf_fec}. | 793 | @code{e1000}, @code{smc91c111}, @code{lance} and @code{mcf_fec}. |
| 792 | Not all devices are supported on all targets. Use -net nic,model=? | 794 | Not all devices are supported on all targets. Use -net nic,model=? |