@@ -709,7 +709,10 @@ VirtIODevice *virtio_net_init(DeviceState *dev)
n->mac_table.macs = qemu_mallocz(MAC_TABLE_ENTRIES * ETH_ALEN);
n->vlans = qemu_mallocz(MAX_VLAN >> 3);
- n->vdev.nvectors = 3;
+ if (dev->nd->nvectors == NIC_NVECTORS_UNSPECIFIED)
+ n->vdev.nvectors = 3;
+ else
+ n->vdev.nvectors = dev->nd->nvectors;
register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION,
virtio_net_save, virtio_net_load, n);
@@ -2103,7 +2103,7 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
}
if (!strcmp(device, "nic")) {
static const char * const nic_params[] = {
- "vlan", "name", "macaddr", "model", NULL
+ "vlan", "name", "macaddr", "model", "vectors", NULL
};
NICInfo *nd;
uint8_t *macaddr;
@@ -2138,6 +2138,22 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
if (get_param_value(buf, sizeof(buf), "model", p)) {
nd->model = strdup(buf);
}
+ nd->nvectors = NIC_NVECTORS_UNSPECIFIED;
+ if (get_param_value(buf, sizeof(buf), "vectors", p)) {
+ char *endptr;
+ long vectors = strtol(buf, &endptr, 0);
+ if (*endptr) {
+ config_error(mon, "invalid syntax for # of vectors\n");
+ ret = -1;
+ goto out;
+ }
+ if (vectors < 0 || vectors > 0x7ffffff) {
+ config_error(mon, "invalid # of vectors\n");
+ ret = -1;
+ goto out;
+ }
+ nd->nvectors = vectors;
+ }
nd->vlan = vlan;
nd->name = name;
nd->used = 1;
@@ -83,6 +83,9 @@ int do_set_link(Monitor *mon, const char *name, const char *up_or_down);
/* NIC info */
#define MAX_NICS 8
+enum {
+ NIC_NVECTORS_UNSPECIFIED = -1
+};
struct NICInfo {
uint8_t macaddr[6];
@@ -91,6 +94,7 @@ struct NICInfo {
VLANState *vlan;
void *private;
int used;
+ int nvectors;
};
extern int nb_nics;
@@ -733,7 +733,7 @@ STEXI
ETEXI
DEF("net", HAS_ARG, QEMU_OPTION_net,
- "-net nic[,vlan=n][,macaddr=addr][,model=type][,name=str]\n"
+ "-net nic[,vlan=n][,macaddr=addr][,model=type][,name=str][,vectors=v]\n"
" create a new Network Interface Card and connect it to VLAN 'n'\n"
#ifdef CONFIG_SLIRP
"-net user[,vlan=n][,name=str][,hostname=host]\n"
@@ -767,15 +767,17 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
"-net none use it alone to have zero network devices; if no -net option\n"
" is provided, the default is '-net nic -net user'\n")
STEXI
-@item -net nic[,vlan=@var{n}][,macaddr=@var{addr}][,model=@var{type}][,name=@var{name}]
+@item -net nic[,vlan=@var{n}][,macaddr=@var{addr}][,model=@var{type}][,name=@var{name}][,vectors=@var{v}]
Create a new Network Interface Card and connect it to VLAN @var{n} (@var{n}
= 0 is the default). The NIC is an ne2k_pci by default on the PC
target. Optionally, the MAC address can be changed to @var{addr}
-and a @var{name} can be assigned for use in monitor commands. If no
-@option{-net} option is specified, a single NIC is created.
-Qemu can emulate several different models of network card.
+and a @var{name} can be assigned for use in monitor commands.
+Optionally, for PCI cards, you can specify the number @var{v} of MSI-X vectors
+that the card should have; this option currently only affects virtio cards; set
+@var{v} = 0 to disable MSI-X. If no @option{-net} option is specified, a single
+NIC is created. Qemu can emulate several different models of network card.
Valid values for @var{type} are
-@code{i82551}, @code{i82557b}, @code{i82559er},
+@code{virtio}, @code{i82551}, @code{i82557b}, @code{i82559er},
@code{ne2k_pci}, @code{ne2k_isa}, @code{pcnet}, @code{rtl8139},
@code{e1000}, @code{smc91c111}, @code{lance} and @code{mcf_fec}.
Not all devices are supported on all targets. Use -net nic,model=?
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> --- hw/virtio-net.c | 5 ++++- net.c | 18 +++++++++++++++++- net.h | 4 ++++ qemu-options.hx | 14 ++++++++------ 4 files changed, 33 insertions(+), 8 deletions(-)