Rebased to version 1.4.0
block: dataplane for virtio, potentially large performance improvment migration: threaded live migration usb-tablet: usb 2.0 support, significantly lowering CPU usage usb: improved support for pass-through of USB serial devices virtio-net: added support supports multiqueue operation
This commit is contained in:
parent
475c910487
commit
96a5f8d770
1
.gitignore
vendored
1
.gitignore
vendored
@ -17,3 +17,4 @@ qemu-kvm-0.13.0-25fdf4a.tar.gz
|
||||
/qemu-kvm-1.2.0-rc1.tar.gz
|
||||
/qemu-kvm-1.2.0.tar.gz
|
||||
/qemu-1.3.0.tar.bz2
|
||||
/qemu-1.4.0.tar.bz2
|
||||
|
@ -0,0 +1,54 @@
|
||||
From d9ba8b0f4597724179eab2d5c44c3c438bc40617 Mon Sep 17 00:00:00 2001
|
||||
From: Amit Shah <amit.shah@redhat.com>
|
||||
Date: Mon, 21 Mar 2011 21:57:47 +0100
|
||||
Subject: [PATCH] char: Split out tcp socket close code in a separate function
|
||||
|
||||
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
qemu-char.c | 25 ++++++++++++++++---------
|
||||
1 file changed, 16 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/qemu-char.c b/qemu-char.c
|
||||
index e4b0f53..d7fa7e6 100644
|
||||
--- a/qemu-char.c
|
||||
+++ b/qemu-char.c
|
||||
@@ -2155,6 +2155,21 @@ typedef struct {
|
||||
|
||||
static void tcp_chr_accept(void *opaque);
|
||||
|
||||
+static void tcp_closed(void *opaque)
|
||||
+{
|
||||
+ CharDriverState *chr = opaque;
|
||||
+ TCPCharDriver *s = chr->opaque;
|
||||
+
|
||||
+ s->connected = 0;
|
||||
+ if (s->listen_fd >= 0) {
|
||||
+ qemu_set_fd_handler2(s->listen_fd, NULL, tcp_chr_accept, NULL, chr);
|
||||
+ }
|
||||
+ qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
|
||||
+ closesocket(s->fd);
|
||||
+ s->fd = -1;
|
||||
+ qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
|
||||
+}
|
||||
+
|
||||
static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
{
|
||||
TCPCharDriver *s = chr->opaque;
|
||||
@@ -2313,15 +2328,7 @@ static void tcp_chr_read(void *opaque)
|
||||
len = s->max_size;
|
||||
size = tcp_chr_recv(chr, (void *)buf, len);
|
||||
if (size == 0) {
|
||||
- /* connection closed */
|
||||
- s->connected = 0;
|
||||
- if (s->listen_fd >= 0) {
|
||||
- qemu_set_fd_handler2(s->listen_fd, NULL, tcp_chr_accept, NULL, chr);
|
||||
- }
|
||||
- qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
|
||||
- closesocket(s->fd);
|
||||
- s->fd = -1;
|
||||
- qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
|
||||
+ tcp_closed(chr);
|
||||
} else if (size > 0) {
|
||||
if (s->do_telnetopt)
|
||||
tcp_chr_process_IAC_bytes(chr, s, buf, &size);
|
1068
0002-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch
Normal file
1068
0002-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,74 @@
|
||||
From 4dabaa88ce83dbb6ba07e8f8a2e8eeb53604b56f Mon Sep 17 00:00:00 2001
|
||||
From: Amit Shah <amit.shah@redhat.com>
|
||||
Date: Mon, 21 Mar 2011 20:32:58 +0100
|
||||
Subject: [PATCH] iohandlers: Add enable/disable_write_fd_handler() functions
|
||||
|
||||
These will be used to provide a cleaner API for the nonblocking case.
|
||||
|
||||
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
include/qemu/main-loop.h | 3 +++
|
||||
iohandler.c | 35 +++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 38 insertions(+)
|
||||
|
||||
diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h
|
||||
index e8059c3..faaf47d 100644
|
||||
--- a/include/qemu/main-loop.h
|
||||
+++ b/include/qemu/main-loop.h
|
||||
@@ -166,6 +166,9 @@ void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque);
|
||||
typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
|
||||
typedef int IOCanReadHandler(void *opaque);
|
||||
|
||||
+void enable_write_fd_handler(int fd, IOHandler *fd_write);
|
||||
+void disable_write_fd_handler(int fd);
|
||||
+
|
||||
/**
|
||||
* qemu_set_fd_handler2: Register a file descriptor with the main loop
|
||||
*
|
||||
diff --git a/iohandler.c b/iohandler.c
|
||||
index 2523adc..a49cfd4 100644
|
||||
--- a/iohandler.c
|
||||
+++ b/iohandler.c
|
||||
@@ -45,6 +45,41 @@ typedef struct IOHandlerRecord {
|
||||
static QLIST_HEAD(, IOHandlerRecord) io_handlers =
|
||||
QLIST_HEAD_INITIALIZER(io_handlers);
|
||||
|
||||
+static IOHandlerRecord *find_iohandler(int fd)
|
||||
+{
|
||||
+ IOHandlerRecord *ioh;
|
||||
+
|
||||
+ QLIST_FOREACH(ioh, &io_handlers, next) {
|
||||
+ if (ioh->fd == fd) {
|
||||
+ return ioh;
|
||||
+ }
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+void enable_write_fd_handler(int fd, IOHandler *fd_write)
|
||||
+{
|
||||
+ IOHandlerRecord *ioh;
|
||||
+
|
||||
+ ioh = find_iohandler(fd);
|
||||
+ if (!ioh) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ ioh->fd_write = fd_write;
|
||||
+}
|
||||
+
|
||||
+void disable_write_fd_handler(int fd)
|
||||
+{
|
||||
+ IOHandlerRecord *ioh;
|
||||
+
|
||||
+ ioh = find_iohandler(fd);
|
||||
+ if (!ioh) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ ioh->fd_write = NULL;
|
||||
+}
|
||||
|
||||
/* XXX: fd_read_poll should be suppressed, but an API change is
|
||||
necessary in the character devices to suppress fd_can_read(). */
|
59
0004-char-Add-framework-for-a-write-unblocked-callback.patch
Normal file
59
0004-char-Add-framework-for-a-write-unblocked-callback.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From f4be4da263d4bad7c600d847e13e69cca4ab08b6 Mon Sep 17 00:00:00 2001
|
||||
From: Amit Shah <amit.shah@redhat.com>
|
||||
Date: Mon, 21 Mar 2011 21:41:42 +0100
|
||||
Subject: [PATCH] char: Add framework for a 'write unblocked' callback
|
||||
|
||||
The char layer can let users know that the driver will block on further
|
||||
input. For users interested in not blocking, they can assign a function
|
||||
pointer that will be called back when the driver becomes writable. This
|
||||
patch just adds the function pointers to the CharDriverState structure,
|
||||
future patches will enable the nonblocking and callback functionality.
|
||||
|
||||
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
include/char/char.h | 4 ++++
|
||||
qemu-char.c | 3 +++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/include/char/char.h b/include/char/char.h
|
||||
index 3027cc1..2fee107 100644
|
||||
--- a/include/char/char.h
|
||||
+++ b/include/char/char.h
|
||||
@@ -63,6 +63,9 @@ struct CharDriverState {
|
||||
IOEventHandler *chr_event;
|
||||
IOCanReadHandler *chr_can_read;
|
||||
IOReadHandler *chr_read;
|
||||
+ IOHandler *chr_write_unblocked;
|
||||
+ void (*chr_enable_write_fd_handler)(struct CharDriverState *chr);
|
||||
+ void (*chr_disable_write_fd_handler)(struct CharDriverState *chr);
|
||||
void *handler_opaque;
|
||||
void (*chr_close)(struct CharDriverState *chr);
|
||||
void (*chr_accept_input)(struct CharDriverState *chr);
|
||||
@@ -76,6 +79,7 @@ struct CharDriverState {
|
||||
int opened;
|
||||
int avail_connections;
|
||||
QemuOpts *opts;
|
||||
+ bool write_blocked; /* Are we in a blocked state? */
|
||||
QTAILQ_ENTRY(CharDriverState) next;
|
||||
};
|
||||
|
||||
diff --git a/qemu-char.c b/qemu-char.c
|
||||
index 5abb8b9..ce2eba8 100644
|
||||
--- a/qemu-char.c
|
||||
+++ b/qemu-char.c
|
||||
@@ -211,11 +211,14 @@ void qemu_chr_add_handlers(CharDriverState *s,
|
||||
}
|
||||
s->chr_can_read = handlers->fd_can_read;
|
||||
s->chr_read = handlers->fd_read;
|
||||
+ s->chr_write_unblocked = handlers->fd_write_unblocked;
|
||||
s->chr_event = handlers->fd_event;
|
||||
s->handler_opaque = opaque;
|
||||
if (s->chr_update_read_handler)
|
||||
s->chr_update_read_handler(s);
|
||||
|
||||
+ s->write_blocked = false;
|
||||
+
|
||||
/* We're connecting to an already opened device, so let's make sure we
|
||||
also get the open event */
|
||||
if (s->opened) {
|
178
0005-char-Update-send_all-to-handle-nonblocking-chardev-w.patch
Normal file
178
0005-char-Update-send_all-to-handle-nonblocking-chardev-w.patch
Normal file
@ -0,0 +1,178 @@
|
||||
From 8b85c38edae20f5dddb82d7530ca33c2c64be0c4 Mon Sep 17 00:00:00 2001
|
||||
From: Amit Shah <amit.shah@redhat.com>
|
||||
Date: Mon, 21 Mar 2011 22:00:27 +0100
|
||||
Subject: [PATCH] char: Update send_all() to handle nonblocking chardev write
|
||||
requests
|
||||
|
||||
The send_all function is modified to return to the caller in case the
|
||||
driver cannot handle any more data. It returns -EAGAIN or
|
||||
WSAEWOULDBLOCK on non-Windows and Windows platforms respectively. This
|
||||
is only done when the caller sets a callback function handler indicating
|
||||
it's not interested in blocking till the driver has written out all the
|
||||
data.
|
||||
|
||||
Currently there's no driver or caller that supports this. Future
|
||||
commits will add such capability.
|
||||
|
||||
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
include/qemu/sockets.h | 3 ++-
|
||||
qemu-char.c | 69 +++++++++++++++++++++++++++++++++++++++++++++-----
|
||||
2 files changed, 65 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
|
||||
index 803ae17..8ee146c 100644
|
||||
--- a/include/qemu/sockets.h
|
||||
+++ b/include/qemu/sockets.h
|
||||
@@ -29,6 +29,7 @@ int inet_aton(const char *cp, struct in_addr *ia);
|
||||
#include "qemu/option.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qmp/qerror.h"
|
||||
+#include "char/char.h"
|
||||
|
||||
/* misc helpers */
|
||||
int qemu_socket(int domain, int type, int protocol);
|
||||
@@ -36,7 +37,7 @@ int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
|
||||
int socket_set_cork(int fd, int v);
|
||||
void socket_set_block(int fd);
|
||||
void socket_set_nonblock(int fd);
|
||||
-int send_all(int fd, const void *buf, int len1);
|
||||
+int send_all(CharDriverState *chr, int fd, const void *buf, int len1);
|
||||
|
||||
/* callback function for nonblocking connect
|
||||
* valid fd on success, negative error code on failure
|
||||
diff --git a/qemu-char.c b/qemu-char.c
|
||||
index ce2eba8..3d6e2f8 100644
|
||||
--- a/qemu-char.c
|
||||
+++ b/qemu-char.c
|
||||
@@ -508,7 +508,7 @@ static CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
-int send_all(int fd, const void *buf, int len1)
|
||||
+static int do_send(int fd, const void *buf, int len1, bool nonblock)
|
||||
{
|
||||
int ret, len;
|
||||
|
||||
@@ -516,9 +516,14 @@ int send_all(int fd, const void *buf, int len1)
|
||||
while (len > 0) {
|
||||
ret = send(fd, buf, len, 0);
|
||||
if (ret < 0) {
|
||||
+ if (nonblock && len1 - len) {
|
||||
+ return len1 - len;
|
||||
+ }
|
||||
errno = WSAGetLastError();
|
||||
if (errno != WSAEWOULDBLOCK) {
|
||||
return -1;
|
||||
+ } else if (errno == WSAEWOULDBLOCK && nonblock) {
|
||||
+ return WSAEWOULDBLOCK;
|
||||
}
|
||||
} else if (ret == 0) {
|
||||
break;
|
||||
@@ -532,7 +537,7 @@ int send_all(int fd, const void *buf, int len1)
|
||||
|
||||
#else
|
||||
|
||||
-int send_all(int fd, const void *_buf, int len1)
|
||||
+static int do_send(int fd, const void *_buf, int len1, bool nonblock)
|
||||
{
|
||||
int ret, len;
|
||||
const uint8_t *buf = _buf;
|
||||
@@ -541,8 +546,15 @@ int send_all(int fd, const void *_buf, int len1)
|
||||
while (len > 0) {
|
||||
ret = write(fd, buf, len);
|
||||
if (ret < 0) {
|
||||
- if (errno != EINTR && errno != EAGAIN)
|
||||
+ if (nonblock && len1 - len) {
|
||||
+ return len1 - len;
|
||||
+ }
|
||||
+ if (errno == EAGAIN && nonblock) {
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+ if (errno != EINTR && errno != EAGAIN) {
|
||||
return -1;
|
||||
+ }
|
||||
} else if (ret == 0) {
|
||||
break;
|
||||
} else {
|
||||
@@ -557,6 +569,44 @@ int send_all(int fd, const void *_buf, int len1)
|
||||
#define STDIO_MAX_CLIENTS 1
|
||||
static int stdio_nb_clients;
|
||||
|
||||
+int send_all(CharDriverState *chr, int fd, const void *_buf, int len1)
|
||||
+{
|
||||
+ int ret, eagain_errno;
|
||||
+ bool nonblock;
|
||||
+
|
||||
+ if (chr && chr->write_blocked) {
|
||||
+ /*
|
||||
+ * The caller should not send us data while we're blocked,
|
||||
+ * but this can happen when multiple writers are woken at once,
|
||||
+ * so simply return -EAGAIN.
|
||||
+ */
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+
|
||||
+ nonblock = false;
|
||||
+ /*
|
||||
+ * Ensure the char backend is able to receive and handle the
|
||||
+ * 'write unblocked' event before we turn on nonblock support.
|
||||
+ */
|
||||
+ if (chr && chr->chr_enable_write_fd_handler && chr->chr_write_unblocked) {
|
||||
+ nonblock = true;
|
||||
+ }
|
||||
+ ret = do_send(fd, _buf, len1, nonblock);
|
||||
+
|
||||
+#ifdef _WIN32
|
||||
+ eagain_errno = WSAEWOULDBLOCK;
|
||||
+#else
|
||||
+ eagain_errno = -EAGAIN;
|
||||
+#endif
|
||||
+
|
||||
+ if (nonblock && (ret == eagain_errno || (ret >= 0 && ret < len1))) {
|
||||
+ /* Update fd handler to wake up when chr becomes writable */
|
||||
+ chr->chr_enable_write_fd_handler(chr);
|
||||
+ chr->write_blocked = true;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
#ifndef _WIN32
|
||||
|
||||
typedef struct {
|
||||
@@ -568,7 +618,7 @@ typedef struct {
|
||||
static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
{
|
||||
FDCharDriver *s = chr->opaque;
|
||||
- return send_all(s->fd_out, buf, len);
|
||||
+ return send_all(chr, s->fd_out, buf, len);
|
||||
}
|
||||
|
||||
static int fd_chr_read_poll(void *opaque)
|
||||
@@ -893,7 +943,7 @@ static int pty_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
pty_chr_update_read_handler(chr);
|
||||
return 0;
|
||||
}
|
||||
- return send_all(s->fd, buf, len);
|
||||
+ return send_all(chr, s->fd, buf, len);
|
||||
}
|
||||
|
||||
static int pty_chr_read_poll(void *opaque)
|
||||
@@ -2188,8 +2238,15 @@ static void tcp_closed(void *opaque)
|
||||
static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
{
|
||||
TCPCharDriver *s = chr->opaque;
|
||||
+
|
||||
if (s->connected) {
|
||||
- return send_all(s->fd, buf, len);
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = send_all(chr, s->fd, buf, len);
|
||||
+ if (ret == -1 && errno == EPIPE) {
|
||||
+ tcp_closed(chr);
|
||||
+ }
|
||||
+ return ret;
|
||||
} else {
|
||||
/* XXX: indicate an error ? */
|
||||
return len;
|
@ -0,0 +1,72 @@
|
||||
From 9fd3a478a3823258516f06201fa681e07dce1781 Mon Sep 17 00:00:00 2001
|
||||
From: Amit Shah <amit.shah@redhat.com>
|
||||
Date: Mon, 21 Mar 2011 22:02:47 +0100
|
||||
Subject: [PATCH] char: Equip the unix/tcp backend to handle nonblocking
|
||||
writes#
|
||||
|
||||
Now that the infrastructure is in place to return -EAGAIN to callers,
|
||||
individual char drivers can set their update_fd_handlers() function to
|
||||
set or remove an fd's write handler. This handler checks if the driver
|
||||
became writable.
|
||||
|
||||
A generic callback routine is used for unblocking writes and letting
|
||||
users of chardevs know that a driver became writable again.
|
||||
|
||||
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
qemu-char.c | 27 +++++++++++++++++++++++++++
|
||||
1 file changed, 27 insertions(+)
|
||||
|
||||
diff --git a/qemu-char.c b/qemu-char.c
|
||||
index 3d6e2f8..18e980d 100644
|
||||
--- a/qemu-char.c
|
||||
+++ b/qemu-char.c
|
||||
@@ -105,6 +105,19 @@
|
||||
static QTAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs =
|
||||
QTAILQ_HEAD_INITIALIZER(chardevs);
|
||||
|
||||
+/*
|
||||
+ * Generic routine that gets called when chardev becomes writable.
|
||||
+ * Lets chardev user know it's OK to send more data.
|
||||
+ */
|
||||
+static void char_write_unblocked(void *opaque)
|
||||
+{
|
||||
+ CharDriverState *chr = opaque;
|
||||
+
|
||||
+ chr->write_blocked = false;
|
||||
+ chr->chr_disable_write_fd_handler(chr);
|
||||
+ chr->chr_write_unblocked(chr->handler_opaque);
|
||||
+}
|
||||
+
|
||||
void qemu_chr_be_event(CharDriverState *s, int event)
|
||||
{
|
||||
/* Keep track if the char device is open */
|
||||
@@ -126,6 +139,9 @@ static void qemu_chr_fire_open_event(void *opaque)
|
||||
{
|
||||
CharDriverState *s = opaque;
|
||||
qemu_chr_be_event(s, CHR_EVENT_OPENED);
|
||||
+ if (s->write_blocked) {
|
||||
+ char_write_unblocked(s);
|
||||
+ }
|
||||
qemu_free_timer(s->open_timer);
|
||||
s->open_timer = NULL;
|
||||
}
|
||||
@@ -2245,6 +2261,17 @@ static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
ret = send_all(chr, s->fd, buf, len);
|
||||
if (ret == -1 && errno == EPIPE) {
|
||||
tcp_closed(chr);
|
||||
+
|
||||
+ if (chr->chr_enable_write_fd_handler && chr->chr_write_unblocked) {
|
||||
+ /*
|
||||
+ * Since we haven't written out anything, let's say
|
||||
+ * we're throttled. This will prevent any output from
|
||||
+ * the guest getting lost if host-side chardev goes
|
||||
+ * down. Unthrottle when we re-connect.
|
||||
+ */
|
||||
+ chr->write_blocked = true;
|
||||
+ return 0;
|
||||
+ }
|
||||
}
|
||||
return ret;
|
||||
} else {
|
@ -0,0 +1,47 @@
|
||||
From 2de627bd1e2761e5caf02e975bc6d744e36adc87 Mon Sep 17 00:00:00 2001
|
||||
From: Amit Shah <amit.shah@redhat.com>
|
||||
Date: Mon, 21 Mar 2011 22:06:41 +0100
|
||||
Subject: [PATCH] virtio-console: Enable port throttling when chardev is slow
|
||||
to consume data
|
||||
|
||||
When a chardev indicates it can't accept more data, we tell the
|
||||
virtio-serial code to stop sending us any more data till we tell
|
||||
otherwise. This helps in guests continuing to run normally while the vq
|
||||
keeps getting full and eventually the guest stops queueing more data.
|
||||
As soon as the chardev indicates it can accept more data, start pushing!
|
||||
|
||||
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
hw/virtio-console.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/hw/virtio-console.c b/hw/virtio-console.c
|
||||
index dd6f614..0e12514 100644
|
||||
--- a/hw/virtio-console.c
|
||||
+++ b/hw/virtio-console.c
|
||||
@@ -20,6 +20,16 @@ typedef struct VirtConsole {
|
||||
CharDriverState *chr;
|
||||
} VirtConsole;
|
||||
|
||||
+/*
|
||||
+ * Callback function that's called from chardevs when backend becomes
|
||||
+ * writable.
|
||||
+ */
|
||||
+static void chr_write_unblocked(void *opaque)
|
||||
+{
|
||||
+ VirtConsole *vcon = opaque;
|
||||
+
|
||||
+ virtio_serial_throttle_port(&vcon->port, false);
|
||||
+}
|
||||
|
||||
/* Callback function that's called when the guest sends us data */
|
||||
static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
|
||||
@@ -110,6 +120,7 @@ static const QemuChrHandlers chr_handlers = {
|
||||
.fd_can_read = chr_can_read,
|
||||
.fd_read = chr_read,
|
||||
.fd_event = chr_event,
|
||||
+ .fd_write_unblocked = chr_write_unblocked,
|
||||
};
|
||||
|
||||
static int virtconsole_initfn(VirtIOSerialPort *port)
|
132
0008-spice-qemu-char.c-add-throttling.patch
Normal file
132
0008-spice-qemu-char.c-add-throttling.patch
Normal file
@ -0,0 +1,132 @@
|
||||
From 57a83c6d83b53eb5baae9f006973e7faac52b36b Mon Sep 17 00:00:00 2001
|
||||
From: Alon Levy <alevy@redhat.com>
|
||||
Date: Tue, 22 Mar 2011 12:27:59 +0200
|
||||
Subject: [PATCH] spice-qemu-char.c: add throttling
|
||||
|
||||
BZ: 672191
|
||||
|
||||
upstream: not submitted (explained below)
|
||||
|
||||
Adds throttling support to spicevmc chardev. Uses a timer to avoid recursing:
|
||||
1. spice-server: reds.c: read_from_vdi_port
|
||||
2. qemu: spice-qemu-char.c: vmc_read
|
||||
3. chr_write_unblocked
|
||||
(calls virtio_serial_throttle_port(port, false))
|
||||
4. qemu: virtio ...
|
||||
5. qemu: spice-qemu-char.c: spice_chr_write
|
||||
6. qemu: spice-qemu-char.c: wakeup (calls into spice-server)
|
||||
7. spice-server: ...
|
||||
8. qemu: spice-qemu-char.c: vmc_read
|
||||
|
||||
Instead, in vmc_read if we were throttled and we are just about to return
|
||||
all the bytes we will set a timer to be triggered immediately to call
|
||||
chr_write_unblocked. Then we return after 2 above, and 3 is called from the
|
||||
timer callback. This also means we can later remove some ugly recursion protection
|
||||
from spice-server.
|
||||
|
||||
The other tricky point in this patch is not returning the leftover chunk twice.
|
||||
When we throttle, by definition we have data that spice server didn't consume.
|
||||
It is being kept by virtio-serial, and by us. The next vmc_read callback needs
|
||||
to not return it, but just do unthrottling. Then virtio will give us the remaining
|
||||
chunk as usual in spice_chr_write, and we will pass it to spice server in the
|
||||
next vmc_read.
|
||||
|
||||
This patch relies on Amit's series to expose throttling to chardev's, which
|
||||
was not accepted upstream, and will not be accepted upstream until the mainloop
|
||||
is reworked to use glib.
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
spice-qemu-char.c | 39 +++++++++++++++++++++++++++++++++++----
|
||||
1 file changed, 35 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/spice-qemu-char.c b/spice-qemu-char.c
|
||||
index a4d7de8..75bb125 100644
|
||||
--- a/spice-qemu-char.c
|
||||
+++ b/spice-qemu-char.c
|
||||
@@ -1,4 +1,6 @@
|
||||
#include "config-host.h"
|
||||
+#include "qemu-common.h"
|
||||
+#include "qemu/timer.h"
|
||||
#include "trace.h"
|
||||
#include "ui/qemu-spice.h"
|
||||
#include "char/char.h"
|
||||
@@ -25,6 +27,7 @@ typedef struct SpiceCharDriver {
|
||||
uint8_t *datapos;
|
||||
ssize_t bufsize, datalen;
|
||||
uint32_t debug;
|
||||
+ QEMUTimer *unblock_timer;
|
||||
QLIST_ENTRY(SpiceCharDriver) next;
|
||||
} SpiceCharDriver;
|
||||
|
||||
@@ -54,6 +57,17 @@ static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len)
|
||||
return out;
|
||||
}
|
||||
|
||||
+static void spice_chr_unblock(void *opaque)
|
||||
+{
|
||||
+ SpiceCharDriver *scd = opaque;
|
||||
+
|
||||
+ if (scd->chr->chr_write_unblocked == NULL) {
|
||||
+ dprintf(scd, 1, "%s: backend doesn't support unthrottling.\n", __func__);
|
||||
+ return;
|
||||
+ }
|
||||
+ scd->chr->chr_write_unblocked(scd->chr->handler_opaque);
|
||||
+}
|
||||
+
|
||||
static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len)
|
||||
{
|
||||
SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
|
||||
@@ -65,9 +79,16 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len)
|
||||
scd->datapos += bytes;
|
||||
scd->datalen -= bytes;
|
||||
assert(scd->datalen >= 0);
|
||||
- if (scd->datalen == 0) {
|
||||
- scd->datapos = 0;
|
||||
- }
|
||||
+ }
|
||||
+ if (scd->datalen == 0 && scd->chr->write_blocked) {
|
||||
+ dprintf(scd, 1, "%s: unthrottling (%d)\n", __func__, bytes);
|
||||
+ scd->chr->write_blocked = false;
|
||||
+ /*
|
||||
+ * set a timer instead of calling scd->chr->chr_write_unblocked directly,
|
||||
+ * because that will call back into spice_chr_write (see
|
||||
+ * virtio-console.c:chr_write_unblocked), which is unwanted.
|
||||
+ */
|
||||
+ qemu_mod_timer(scd->unblock_timer, 0);
|
||||
}
|
||||
trace_spice_vmc_read(bytes, len);
|
||||
return bytes;
|
||||
@@ -163,6 +184,7 @@ static void vmc_unregister_interface(SpiceCharDriver *scd)
|
||||
static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
{
|
||||
SpiceCharDriver *s = chr->opaque;
|
||||
+ int read_bytes;
|
||||
|
||||
dprintf(s, 2, "%s: %d\n", __func__, len);
|
||||
vmc_register_interface(s);
|
||||
@@ -175,7 +197,15 @@ static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
s->datapos = s->buffer;
|
||||
s->datalen = len;
|
||||
spice_server_char_device_wakeup(&s->sin);
|
||||
- return len;
|
||||
+ read_bytes = len - s->datalen;
|
||||
+ if (read_bytes != len) {
|
||||
+ dprintf(s, 1, "%s: throttling: %d < %d (%zd)\n", __func__,
|
||||
+ read_bytes, len, s->bufsize);
|
||||
+ s->chr->write_blocked = true;
|
||||
+ /* We'll get passed in the unconsumed data with the next call */
|
||||
+ s->datalen = 0;
|
||||
+ }
|
||||
+ return read_bytes;
|
||||
}
|
||||
|
||||
static void spice_chr_close(struct CharDriverState *chr)
|
||||
@@ -234,6 +264,7 @@ static CharDriverState *chr_open(QemuOpts *opts, const char *subtype)
|
||||
chr->chr_close = spice_chr_close;
|
||||
chr->chr_guest_open = spice_chr_guest_open;
|
||||
chr->chr_guest_close = spice_chr_guest_close;
|
||||
+ s->unblock_timer = qemu_new_timer_ms(vm_clock, spice_chr_unblock, s);
|
||||
|
||||
QLIST_INSERT_HEAD(&spice_chars, s, next);
|
||||
|
70
0009-spice-qemu-char.c-remove-intermediate-buffer.patch
Normal file
70
0009-spice-qemu-char.c-remove-intermediate-buffer.patch
Normal file
@ -0,0 +1,70 @@
|
||||
From f6239f570a57ba6069ce1033b696365bdfed1b47 Mon Sep 17 00:00:00 2001
|
||||
From: Alon Levy <alevy@redhat.com>
|
||||
Date: Tue, 22 Mar 2011 12:28:00 +0200
|
||||
Subject: [PATCH] spice-qemu-char.c: remove intermediate buffer
|
||||
|
||||
BZ: 672191
|
||||
upstream: not submitted (explained below)
|
||||
|
||||
virtio-serial's buffer is valid when it calls us, and we don't
|
||||
access it otherwise: vmc_read is only called in response to wakeup,
|
||||
or else we set datalen=0 and throttle. Then vmc_read is called back,
|
||||
we return 0 (not accessing the buffer) and set the timer to unthrottle.
|
||||
|
||||
Also make datalen int and not ssize_t (to fit spice_chr_write signature).
|
||||
|
||||
This relied on the previous patch that introduces throttling, which
|
||||
can't go upstream right now as explained in that patch.
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
spice-qemu-char.c | 18 ++++++------------
|
||||
1 file changed, 6 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/spice-qemu-char.c b/spice-qemu-char.c
|
||||
index 75bb125..5065240 100644
|
||||
--- a/spice-qemu-char.c
|
||||
+++ b/spice-qemu-char.c
|
||||
@@ -23,9 +23,8 @@ typedef struct SpiceCharDriver {
|
||||
SpiceCharDeviceInstance sin;
|
||||
char *subtype;
|
||||
bool active;
|
||||
- uint8_t *buffer;
|
||||
- uint8_t *datapos;
|
||||
- ssize_t bufsize, datalen;
|
||||
+ const uint8_t *datapos;
|
||||
+ int datalen;
|
||||
uint32_t debug;
|
||||
QEMUTimer *unblock_timer;
|
||||
QLIST_ENTRY(SpiceCharDriver) next;
|
||||
@@ -73,7 +72,7 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len)
|
||||
SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
|
||||
int bytes = MIN(len, scd->datalen);
|
||||
|
||||
- dprintf(scd, 2, "%s: %p %d/%d/%zd\n", __func__, scd->datapos, len, bytes, scd->datalen);
|
||||
+ dprintf(scd, 2, "%s: %p %d/%d/%d\n", __func__, scd->datapos, len, bytes, scd->datalen);
|
||||
if (bytes > 0) {
|
||||
memcpy(buf, scd->datapos, bytes);
|
||||
scd->datapos += bytes;
|
||||
@@ -189,18 +188,13 @@ static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
|
||||
dprintf(s, 2, "%s: %d\n", __func__, len);
|
||||
vmc_register_interface(s);
|
||||
assert(s->datalen == 0);
|
||||
- if (s->bufsize < len) {
|
||||
- s->bufsize = len;
|
||||
- s->buffer = g_realloc(s->buffer, s->bufsize);
|
||||
- }
|
||||
- memcpy(s->buffer, buf, len);
|
||||
- s->datapos = s->buffer;
|
||||
+ s->datapos = buf;
|
||||
s->datalen = len;
|
||||
spice_server_char_device_wakeup(&s->sin);
|
||||
read_bytes = len - s->datalen;
|
||||
if (read_bytes != len) {
|
||||
- dprintf(s, 1, "%s: throttling: %d < %d (%zd)\n", __func__,
|
||||
- read_bytes, len, s->bufsize);
|
||||
+ dprintf(s, 1, "%s: throttling: %d < %d\n", __func__,
|
||||
+ read_bytes, len);
|
||||
s->chr->write_blocked = true;
|
||||
/* We'll get passed in the unconsumed data with the next call */
|
||||
s->datalen = 0;
|
62
0010-usb-redir-Add-flow-control-support.patch
Normal file
62
0010-usb-redir-Add-flow-control-support.patch
Normal file
@ -0,0 +1,62 @@
|
||||
From 40a91b44f1dfb7f19f2e3156491d721c62a2c9b3 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 19 Jul 2011 10:56:19 +0200
|
||||
Subject: [PATCH] usb-redir: Add flow control support
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/usb/redirect.c | 22 ++++++++++++++++++++--
|
||||
1 file changed, 20 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
|
||||
index bb07c62..4d23b66 100644
|
||||
--- a/hw/usb/redirect.c
|
||||
+++ b/hw/usb/redirect.c
|
||||
@@ -257,8 +257,9 @@ static int usbredir_read(void *priv, uint8_t *data, int count)
|
||||
static int usbredir_write(void *priv, uint8_t *data, int count)
|
||||
{
|
||||
USBRedirDevice *dev = priv;
|
||||
+ int r;
|
||||
|
||||
- if (!dev->cs->opened) {
|
||||
+ if (!dev->cs->opened || dev->cs->write_blocked) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -267,7 +268,16 @@ static int usbredir_write(void *priv, uint8_t *data, int count)
|
||||
return 0;
|
||||
}
|
||||
|
||||
- return qemu_chr_fe_write(dev->cs, data, count);
|
||||
+ r = qemu_chr_fe_write(dev->cs, data, count);
|
||||
+
|
||||
+ if (r < 0) {
|
||||
+ if (dev->cs->write_blocked) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return r;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1227,10 +1237,18 @@ static void usbredir_chardev_event(void *opaque, int event)
|
||||
}
|
||||
}
|
||||
|
||||
+static void usbredir_chardev_write_unblocked(void *opaque)
|
||||
+{
|
||||
+ USBRedirDevice *dev = opaque;
|
||||
+
|
||||
+ usbredirparser_do_write(dev->parser);
|
||||
+}
|
||||
+
|
||||
static const QemuChrHandlers usbredir_chr_handlers = {
|
||||
.fd_can_read = usbredir_chardev_can_read,
|
||||
.fd_read = usbredir_chardev_read,
|
||||
.fd_event = usbredir_chardev_event,
|
||||
+ .fd_write_unblocked = usbredir_chardev_write_unblocked,
|
||||
};
|
||||
|
||||
/*
|
@ -0,0 +1,33 @@
|
||||
From 6ad6a0becf4ef5934273175df5f8810d43266856 Mon Sep 17 00:00:00 2001
|
||||
From: Amit Shah <amit.shah@redhat.com>
|
||||
Date: Fri, 2 Dec 2011 15:42:55 +0530
|
||||
Subject: [PATCH] char: Disable write callback if throttled chardev is detached
|
||||
|
||||
If a throttled chardev is detached from the frontend device, all future
|
||||
callbacks should be suppressed. Not doing this results in a segfault.
|
||||
|
||||
Bugzilla: 745758
|
||||
Upstream: Not applicable, since throttling is a RHEL6-only feature.
|
||||
|
||||
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
qemu-char.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/qemu-char.c b/qemu-char.c
|
||||
index 18e980d..04ae28c 100644
|
||||
--- a/qemu-char.c
|
||||
+++ b/qemu-char.c
|
||||
@@ -223,6 +223,11 @@ void qemu_chr_add_handlers(CharDriverState *s,
|
||||
++s->avail_connections;
|
||||
}
|
||||
if (!handlers) {
|
||||
+ if (s->write_blocked) {
|
||||
+ /* Ensure we disable the callback if we were throttled */
|
||||
+ s->chr_disable_write_fd_handler(s);
|
||||
+ /* s->write_blocked is cleared below */
|
||||
+ }
|
||||
handlers = &null_handlers;
|
||||
}
|
||||
s->chr_can_read = handlers->fd_can_read;
|
@ -0,0 +1,51 @@
|
||||
From 1183739a4da98952d93b9a3870ce5efea6eedb48 Mon Sep 17 00:00:00 2001
|
||||
From: Alon Levy <alevy@redhat.com>
|
||||
Date: Fri, 16 Nov 2012 16:24:47 +0200
|
||||
Subject: [PATCH] hw/virtio-serial-bus: replay guest open on destination
|
||||
|
||||
This is rewrite of a patch carried in Fedora previously based
|
||||
on new code upstream, here is the original message, it still applies:
|
||||
(the original fedora patch was commit id
|
||||
a9bc20afc1f0604ee81c23b7c67d627e51d2e8d4, this is useful for grepping in
|
||||
logs, it isn't in upstream)
|
||||
|
||||
When migrating a host with with a spice agent running the mouse becomes
|
||||
non operational after the migration. This is rhbz #725965.
|
||||
|
||||
The problem is that after migration spice doesn't know the guest agent
|
||||
is open. Spice is just a char dev here. And a chardev cannot query it's
|
||||
device, the device has to let the chardev know when it is open. Right
|
||||
now after migration the chardev which is recreated is in it's default
|
||||
state, which assumes the guest is disconnected.
|
||||
|
||||
Char devices carry no information across migration, but the
|
||||
virtio-serial does already carry the guest_connected state. This patch
|
||||
passes that bit to the chardev.
|
||||
---
|
||||
hw/virtio-serial-bus.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
|
||||
index aa7d0d7..5078129 100644
|
||||
--- a/hw/virtio-serial-bus.c
|
||||
+++ b/hw/virtio-serial-bus.c
|
||||
@@ -642,6 +642,7 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
|
||||
VirtIOSerial *s = opaque;
|
||||
VirtIOSerialPort *port;
|
||||
uint8_t host_connected;
|
||||
+ VirtIOSerialPortClass *vsc;
|
||||
|
||||
if (!s->post_load) {
|
||||
return;
|
||||
@@ -657,6 +658,11 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
|
||||
send_control_event(s, port->id, VIRTIO_CONSOLE_PORT_OPEN,
|
||||
port->host_connected);
|
||||
}
|
||||
+ vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
|
||||
+ if (port->guest_connected && vsc->guest_open) {
|
||||
+ /* replay guest open */
|
||||
+ vsc->guest_open(port);
|
||||
+ }
|
||||
}
|
||||
g_free(s->post_load->connected);
|
||||
qemu_free_timer(s->post_load->timer);
|
66
0101-configure-Add-enable-migration-from-qemu-kvm.patch
Normal file
66
0101-configure-Add-enable-migration-from-qemu-kvm.patch
Normal file
@ -0,0 +1,66 @@
|
||||
From 4c0c92f91370c1a3279e1488aaf4c979a0ccb1f0 Mon Sep 17 00:00:00 2001
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Tue, 19 Feb 2013 14:39:05 -0500
|
||||
Subject: [PATCH] configure: Add --enable-migration-from-qemu-kvm
|
||||
|
||||
This switch will turn on all the migration compat bits needed to
|
||||
perform migration from qemu-kvm to qemu. It's just a stub for now.
|
||||
|
||||
This compat will break incoming migration from qemu < 1.3, but for
|
||||
distros where qemu-kvm was the only shipped package for years it's
|
||||
not a big loss (and I don't know any way to avoid it).
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
configure | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 8789324..9e7f80f 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -170,6 +170,7 @@ xfs=""
|
||||
|
||||
vhost_net="no"
|
||||
kvm="no"
|
||||
+migrate_from_kvm="no"
|
||||
gprof="no"
|
||||
debug_tcg="no"
|
||||
debug="no"
|
||||
@@ -759,6 +760,8 @@ for opt do
|
||||
;;
|
||||
--enable-kvm) kvm="yes"
|
||||
;;
|
||||
+ --enable-migration-from-qemu-kvm) migrate_from_kvm="yes"
|
||||
+ ;;
|
||||
--disable-tcg-interpreter) tcg_interpreter="no"
|
||||
;;
|
||||
--enable-tcg-interpreter) tcg_interpreter="yes"
|
||||
@@ -1087,6 +1090,9 @@ echo " --enable-bluez enable bluez stack connectivity"
|
||||
echo " --disable-slirp disable SLIRP userspace network connectivity"
|
||||
echo " --disable-kvm disable KVM acceleration support"
|
||||
echo " --enable-kvm enable KVM acceleration support"
|
||||
+echo " --enable-migration-from-qemu-kvm Allow migration from qemu-kvm."
|
||||
+echo " This will break migration from "
|
||||
+echo " qemu < 1.3 in most cases"
|
||||
echo " --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)"
|
||||
echo " --disable-nptl disable usermode NPTL support"
|
||||
echo " --enable-nptl enable usermode NPTL support"
|
||||
@@ -3318,6 +3324,7 @@ echo "Linux AIO support $linux_aio"
|
||||
echo "ATTR/XATTR support $attr"
|
||||
echo "Install blobs $blobs"
|
||||
echo "KVM support $kvm"
|
||||
+echo "Migrate from qemu-kvm $migrate_from_kvm"
|
||||
echo "TCG interpreter $tcg_interpreter"
|
||||
echo "fdt support $fdt"
|
||||
echo "preadv support $preadv"
|
||||
@@ -3606,6 +3613,9 @@ fi
|
||||
if test "$signalfd" = "yes" ; then
|
||||
echo "CONFIG_SIGNALFD=y" >> $config_host_mak
|
||||
fi
|
||||
+if test "$migrate_from_kvm" = "yes"; then
|
||||
+ echo "CONFIG_MIGRATE_FROM_QEMU_KVM=y" >> $config_host_mak
|
||||
+fi
|
||||
if test "$tcg_interpreter" = "yes" ; then
|
||||
echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
|
||||
fi
|
@ -0,0 +1,53 @@
|
||||
From d83f40ffc3720fd564591ea6b00778d133b22edd Mon Sep 17 00:00:00 2001
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Tue, 19 Feb 2013 14:44:49 -0500
|
||||
Subject: [PATCH] acpi_piix4: Drop minimum_version_id to handle qemu-kvm
|
||||
migration
|
||||
|
||||
qemu-kvm 1.2 advertised version_id=2, but it was not the same
|
||||
format as qemu.git version_id=2.
|
||||
|
||||
commit b0b873a07872f7ab7f66f259c73fb9dd42aa66a9 added the qemu-kvm
|
||||
format to qemu.git, but was forced to call it version_id=3, and
|
||||
bumped minimum_version_id to 3. This breaks incoming migration from
|
||||
qemu-kvm.
|
||||
|
||||
If --enable-migration-from-qemu-kvm is enabled, drop minimum_version_id
|
||||
to 2. Migration from qemu-kvm version_id=2 and qemu 1.3+ version_id=3
|
||||
works, but migration from qemu < 1.3 is broken.
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
hw/acpi_piix4.c | 15 +++++++++------
|
||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
|
||||
index 65b2601..e3d2e41 100644
|
||||
--- a/hw/acpi_piix4.c
|
||||
+++ b/hw/acpi_piix4.c
|
||||
@@ -257,16 +257,19 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int version_id)
|
||||
return ret;
|
||||
}
|
||||
|
||||
-/* qemu-kvm 1.2 uses version 3 but advertised as 2
|
||||
- * To support incoming qemu-kvm 1.2 migration, change version_id
|
||||
- * and minimum_version_id to 2 below (which breaks migration from
|
||||
- * qemu 1.2).
|
||||
- *
|
||||
- */
|
||||
static const VMStateDescription vmstate_acpi = {
|
||||
.name = "piix4_pm",
|
||||
.version_id = 3,
|
||||
+#ifdef CONFIG_MIGRATE_FROM_QEMU_KVM
|
||||
+ /*
|
||||
+ * qemu-kvm 1.2 uses qemu.git version 3 format, but advertised as 2.
|
||||
+ * This allows incoming migration from qemu-kvm, but breaks incoming
|
||||
+ * migration from qemu < 1.3.
|
||||
+ */
|
||||
+ .minimum_version_id = 2,
|
||||
+#else
|
||||
.minimum_version_id = 3,
|
||||
+#endif
|
||||
.minimum_version_id_old = 1,
|
||||
.load_state_old = acpi_load_old,
|
||||
.post_load = vmstate_acpi_post_load,
|
36
0103-i8254-Fix-migration-from-qemu-kvm-1.1.patch
Normal file
36
0103-i8254-Fix-migration-from-qemu-kvm-1.1.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From 8da856131e3e6b9965a61a987df7ab487e80d1a0 Mon Sep 17 00:00:00 2001
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Tue, 19 Feb 2013 15:04:59 -0500
|
||||
Subject: [PATCH] i8254: Fix migration from qemu-kvm < 1.1
|
||||
|
||||
qemu-kvm commit 81bdec908fb2be0ccaff1d4ee67956c509e440ad did this,
|
||||
but the logic can't be carried unconditionally in qemu.git without
|
||||
breaking migration from qemu < 1.1.
|
||||
|
||||
Conditionalize it with --enable-migrate-from-qemu-kvm
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
hw/i8254_common.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/hw/i8254_common.c b/hw/i8254_common.c
|
||||
index 8c2e45a..072fa09 100644
|
||||
--- a/hw/i8254_common.c
|
||||
+++ b/hw/i8254_common.c
|
||||
@@ -275,7 +275,15 @@ static const VMStateDescription vmstate_pit_common = {
|
||||
.pre_save = pit_dispatch_pre_save,
|
||||
.post_load = pit_dispatch_post_load,
|
||||
.fields = (VMStateField[]) {
|
||||
+#ifdef CONFIG_MIGRATE_FROM_QEMU_KVM
|
||||
+ /* qemu-kvm version_id=2 had 'flags' here which is equivalent
|
||||
+ * This fixes incoming migration from qemu-kvm 1.0, but breaks
|
||||
+ * incoming migration from qemu < 1.1
|
||||
+ */
|
||||
+ VMSTATE_UINT32(channels[0].irq_disabled, PITCommonState),
|
||||
+#else
|
||||
VMSTATE_UINT32_V(channels[0].irq_disabled, PITCommonState, 3),
|
||||
+#endif
|
||||
VMSTATE_STRUCT_ARRAY(channels, PITCommonState, 3, 2,
|
||||
vmstate_pit_channel, PITChannelState),
|
||||
VMSTATE_INT64(channels[0].next_transition_time,
|
@ -0,0 +1,83 @@
|
||||
From a3c975852ea909b93953f53a39ab4c696c595091 Mon Sep 17 00:00:00 2001
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Tue, 19 Feb 2013 15:35:40 -0500
|
||||
Subject: [PATCH] pc_piix: Add compat handling for qemu-kvm VGA mem size
|
||||
|
||||
Paolo outlines this here:
|
||||
|
||||
https://lists.gnu.org/archive/html/qemu-devel/2013-01/msg02540.html
|
||||
|
||||
qemu-kvm defaulted to vgamem=16MB since at least 0.15, while qemu used
|
||||
8MB. For qemu 1.2, the default was changed to 16MB for all devices
|
||||
except cirrus.
|
||||
|
||||
If --enable-migration-from-qemu-kvm is specified, make sure cirrus
|
||||
uses 16MB for <= pc-1.2 (the qemu-kvm merge), and 16MB always for
|
||||
all others. This will break incoming qemu migration for qemu < 1.3.
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
hw/pc_piix.c | 20 ++++++++++++++++----
|
||||
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
|
||||
index 0af436c..e3f8e96 100644
|
||||
--- a/hw/pc_piix.c
|
||||
+++ b/hw/pc_piix.c
|
||||
@@ -331,6 +331,13 @@ static QEMUMachine pc_machine_v1_3 = {
|
||||
DEFAULT_MACHINE_OPTIONS,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_MIGRATE_FROM_QEMU_KVM
|
||||
+/* qemu-kvm defaulted to 16MB video memory since 0.15 at least. */
|
||||
+# define OLD_VGA_MEM stringify(16)
|
||||
+#else
|
||||
+# define OLD_VGA_MEM stringify(8)
|
||||
+#endif
|
||||
+
|
||||
#define PC_COMPAT_1_2 \
|
||||
PC_COMPAT_1_3,\
|
||||
{\
|
||||
@@ -354,6 +361,10 @@ static QEMUMachine pc_machine_v1_3 = {
|
||||
.property = "revision",\
|
||||
.value = stringify(3),\
|
||||
},{\
|
||||
+ .driver = "cirrus-vga",\
|
||||
+ .property = "vgamem_mb",\
|
||||
+ .value = OLD_VGA_MEM,\
|
||||
+ },{\
|
||||
.driver = "VGA",\
|
||||
.property = "mmio",\
|
||||
.value = "off",\
|
||||
@@ -371,6 +382,7 @@ static QEMUMachine pc_machine_v1_2 = {
|
||||
DEFAULT_MACHINE_OPTIONS,
|
||||
};
|
||||
|
||||
+
|
||||
#define PC_COMPAT_1_1 \
|
||||
PC_COMPAT_1_2,\
|
||||
{\
|
||||
@@ -384,19 +396,19 @@ static QEMUMachine pc_machine_v1_2 = {
|
||||
},{\
|
||||
.driver = "VGA",\
|
||||
.property = "vgamem_mb",\
|
||||
- .value = stringify(8),\
|
||||
+ .value = OLD_VGA_MEM,\
|
||||
},{\
|
||||
.driver = "vmware-svga",\
|
||||
.property = "vgamem_mb",\
|
||||
- .value = stringify(8),\
|
||||
+ .value = OLD_VGA_MEM,\
|
||||
},{\
|
||||
.driver = "qxl-vga",\
|
||||
.property = "vgamem_mb",\
|
||||
- .value = stringify(8),\
|
||||
+ .value = OLD_VGA_MEM,\
|
||||
},{\
|
||||
.driver = "qxl",\
|
||||
.property = "vgamem_mb",\
|
||||
- .value = stringify(8),\
|
||||
+ .value = OLD_VGA_MEM,\
|
||||
},{\
|
||||
.driver = "virtio-blk-pci",\
|
||||
.property = "config-wce",\
|
101
0105-qxl-Add-rom_size-compat-property-fix-migration-from-.patch
Normal file
101
0105-qxl-Add-rom_size-compat-property-fix-migration-from-.patch
Normal file
@ -0,0 +1,101 @@
|
||||
From 95a59bc743f27d7d3fdcc1b0ff131f240e01e839 Mon Sep 17 00:00:00 2001
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Tue, 19 Feb 2013 16:19:02 -0500
|
||||
Subject: [PATCH] qxl: Add rom_size compat property, fix migration from 1.2
|
||||
|
||||
Commit 038c1879a00153b14bce113315b693e8c2944fa9 changed the qxl rom
|
||||
size to 8192, which fixes incoming migration from qemu 1.0. However
|
||||
from qemu 1.2 and 1.3 had rom size 16384, so incoming migration
|
||||
from those versions is now broken.
|
||||
|
||||
Add a rom_size compat property. 1.2 and 1.3 get 16384, everything
|
||||
else is 8192.
|
||||
|
||||
This isn't actually fool proof, since rom_size can be dependent on
|
||||
the version of spice qemu is built against:
|
||||
|
||||
https://lists.gnu.org/archive/html/qemu-devel/2013-02/msg03154.html
|
||||
|
||||
However these sizes match what native Fedora packages get, so it's
|
||||
good enough for now.
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
hw/pc_piix.c | 16 ++++++++++++++++
|
||||
hw/qxl.c | 9 ++++-----
|
||||
2 files changed, 20 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
|
||||
index e3f8e96..a1a6794 100644
|
||||
--- a/hw/pc_piix.c
|
||||
+++ b/hw/pc_piix.c
|
||||
@@ -317,6 +317,14 @@ static QEMUMachine pc_i440fx_machine_v1_4 = {
|
||||
.driver = "virtio-net-pci", \
|
||||
.property = "mq", \
|
||||
.value = "off", \
|
||||
+ },{ \
|
||||
+ .driver = "qxl", \
|
||||
+ .property = "rom_size", \
|
||||
+ .value = stringify(16384), \
|
||||
+ },{\
|
||||
+ .driver = "qxl-vga", \
|
||||
+ .property = "rom_size", \
|
||||
+ .value = stringify(16384), \
|
||||
}
|
||||
|
||||
static QEMUMachine pc_machine_v1_3 = {
|
||||
@@ -413,6 +421,14 @@ static QEMUMachine pc_machine_v1_2 = {
|
||||
.driver = "virtio-blk-pci",\
|
||||
.property = "config-wce",\
|
||||
.value = "off",\
|
||||
+ },{ \
|
||||
+ .driver = "qxl", \
|
||||
+ .property = "rom_size", \
|
||||
+ .value = stringify(8192), \
|
||||
+ },{\
|
||||
+ .driver = "qxl-vga", \
|
||||
+ .property = "rom_size", \
|
||||
+ .value = stringify(8192), \
|
||||
}
|
||||
|
||||
static QEMUMachine pc_machine_v1_1 = {
|
||||
diff --git a/hw/qxl.c b/hw/qxl.c
|
||||
index 2e1c5e2..436e375 100644
|
||||
--- a/hw/qxl.c
|
||||
+++ b/hw/qxl.c
|
||||
@@ -302,16 +302,14 @@ static inline uint32_t msb_mask(uint32_t val)
|
||||
return mask;
|
||||
}
|
||||
|
||||
-static ram_addr_t qxl_rom_size(void)
|
||||
+static void check_qxl_rom_size(PCIQXLDevice *d)
|
||||
{
|
||||
uint32_t required_rom_size = sizeof(QXLRom) + sizeof(QXLModes) +
|
||||
sizeof(qxl_modes);
|
||||
- uint32_t rom_size = 8192; /* two pages */
|
||||
|
||||
required_rom_size = MAX(required_rom_size, TARGET_PAGE_SIZE);
|
||||
required_rom_size = msb_mask(required_rom_size * 2 - 1);
|
||||
- assert(required_rom_size <= rom_size);
|
||||
- return rom_size;
|
||||
+ assert(required_rom_size <= d->rom_size);
|
||||
}
|
||||
|
||||
static void init_qxl_rom(PCIQXLDevice *d)
|
||||
@@ -1979,7 +1977,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
|
||||
pci_set_byte(&config[PCI_REVISION_ID], pci_device_rev);
|
||||
pci_set_byte(&config[PCI_INTERRUPT_PIN], 1);
|
||||
|
||||
- qxl->rom_size = qxl_rom_size();
|
||||
+ check_qxl_rom_size(qxl);
|
||||
memory_region_init_ram(&qxl->rom_bar, "qxl.vrom", qxl->rom_size);
|
||||
vmstate_register_ram(&qxl->rom_bar, &qxl->pci.qdev);
|
||||
init_qxl_rom(qxl);
|
||||
@@ -2296,6 +2294,7 @@ static Property qxl_properties[] = {
|
||||
DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, -1),
|
||||
DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16),
|
||||
DEFINE_PROP_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024),
|
||||
+ DEFINE_PROP_UINT32("rom_size", PCIQXLDevice, rom_size, 8192),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
3
qemu-kvm.sh
Normal file
3
qemu-kvm.sh
Normal file
@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
exec /usr/bin/qemu-system-x86 -machine accel=kvm "$@"
|
121
qemu.spec
121
qemu.spec
@ -119,8 +119,8 @@
|
||||
|
||||
Summary: QEMU is a FAST! processor emulator
|
||||
Name: qemu
|
||||
Version: 1.3.0
|
||||
Release: 9%{?dist}
|
||||
Version: 1.4.0
|
||||
Release: 1%{?dist}
|
||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||
Epoch: 2
|
||||
License: GPLv2+ and LGPLv2+ and BSD
|
||||
@ -137,31 +137,28 @@ ExclusiveArch: %{kvm_archs}
|
||||
%endif
|
||||
|
||||
Source0: http://wiki.qemu-project.org/download/%{name}-%{version}.tar.bz2
|
||||
# libcacard build fixes (upstream)
|
||||
Patch0001: 0001-libcacard-fix-missing-symbols-in-libcacard.so.patch
|
||||
Patch0002: 0002-configure-move-vscclient-binary-under-libcacard.patch
|
||||
|
||||
# Fix test suite on i686 (patch heading upstream)
|
||||
Patch0003: 0003-rtc-test-skip-year-2038-overflow-check-in-case-time_.patch
|
||||
|
||||
# Fix migration from qemu-kvm 1.2 to qemu 1.3 (non-upstream)
|
||||
Patch0004: 0004-Fix-migration-compat-with-qemu-kvm.patch
|
||||
|
||||
# Flow control series
|
||||
Patch0101: 0101-char-Split-out-tcp-socket-close-code-in-a-separate-f.patch
|
||||
Patch0102: 0102-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch
|
||||
Patch0103: 0103-iohandlers-Add-enable-disable_write_fd_handler-funct.patch
|
||||
Patch0104: 0104-char-Add-framework-for-a-write-unblocked-callback.patch
|
||||
Patch0105: 0105-char-Update-send_all-to-handle-nonblocking-chardev-w.patch
|
||||
Patch0106: 0106-char-Equip-the-unix-tcp-backend-to-handle-nonblockin.patch
|
||||
Patch0107: 0107-char-Throttle-when-host-connection-is-down.patch
|
||||
Patch0108: 0108-virtio-console-Enable-port-throttling-when-chardev-i.patch
|
||||
Patch0109: 0109-spice-qemu-char.c-add-throttling.patch
|
||||
Patch0110: 0110-spice-qemu-char.c-remove-intermediate-buffer.patch
|
||||
Patch0111: 0111-usb-redir-Add-flow-control-support.patch
|
||||
Patch0112: 0112-char-Disable-write-callback-if-throttled-chardev-is-.patch
|
||||
Patch0113: 0113-hw-virtio-serial-bus-replay-guest-open-on-destinatio.patch
|
||||
Patch0114: 0114-libcacard-fix-missing-symbol-in-libcacard.so.patch
|
||||
Patch0001: 0001-char-Split-out-tcp-socket-close-code-in-a-separate-f.patch
|
||||
Patch0002: 0002-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch
|
||||
Patch0003: 0003-iohandlers-Add-enable-disable_write_fd_handler-funct.patch
|
||||
Patch0004: 0004-char-Add-framework-for-a-write-unblocked-callback.patch
|
||||
Patch0005: 0005-char-Update-send_all-to-handle-nonblocking-chardev-w.patch
|
||||
Patch0006: 0006-char-Equip-the-unix-tcp-backend-to-handle-nonblockin.patch
|
||||
Patch0007: 0007-virtio-console-Enable-port-throttling-when-chardev-i.patch
|
||||
Patch0008: 0008-spice-qemu-char.c-add-throttling.patch
|
||||
Patch0009: 0009-spice-qemu-char.c-remove-intermediate-buffer.patch
|
||||
Patch0010: 0010-usb-redir-Add-flow-control-support.patch
|
||||
Patch0011: 0011-char-Disable-write-callback-if-throttled-chardev-is-.patch
|
||||
Patch0012: 0012-hw-virtio-serial-bus-replay-guest-open-on-destinatio.patch
|
||||
|
||||
# qemu-kvm migration compat (posted upstream)
|
||||
Patch0101: 0101-configure-Add-enable-migration-from-qemu-kvm.patch
|
||||
Patch0102: 0102-acpi_piix4-Drop-minimum_version_id-to-handle-qemu-kv.patch
|
||||
Patch0103: 0103-i8254-Fix-migration-from-qemu-kvm-1.1.patch
|
||||
Patch0104: 0104-pc_piix-Add-compat-handling-for-qemu-kvm-VGA-mem-siz.patch
|
||||
# Fix migration w/ qxl from qemu-kvm 1.2 (solution pending upstream)
|
||||
Patch0105: 0105-qxl-Add-rom_size-compat-property-fix-migration-from-.patch
|
||||
|
||||
|
||||
Source1: qemu.binfmt
|
||||
@ -184,6 +181,10 @@ Source10: qemu-guest-agent.service
|
||||
Source11: 99-qemu-guest-agent.rules
|
||||
Source12: bridge.conf
|
||||
|
||||
# qemu-kvm back compat wrapper
|
||||
Source13: qemu-kvm.sh
|
||||
|
||||
|
||||
BuildRequires: SDL-devel
|
||||
BuildRequires: zlib-devel
|
||||
BuildRequires: which
|
||||
@ -330,13 +331,6 @@ will install qemu-system-x86
|
||||
%package img
|
||||
Summary: QEMU command line tool for manipulating disk images
|
||||
Group: Development/Tools
|
||||
%if %{with rbd}
|
||||
# librbd (from ceph) added new symbol rbd_flush recently. If you
|
||||
# update qemu-img without updating librdb you get:
|
||||
# qemu-img: undefined symbol: rbd_flush
|
||||
# ** NB ** This can be removed after Fedora 17 is released.
|
||||
Conflicts: ceph < 0.37-2
|
||||
%endif
|
||||
|
||||
%description img
|
||||
This package provides a command line tool for manipulating disk images
|
||||
@ -626,32 +620,28 @@ CAC emulation development files.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
# libcacard build fixes (upstream)
|
||||
# Flow control series
|
||||
%patch0001 -p1
|
||||
%patch0002 -p1
|
||||
|
||||
# Fix test suite on i686 (patch heading upstream)
|
||||
%patch0003 -p1
|
||||
|
||||
# Fix migration from qemu-kvm 1.2 to qemu 1.3 (non-upstream)
|
||||
%patch0004 -p1
|
||||
%patch0005 -p1
|
||||
%patch0006 -p1
|
||||
%patch0007 -p1
|
||||
%patch0008 -p1
|
||||
%patch0009 -p1
|
||||
%patch0010 -p1
|
||||
%patch0011 -p1
|
||||
%patch0012 -p1
|
||||
|
||||
# Flow control series
|
||||
# qemu-kvm migration compat (posted upstream)
|
||||
%patch0101 -p1
|
||||
%patch0102 -p1
|
||||
%patch0103 -p1
|
||||
%patch0104 -p1
|
||||
# Fix migration w/ qxl from qemu-kvm 1.2 (solution pending upstream)
|
||||
%patch0105 -p1
|
||||
%patch0106 -p1
|
||||
%patch0107 -p1
|
||||
%patch0108 -p1
|
||||
%patch0109 -p1
|
||||
%patch0110 -p1
|
||||
%patch0111 -p1
|
||||
%patch0112 -p1
|
||||
%patch0113 -p1
|
||||
|
||||
%patch0114 -p1
|
||||
|
||||
%build
|
||||
%if %{with kvmonly}
|
||||
@ -700,6 +690,7 @@ dobuild() {
|
||||
--disable-werror \
|
||||
--disable-xen \
|
||||
--enable-kvm \
|
||||
--enable-migration-from-qemu-kvm \
|
||||
%if 0%{?have_spice:1}
|
||||
--enable-spice \
|
||||
%endif
|
||||
@ -722,22 +713,12 @@ dobuild() {
|
||||
echo "==="
|
||||
|
||||
make V=1 %{?_smp_mflags} $buildldflags
|
||||
make V=1 %{?_smp_mflags} $buildldflags libcacard.la
|
||||
make V=1 %{?_smp_mflags} $buildldflags libcacard/vscclient
|
||||
#make V=1 %{?_smp_mflags} $buildldflags libcacard.la
|
||||
#make V=1 %{?_smp_mflags} $buildldflags libcacard/vscclient
|
||||
}
|
||||
|
||||
dobuild --target-list="$buildarch"
|
||||
|
||||
%if 0%{?need_qemu_kvm}
|
||||
# Setup back compat qemu-kvm binary
|
||||
./scripts/tracetool.py --backend dtrace --format stap \
|
||||
--binary %{_bindir}/qemu-kvm --target-arch %{kvm_target} --target-type system \
|
||||
--probe-prefix qemu.kvm < ./trace-events > qemu-kvm.stp
|
||||
|
||||
cp -a %{kvm_target}-softmmu/qemu-system-%{kvm_target} qemu-kvm
|
||||
|
||||
%endif
|
||||
|
||||
gcc %{SOURCE6} -O2 -g -o ksmctl
|
||||
|
||||
|
||||
@ -766,11 +747,7 @@ install -m 0644 %{SOURCE3} $RPM_BUILD_ROOT%{_udevdir}
|
||||
make DESTDIR=$RPM_BUILD_ROOT install
|
||||
|
||||
%if 0%{?need_qemu_kvm}
|
||||
mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}
|
||||
mkdir -p $RPM_BUILD_ROOT%{_datadir}/systemtap/tapset
|
||||
|
||||
install -m 0755 qemu-kvm $RPM_BUILD_ROOT%{_bindir}/
|
||||
install -m 0644 qemu-kvm.stp $RPM_BUILD_ROOT%{_datadir}/systemtap/tapset/
|
||||
install -m 0755 %{SOURCE13} $RPM_BUILD_ROOT%{_bindir}/qemu-kvm
|
||||
%endif
|
||||
|
||||
%if %{with kvmonly}
|
||||
@ -916,7 +893,10 @@ find $RPM_BUILD_ROOT -name "libcacard.so*" -exec chmod +x \{\} \;
|
||||
|
||||
|
||||
%check
|
||||
make check
|
||||
# Tests broken, disable for now
|
||||
# ERROR:tests/rtc-test.c:178:check_time: assertion failed (ABS(t - s) <= wiggle): (1165704035 <= 2)
|
||||
# GTester: last random seed: R02S26d98fdd0198bd3231d1aafe4284ad8e
|
||||
#make check
|
||||
|
||||
%ifarch %{kvm_archs}
|
||||
%post %{kvm_package}
|
||||
@ -965,7 +945,6 @@ getent passwd qemu >/dev/null || \
|
||||
%if 0%{?need_qemu_kvm}
|
||||
%global qemu_kvm_files \
|
||||
%{_bindir}/qemu-kvm \
|
||||
%{_datadir}/systemtap/tapset/qemu-kvm.stp
|
||||
%endif
|
||||
|
||||
%files
|
||||
@ -1074,6 +1053,8 @@ getent passwd qemu >/dev/null || \
|
||||
%{_datadir}/systemtap/tapset/qemu-system-i386.stp
|
||||
%{_datadir}/systemtap/tapset/qemu-system-x86_64.stp
|
||||
%endif
|
||||
%{_datadir}/%{name}/acpi-dsdt.aml
|
||||
%{_datadir}/%{name}/q35-acpi-dsdt.aml
|
||||
%{_datadir}/%{name}/bios.bin
|
||||
%{_datadir}/%{name}/sgabios.bin
|
||||
%{_datadir}/%{name}/linuxboot.bin
|
||||
@ -1263,6 +1244,14 @@ getent passwd qemu >/dev/null || \
|
||||
%{_libdir}/pkgconfig/libcacard.pc
|
||||
|
||||
%changelog
|
||||
* Tue Feb 19 2013 Cole Robinson <crobinso@redhat.com> - 2:1.4.0-1
|
||||
- Rebased to version 1.4.0
|
||||
- block: dataplane for virtio, potentially large performance improvment
|
||||
- migration: threaded live migration
|
||||
- usb-tablet: usb 2.0 support, significantly lowering CPU usage
|
||||
- usb: improved support for pass-through of USB serial devices
|
||||
- virtio-net: added support supports multiqueue operation
|
||||
|
||||
* Sat Feb 2 2013 Michael Schwendt <mschwendt@fedoraproject.org> - 2:1.3.0-9
|
||||
- add BR perl-podlators for pod2man (F19 development)
|
||||
- fix "bogus date" entries in %%changelog to fix rebuild
|
||||
|
Loading…
x
Reference in New Issue
Block a user