xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1.1 v2 0/5] Xen patches
@ 2012-05-14 17:11 Stefano Stabellini
  2012-05-14 17:12 ` [PATCH 1.1 v2 1/5] xen: do not initialize the interval timer and PCSPK emulator Stefano Stabellini
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Stefano Stabellini @ 2012-05-14 17:11 UTC (permalink / raw)
  To: qemu-devel@nongnu.org; +Cc: xen-devel@lists.xensource.com, Stefano Stabellini

Hi all,
this patch series is a collection of the outstanding Xen patches for
QEMU 1.1: all of them have been sent to qemu-devel at least once
already, some of them as many as 6 times.

Patch 1 and 2 remove unneeded devices and timers when Xen is enabled,
patch 3, 4 and 5 are improvements and fixes for xen_disk.c.



Changes in v2:
- fix a xen_available/xen_enabled mistake in the first patch;
- add "qemu/xendisk: properly update stats in ioreq_release()".



Jan Beulich (1):
      xen_disk: properly update stats in ioreq_release()

Stefano Stabellini (4):
      xen: do not initialize the interval timer and PCSPK emulator
      xen: disable rtc_clock
      xen_disk: remove syncwrite option
      xen_disk: use bdrv_aio_flush instead of bdrv_flush

 hw/pc.c       |   23 +++++++++++++----------
 hw/xen_disk.c |   42 +++++++++++++++++++++++++++---------------
 xen-all.c     |    4 ++++
 3 files changed, 44 insertions(+), 25 deletions(-)



git://xenbits.xen.org/people/sstabellini/qemu-dm.git for_1.1

Cheers,

Stefano

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1.1 v2 1/5] xen: do not initialize the interval timer and PCSPK emulator
  2012-05-14 17:11 [PATCH 1.1 v2 0/5] Xen patches Stefano Stabellini
@ 2012-05-14 17:12 ` Stefano Stabellini
  2012-05-14 17:12 ` [PATCH 1.1 v2 2/5] xen: disable rtc_clock Stefano Stabellini
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2012-05-14 17:12 UTC (permalink / raw)
  To: qemu-devel; +Cc: xen-devel, Stefano Stabellini

PIT and PCSPK are emulated by the hypervisor so we don't need to emulate
them in Qemu: this patch prevents Qemu from waking up needlessly at
PIT_FREQ on Xen.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 hw/pc.c |   23 +++++++++++++----------
 1 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 4d34a33..a752a6b 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -47,6 +47,7 @@
 #include "ui/qemu-spice.h"
 #include "memory.h"
 #include "exec-memory.h"
+#include "arch_init.h"
 
 /* output Bochs bios info messages */
 //#define DEBUG_BIOS
@@ -1097,7 +1098,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
     qemu_irq pit_alt_irq = NULL;
     qemu_irq rtc_irq = NULL;
     qemu_irq *a20_line;
-    ISADevice *i8042, *port92, *vmmouse, *pit;
+    ISADevice *i8042, *port92, *vmmouse, *pit = NULL;
     qemu_irq *cpu_exit_irq;
 
     register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
@@ -1126,16 +1127,18 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
 
     qemu_register_boot_set(pc_boot_set, *rtc_state);
 
-    if (kvm_irqchip_in_kernel()) {
-        pit = kvm_pit_init(isa_bus, 0x40);
-    } else {
-        pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
-    }
-    if (hpet) {
-        /* connect PIT to output control line of the HPET */
-        qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
+    if (!xen_enabled()) {
+        if (kvm_irqchip_in_kernel()) {
+            pit = kvm_pit_init(isa_bus, 0x40);
+        } else {
+            pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
+        }
+        if (hpet) {
+            /* connect PIT to output control line of the HPET */
+            qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
+        }
+        pcspk_init(isa_bus, pit);
     }
-    pcspk_init(isa_bus, pit);
 
     for(i = 0; i < MAX_SERIAL_PORTS; i++) {
         if (serial_hds[i]) {
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 1.1 v2 2/5] xen: disable rtc_clock
  2012-05-14 17:11 [PATCH 1.1 v2 0/5] Xen patches Stefano Stabellini
  2012-05-14 17:12 ` [PATCH 1.1 v2 1/5] xen: do not initialize the interval timer and PCSPK emulator Stefano Stabellini
@ 2012-05-14 17:12 ` Stefano Stabellini
  2012-05-14 17:12 ` [PATCH 1.1 v2 3/5] xen_disk: remove syncwrite option Stefano Stabellini
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2012-05-14 17:12 UTC (permalink / raw)
  To: qemu-devel; +Cc: xen-devel, Stefano Stabellini

rtc_clock is only used by the RTC emulator (mc146818rtc.c), however Xen
has its own RTC emulator in the hypervisor so we can disable it.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 xen-all.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/xen-all.c b/xen-all.c
index bdf9c0f..b88ad5d 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -603,6 +603,10 @@ void xen_vcpu_init(void)
         qemu_register_reset(xen_reset_vcpu, first_cpu);
         xen_reset_vcpu(first_cpu);
     }
+    /* if rtc_clock is left to default (host_clock), disable it */
+    if (rtc_clock == host_clock) {
+        qemu_clock_enable(rtc_clock, false);
+    }
 }
 
 /* get the ioreq packets from share mem */
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 1.1 v2 3/5] xen_disk: remove syncwrite option
  2012-05-14 17:11 [PATCH 1.1 v2 0/5] Xen patches Stefano Stabellini
  2012-05-14 17:12 ` [PATCH 1.1 v2 1/5] xen: do not initialize the interval timer and PCSPK emulator Stefano Stabellini
  2012-05-14 17:12 ` [PATCH 1.1 v2 2/5] xen: disable rtc_clock Stefano Stabellini
@ 2012-05-14 17:12 ` Stefano Stabellini
  2012-05-14 17:13 ` [PATCH 1.1 v2 4/5] xen_disk: use bdrv_aio_flush instead of bdrv_flush Stefano Stabellini
  2012-05-14 17:13 ` [PATCH 1.1 v2 5/5] xen_disk: properly update stats in ioreq_release() Stefano Stabellini
  4 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2012-05-14 17:12 UTC (permalink / raw)
  To: qemu-devel; +Cc: xen-devel, Stefano Stabellini

This patch removes a dead option.

The same can be achieved removing BDRV_O_NOCACHE and BDRV_O_CACHE_WB
from the flags passed to bdrv_open.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 hw/xen_disk.c |    8 +-------
 1 files changed, 1 insertions(+), 7 deletions(-)

diff --git a/hw/xen_disk.c b/hw/xen_disk.c
index 22dbd10..49e53b7 100644
--- a/hw/xen_disk.c
+++ b/hw/xen_disk.c
@@ -48,7 +48,6 @@
 
 /* ------------------------------------------------------------- */
 
-static int syncwrite    = 0;
 static int batch_maps   = 0;
 
 static int max_requests = 32;
@@ -189,15 +188,10 @@ static int ioreq_parse(struct ioreq *ioreq)
             ioreq->presync = 1;
             return 0;
         }
-        if (!syncwrite) {
-            ioreq->presync = ioreq->postsync = 1;
-        }
+        ioreq->presync = ioreq->postsync = 1;
         /* fall through */
     case BLKIF_OP_WRITE:
         ioreq->prot = PROT_READ; /* from memory */
-        if (syncwrite) {
-            ioreq->postsync = 1;
-        }
         break;
     default:
         xen_be_printf(&blkdev->xendev, 0, "error: unknown operation (%d)\n",
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 1.1 v2 4/5] xen_disk: use bdrv_aio_flush instead of bdrv_flush
  2012-05-14 17:11 [PATCH 1.1 v2 0/5] Xen patches Stefano Stabellini
                   ` (2 preceding siblings ...)
  2012-05-14 17:12 ` [PATCH 1.1 v2 3/5] xen_disk: remove syncwrite option Stefano Stabellini
@ 2012-05-14 17:13 ` Stefano Stabellini
  2012-05-14 17:13 ` [PATCH 1.1 v2 5/5] xen_disk: properly update stats in ioreq_release() Stefano Stabellini
  4 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2012-05-14 17:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: xen-devel, Stefano Stabellini

Use bdrv_aio_flush instead of bdrv_flush.

Make sure to call bdrv_aio_writev/readv after the presync bdrv_aio_flush is fully
completed and make sure to call the postsync bdrv_aio_flush after
bdrv_aio_writev/readv is fully completed.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 hw/xen_disk.c |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/hw/xen_disk.c b/hw/xen_disk.c
index 49e53b7..cf06243 100644
--- a/hw/xen_disk.c
+++ b/hw/xen_disk.c
@@ -66,6 +66,7 @@ struct ioreq {
     QEMUIOVector        v;
     int                 presync;
     int                 postsync;
+    uint8_t             mapped;
 
     /* grant mapping */
     uint32_t            domids[BLKIF_MAX_SEGMENTS_PER_REQUEST];
@@ -242,7 +243,7 @@ static void ioreq_unmap(struct ioreq *ioreq)
     XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev;
     int i;
 
-    if (ioreq->v.niov == 0) {
+    if (ioreq->v.niov == 0 || ioreq->mapped == 0) {
         return;
     }
     if (batch_maps) {
@@ -268,6 +269,7 @@ static void ioreq_unmap(struct ioreq *ioreq)
             ioreq->page[i] = NULL;
         }
     }
+    ioreq->mapped = 0;
 }
 
 static int ioreq_map(struct ioreq *ioreq)
@@ -275,7 +277,7 @@ static int ioreq_map(struct ioreq *ioreq)
     XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev;
     int i;
 
-    if (ioreq->v.niov == 0) {
+    if (ioreq->v.niov == 0 || ioreq->mapped == 1) {
         return 0;
     }
     if (batch_maps) {
@@ -307,9 +309,12 @@ static int ioreq_map(struct ioreq *ioreq)
             ioreq->blkdev->cnt_map++;
         }
     }
+    ioreq->mapped = 1;
     return 0;
 }
 
+static int ioreq_runio_qemu_aio(struct ioreq *ioreq);
+
 static void qemu_aio_complete(void *opaque, int ret)
 {
     struct ioreq *ioreq = opaque;
@@ -321,11 +326,19 @@ static void qemu_aio_complete(void *opaque, int ret)
     }
 
     ioreq->aio_inflight--;
+    if (ioreq->presync) {
+        ioreq->presync = 0;
+        ioreq_runio_qemu_aio(ioreq);
+        return;
+    }
     if (ioreq->aio_inflight > 0) {
         return;
     }
     if (ioreq->postsync) {
-        bdrv_flush(ioreq->blkdev->bs);
+        ioreq->postsync = 0;
+        ioreq->aio_inflight++;
+        bdrv_aio_flush(ioreq->blkdev->bs, qemu_aio_complete, ioreq);
+        return;
     }
 
     ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY;
@@ -345,7 +358,8 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
 
     ioreq->aio_inflight++;
     if (ioreq->presync) {
-        bdrv_flush(blkdev->bs); /* FIXME: aio_flush() ??? */
+        bdrv_aio_flush(ioreq->blkdev->bs, qemu_aio_complete, ioreq);
+        return 0;
     }
 
     switch (ioreq->req.operation) {
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 1.1 v2 5/5] xen_disk: properly update stats in ioreq_release()
  2012-05-14 17:11 [PATCH 1.1 v2 0/5] Xen patches Stefano Stabellini
                   ` (3 preceding siblings ...)
  2012-05-14 17:13 ` [PATCH 1.1 v2 4/5] xen_disk: use bdrv_aio_flush instead of bdrv_flush Stefano Stabellini
@ 2012-05-14 17:13 ` Stefano Stabellini
  4 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2012-05-14 17:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: xen-devel, Jan Beulich, Stefano Stabellini

From: Jan Beulich <JBeulich@suse.com>

While for the "normal" case (called from blk_send_response_all())
decrementing requests_finished is correct, doing so in the parse error
case is wrong; requests_inflight needs to be decremented instead.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
---
 hw/xen_disk.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/hw/xen_disk.c b/hw/xen_disk.c
index cf06243..07594bc 100644
--- a/hw/xen_disk.c
+++ b/hw/xen_disk.c
@@ -154,7 +154,7 @@ static void ioreq_finish(struct ioreq *ioreq)
     blkdev->requests_finished++;
 }
 
-static void ioreq_release(struct ioreq *ioreq)
+static void ioreq_release(struct ioreq *ioreq, bool finish)
 {
     struct XenBlkDev *blkdev = ioreq->blkdev;
 
@@ -162,7 +162,11 @@ static void ioreq_release(struct ioreq *ioreq)
     memset(ioreq, 0, sizeof(*ioreq));
     ioreq->blkdev = blkdev;
     QLIST_INSERT_HEAD(&blkdev->freelist, ioreq, list);
-    blkdev->requests_finished--;
+    if (finish) {
+        blkdev->requests_finished--;
+    } else {
+        blkdev->requests_inflight--;
+    }
 }
 
 /*
@@ -457,7 +461,7 @@ static void blk_send_response_all(struct XenBlkDev *blkdev)
     while (!QLIST_EMPTY(&blkdev->finished)) {
         ioreq = QLIST_FIRST(&blkdev->finished);
         send_notify += blk_send_response_one(ioreq);
-        ioreq_release(ioreq);
+        ioreq_release(ioreq, true);
     }
     if (send_notify) {
         xen_be_send_notify(&blkdev->xendev);
@@ -513,7 +517,7 @@ static void blk_handle_requests(struct XenBlkDev *blkdev)
             if (blk_send_response_one(ioreq)) {
                 xen_be_send_notify(&blkdev->xendev);
             }
-            ioreq_release(ioreq);
+            ioreq_release(ioreq, false);
             continue;
         }
 
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-05-14 17:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-14 17:11 [PATCH 1.1 v2 0/5] Xen patches Stefano Stabellini
2012-05-14 17:12 ` [PATCH 1.1 v2 1/5] xen: do not initialize the interval timer and PCSPK emulator Stefano Stabellini
2012-05-14 17:12 ` [PATCH 1.1 v2 2/5] xen: disable rtc_clock Stefano Stabellini
2012-05-14 17:12 ` [PATCH 1.1 v2 3/5] xen_disk: remove syncwrite option Stefano Stabellini
2012-05-14 17:13 ` [PATCH 1.1 v2 4/5] xen_disk: use bdrv_aio_flush instead of bdrv_flush Stefano Stabellini
2012-05-14 17:13 ` [PATCH 1.1 v2 5/5] xen_disk: properly update stats in ioreq_release() Stefano Stabellini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).