[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 05/14] virtio-pci: reduce modern_mem_bar size
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 05/14] virtio-pci: reduce modern_mem_bar size |
Date: |
Fri, 9 Sep 2016 23:34:20 +0300 |
From: Marcel Apfelbaum <address@hidden>
Currently each VQ Notification Virtio Capability is allocated
on a different page. The idea is to enable split drivers within
guests, however there are no known plans to do that.
The allocation will result in a 8MB BAR, more than various
guest firmwares pre-allocates for PCI Bridges hotplug process.
Reserve 4 bytes per VQ by default and add a new parameter
"page-per-vq" to be used with split drivers.
Signed-off-by: Marcel Apfelbaum <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
hw/virtio/virtio-pci.h | 5 +++++
include/hw/compat.h | 6 +++++-
hw/virtio/virtio-pci.c | 22 +++++++++++++++-------
3 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
index 25fbf8a..a745512 100644
--- a/hw/virtio/virtio-pci.h
+++ b/hw/virtio/virtio-pci.h
@@ -64,6 +64,7 @@ enum {
VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT,
VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT,
VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT,
+ VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT,
};
/* Need to activate work-arounds for buggy guests at vmstate load. */
@@ -84,6 +85,10 @@ enum {
#define VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY \
(1 << VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT)
+/* page per vq flag to be used by split drivers within guests */
+#define VIRTIO_PCI_FLAG_PAGE_PER_VQ \
+ (1 << VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT)
+
typedef struct {
MSIMessage msg;
int virq;
diff --git a/include/hw/compat.h b/include/hw/compat.h
index 08dd4fb..a1d6694 100644
--- a/include/hw/compat.h
+++ b/include/hw/compat.h
@@ -2,7 +2,11 @@
#define HW_COMPAT_H
#define HW_COMPAT_2_7 \
- /* empty */
+ {\
+ .driver = "virtio-pci",\
+ .property = "page-per-vq",\
+ .value = "on",\
+ },
#define HW_COMPAT_2_6 \
{\
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 268fd8e..89bc196 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -294,6 +294,12 @@ static void virtio_pci_ioeventfd_set_disabled(DeviceState
*d, bool disabled)
#define QEMU_VIRTIO_PCI_QUEUE_MEM_MULT 0x1000
+static inline int virtio_pci_queue_mem_mult(struct VirtIOPCIProxy *proxy)
+{
+ return (proxy->flags & VIRTIO_PCI_FLAG_PAGE_PER_VQ) ?
+ QEMU_VIRTIO_PCI_QUEUE_MEM_MULT : 4;
+}
+
static int virtio_pci_ioeventfd_assign(DeviceState *d, EventNotifier *notifier,
int n, bool assign)
{
@@ -307,7 +313,7 @@ static int virtio_pci_ioeventfd_assign(DeviceState *d,
EventNotifier *notifier,
MemoryRegion *modern_mr = &proxy->notify.mr;
MemoryRegion *modern_notify_mr = &proxy->notify_pio.mr;
MemoryRegion *legacy_mr = &proxy->bar;
- hwaddr modern_addr = QEMU_VIRTIO_PCI_QUEUE_MEM_MULT *
+ hwaddr modern_addr = virtio_pci_queue_mem_mult(proxy) *
virtio_get_queue_index(vq);
hwaddr legacy_addr = VIRTIO_PCI_QUEUE_NOTIFY;
@@ -1370,7 +1376,8 @@ static void virtio_pci_notify_write(void *opaque, hwaddr
addr,
uint64_t val, unsigned size)
{
VirtIODevice *vdev = opaque;
- unsigned queue = addr / QEMU_VIRTIO_PCI_QUEUE_MEM_MULT;
+ VirtIOPCIProxy *proxy = VIRTIO_PCI(DEVICE(vdev)->parent_bus->parent);
+ unsigned queue = addr / virtio_pci_queue_mem_mult(proxy);
if (queue < VIRTIO_QUEUE_MAX) {
virtio_queue_notify(vdev, queue);
@@ -1609,7 +1616,7 @@ static void virtio_pci_device_plugged(DeviceState *d,
Error **errp)
struct virtio_pci_notify_cap notify = {
.cap.cap_len = sizeof notify,
.notify_off_multiplier =
- cpu_to_le32(QEMU_VIRTIO_PCI_QUEUE_MEM_MULT),
+ cpu_to_le32(virtio_pci_queue_mem_mult(proxy)),
};
struct virtio_pci_cfg_cap cfg = {
.cap.cap_len = sizeof cfg,
@@ -1744,8 +1751,7 @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error
**errp)
proxy->device.type = VIRTIO_PCI_CAP_DEVICE_CFG;
proxy->notify.offset = 0x3000;
- proxy->notify.size =
- QEMU_VIRTIO_PCI_QUEUE_MEM_MULT * VIRTIO_QUEUE_MAX;
+ proxy->notify.size = virtio_pci_queue_mem_mult(proxy) * VIRTIO_QUEUE_MAX;
proxy->notify.type = VIRTIO_PCI_CAP_NOTIFY_CFG;
proxy->notify_pio.offset = 0x0;
@@ -1754,8 +1760,8 @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error
**errp)
/* subclasses can enforce modern, so do this unconditionally */
memory_region_init(&proxy->modern_bar, OBJECT(proxy), "virtio-pci",
- 2 * QEMU_VIRTIO_PCI_QUEUE_MEM_MULT *
- VIRTIO_QUEUE_MAX);
+ /* PCI BAR regions must be powers of 2 */
+ pow2ceil(proxy->notify.offset + proxy->notify.size));
memory_region_init_alias(&proxy->modern_cfg,
OBJECT(proxy),
@@ -1833,6 +1839,8 @@ static Property virtio_pci_properties[] = {
VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT, false),
DEFINE_PROP_BIT("x-disable-pcie", VirtIOPCIProxy, flags,
VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT, false),
+ DEFINE_PROP_BIT("page-per-vq", VirtIOPCIProxy, flags,
+ VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT, false),
DEFINE_PROP_END_OF_LIST(),
};
--
MST
- [Qemu-devel] [PULL 00/14] virtio,vhost,pc: fixes and updates, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 01/14] virtio: Tell the user what went wrong when event_notifier_init failed, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 02/14] virtio-pci: use size from correct structure, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 03/14] pc: Add 2.8 machine, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 04/14] target-i386: present virtual L3 cache info for vcpus, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 06/14] virtio: zero vq->inuse in virtio_reset(), Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 05/14] virtio-pci: reduce modern_mem_bar size,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL 08/14] virtio: add virtqueue_rewind(), Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 09/14] virtio-balloon: fix stats vq migration, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 07/14] virtio-balloon: discard virtqueue element on reset, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 10/14] virtio-pci: error out when both legacy and modern modes are disabled, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 14/14] tests/acpi: speedup acpi tests, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 13/14] vhost-vsock: add virtio sockets device, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 12/14] virtio-pci: minor refactoring, Michael S. Tsirkin, 2016/09/09
- [Qemu-devel] [PULL 11/14] vhost: don't set vring call if no vector, Michael S. Tsirkin, 2016/09/09
- Re: [Qemu-devel] [PULL 00/14] virtio,vhost,pc: fixes and updates, Michael S. Tsirkin, 2016/09/09