From 2e55f16ca5d39371afd7ff835807e5972905040a Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Wed, 19 Mar 2014 15:43:47 -0400 Subject: [PATCH] Add patches --- ...local-QemuOptsLists-for-drive-option.patch | 181 ++++++++++++++++++ ...ine-tuning-whitelist-by-adding-times.patch | 28 +++ ...reaming-video-mode-to-off-by-default.patch | 33 ++++ ...nsfer-length-and-direction-for-VERIF.patch | 59 ++++++ 0108-scsi-disk-fix-VERIFY-emulation.patch | 90 +++++++++ ...ADVISE_DONT_NEED-for-incoming-zero-p.patch | 47 +++++ ...link-with-all-libraries-QEMU-links-t.patch | 30 +++ 0111-gtk-Fix-mouse-warping-with-gtk3.patch | 33 ++++ 0112-gtk-Don-t-warp-absolute-pointer.patch | 42 ++++ ...accelerator-to-ctrl-shift-q-bz-10623.patch | 37 ++++ ...el_io-vector-for-scsi_disk_emulate_o.patch | 31 +++ ...i-Cleanup-of-I-Os-that-never-started.patch | 39 ++++ ...i-Prevent-assertion-on-missed-events.patch | 30 +++ 13 files changed, 680 insertions(+) create mode 100644 0104-qmp-access-the-local-QemuOptsLists-for-drive-option.patch create mode 100644 0105-seccomp-fine-tuning-whitelist-by-adding-times.patch create mode 100644 0106-spice-flip-streaming-video-mode-to-off-by-default.patch create mode 100644 0107-scsi-bus-fix-transfer-length-and-direction-for-VERIF.patch create mode 100644 0108-scsi-disk-fix-VERIFY-emulation.patch create mode 100644 0109-migration-drop-MADVISE_DONT_NEED-for-incoming-zero-p.patch create mode 100644 0110-libcacard-Don-t-link-with-all-libraries-QEMU-links-t.patch create mode 100644 0111-gtk-Fix-mouse-warping-with-gtk3.patch create mode 100644 0112-gtk-Don-t-warp-absolute-pointer.patch create mode 100644 0113-Change-gtk-quit-accelerator-to-ctrl-shift-q-bz-10623.patch create mode 100644 0114-scsi-Assign-cancel_io-vector-for-scsi_disk_emulate_o.patch create mode 100644 0115-virtio-scsi-Cleanup-of-I-Os-that-never-started.patch create mode 100644 0116-virtio-scsi-Prevent-assertion-on-missed-events.patch diff --git a/0104-qmp-access-the-local-QemuOptsLists-for-drive-option.patch b/0104-qmp-access-the-local-QemuOptsLists-for-drive-option.patch new file mode 100644 index 0000000..01ea803 --- /dev/null +++ b/0104-qmp-access-the-local-QemuOptsLists-for-drive-option.patch @@ -0,0 +1,181 @@ +From ef8acf5e5e525f5c757b57f9f3f0b3727459b6ad Mon Sep 17 00:00:00 2001 +From: Amos Kong +Date: Fri, 15 Nov 2013 18:53:14 +0100 +Subject: [PATCH] qmp: access the local QemuOptsLists for drive option + +Currently we have three QemuOptsList (qemu_common_drive_opts, +qemu_legacy_drive_opts, and qemu_drive_opts), only qemu_drive_opts +is added to vm_config_groups[]. + +This patch changes query-command-line-options to access three local +QemuOptsLists for drive option, and merge the description items +together. + +Signed-off-by: Amos Kong +Signed-off-by: Kevin Wolf +--- + blockdev.c | 1 - + include/qemu/config-file.h | 1 + + include/sysemu/sysemu.h | 1 + + util/qemu-config.c | 77 +++++++++++++++++++++++++++++++++++++++++++++- + vl.c | 2 ++ + 5 files changed, 80 insertions(+), 2 deletions(-) + +diff --git a/blockdev.c b/blockdev.c +index 097932c..1a6892e 100644 +--- a/blockdev.c ++++ b/blockdev.c +@@ -45,7 +45,6 @@ + #include "sysemu/arch_init.h" + + static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives); +-extern QemuOptsList qemu_common_drive_opts; + extern QemuOptsList qemu_old_drive_opts; + + static const char *const if_name[IF_COUNT] = { +diff --git a/include/qemu/config-file.h b/include/qemu/config-file.h +index ad4a9e5..508428f 100644 +--- a/include/qemu/config-file.h ++++ b/include/qemu/config-file.h +@@ -8,6 +8,7 @@ + QemuOptsList *qemu_find_opts(const char *group); + QemuOptsList *qemu_find_opts_err(const char *group, Error **errp); + void qemu_add_opts(QemuOptsList *list); ++void qemu_add_drive_opts(QemuOptsList *list); + int qemu_set_option(const char *str); + int qemu_global_option(const char *str); + void qemu_add_globals(void); +diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h +index 1a77c99..4962cef 100644 +--- a/include/sysemu/sysemu.h ++++ b/include/sysemu/sysemu.h +@@ -190,6 +190,7 @@ QemuOpts *qemu_get_machine_opts(void); + + bool usb_enabled(bool default_usb); + ++extern QemuOptsList qemu_common_drive_opts; + extern QemuOptsList qemu_drive_opts; + extern QemuOptsList qemu_chardev_opts; + extern QemuOptsList qemu_device_opts; +diff --git a/util/qemu-config.c b/util/qemu-config.c +index a59568d..04da942 100644 +--- a/util/qemu-config.c ++++ b/util/qemu-config.c +@@ -8,6 +8,7 @@ + #include "qmp-commands.h" + + static QemuOptsList *vm_config_groups[32]; ++static QemuOptsList *drive_config_groups[4]; + + static QemuOptsList *find_list(QemuOptsList **lists, const char *group, + Error **errp) +@@ -77,6 +78,59 @@ static CommandLineParameterInfoList *query_option_descs(const QemuOptDesc *desc) + return param_list; + } + ++/* remove repeated entry from the info list */ ++static void cleanup_infolist(CommandLineParameterInfoList *head) ++{ ++ CommandLineParameterInfoList *pre_entry, *cur, *del_entry; ++ ++ cur = head; ++ while (cur->next) { ++ pre_entry = head; ++ while (pre_entry != cur->next) { ++ if (!strcmp(pre_entry->value->name, cur->next->value->name)) { ++ del_entry = cur->next; ++ cur->next = cur->next->next; ++ g_free(del_entry); ++ break; ++ } ++ pre_entry = pre_entry->next; ++ } ++ cur = cur->next; ++ } ++} ++ ++/* merge the description items of two parameter infolists */ ++static void connect_infolist(CommandLineParameterInfoList *head, ++ CommandLineParameterInfoList *new) ++{ ++ CommandLineParameterInfoList *cur; ++ ++ cur = head; ++ while (cur->next) { ++ cur = cur->next; ++ } ++ cur->next = new; ++} ++ ++/* access all the local QemuOptsLists for drive option */ ++static CommandLineParameterInfoList *get_drive_infolist(void) ++{ ++ CommandLineParameterInfoList *head = NULL, *cur; ++ int i; ++ ++ for (i = 0; drive_config_groups[i] != NULL; i++) { ++ if (!head) { ++ head = query_option_descs(drive_config_groups[i]->desc); ++ } else { ++ cur = query_option_descs(drive_config_groups[i]->desc); ++ connect_infolist(head, cur); ++ } ++ } ++ cleanup_infolist(head); ++ ++ return head; ++} ++ + CommandLineOptionInfoList *qmp_query_command_line_options(bool has_option, + const char *option, + Error **errp) +@@ -89,7 +143,12 @@ CommandLineOptionInfoList *qmp_query_command_line_options(bool has_option, + if (!has_option || !strcmp(option, vm_config_groups[i]->name)) { + info = g_malloc0(sizeof(*info)); + info->option = g_strdup(vm_config_groups[i]->name); +- info->parameters = query_option_descs(vm_config_groups[i]->desc); ++ if (!strcmp("drive", vm_config_groups[i]->name)) { ++ info->parameters = get_drive_infolist(); ++ } else { ++ info->parameters = ++ query_option_descs(vm_config_groups[i]->desc); ++ } + entry = g_malloc0(sizeof(*entry)); + entry->value = info; + entry->next = conf_list; +@@ -109,6 +168,22 @@ QemuOptsList *qemu_find_opts_err(const char *group, Error **errp) + return find_list(vm_config_groups, group, errp); + } + ++void qemu_add_drive_opts(QemuOptsList *list) ++{ ++ int entries, i; ++ ++ entries = ARRAY_SIZE(drive_config_groups); ++ entries--; /* keep list NULL terminated */ ++ for (i = 0; i < entries; i++) { ++ if (drive_config_groups[i] == NULL) { ++ drive_config_groups[i] = list; ++ return; ++ } ++ } ++ fprintf(stderr, "ran out of space in drive_config_groups"); ++ abort(); ++} ++ + void qemu_add_opts(QemuOptsList *list) + { + int entries, i; +diff --git a/vl.c b/vl.c +index 2160933..63ecf16 100644 +--- a/vl.c ++++ b/vl.c +@@ -2942,6 +2942,8 @@ int main(int argc, char **argv, char **envp) + module_call_init(MODULE_INIT_QOM); + + qemu_add_opts(&qemu_drive_opts); ++ qemu_add_drive_opts(&qemu_common_drive_opts); ++ qemu_add_drive_opts(&qemu_drive_opts); + qemu_add_opts(&qemu_chardev_opts); + qemu_add_opts(&qemu_device_opts); + qemu_add_opts(&qemu_netdev_opts); diff --git a/0105-seccomp-fine-tuning-whitelist-by-adding-times.patch b/0105-seccomp-fine-tuning-whitelist-by-adding-times.patch new file mode 100644 index 0000000..fe54a45 --- /dev/null +++ b/0105-seccomp-fine-tuning-whitelist-by-adding-times.patch @@ -0,0 +1,28 @@ +From df8a1ce561045d160793b3ef703be0383435e7f4 Mon Sep 17 00:00:00 2001 +From: Eduardo Otubo +Date: Tue, 24 Sep 2013 14:50:44 -0300 +Subject: [PATCH] seccomp: fine tuning whitelist by adding times() + +This was causing Qemu process to hang when using -sandbox on as +discribed on RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1004175 + +Signed-off-by: Eduardo Otubo +Tested-by: Paul Moore +Acked-by: Paul Moore +(cherry picked from commit c236f4519c9838801798f3705c17dce9ab9e3b9d) +--- + qemu-seccomp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/qemu-seccomp.c b/qemu-seccomp.c +index fb3cbfd..cf07869 100644 +--- a/qemu-seccomp.c ++++ b/qemu-seccomp.c +@@ -90,6 +90,7 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = { + { SCMP_SYS(getuid), 245 }, + { SCMP_SYS(geteuid), 245 }, + { SCMP_SYS(timer_create), 245 }, ++ { SCMP_SYS(times), 245 }, + { SCMP_SYS(exit), 245 }, + { SCMP_SYS(clock_gettime), 245 }, + { SCMP_SYS(time), 245 }, diff --git a/0106-spice-flip-streaming-video-mode-to-off-by-default.patch b/0106-spice-flip-streaming-video-mode-to-off-by-default.patch new file mode 100644 index 0000000..ffbca04 --- /dev/null +++ b/0106-spice-flip-streaming-video-mode-to-off-by-default.patch @@ -0,0 +1,33 @@ +From dd401ac8556becaea503205b32e3fc117559d960 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Mon, 2 Dec 2013 11:17:04 +0100 +Subject: [PATCH] spice: flip streaming video mode to off by default + +Video streaming detection heuristics in spice-server have problems +keeping modern desktop animations (as done by gnome shell) and real +video playback apart. This leads to jpeg compression artefacts on +your desktop, due to spice using mjpeg to send what it thinks is +a video stream. + +Turn off video detection by default to avoid these artifacts. + +Signed-off-by: Gerd Hoffmann +Reviewed-by: Alon Levy +(cherry picked from commit f1d3e586f069e17f83b669842bc02d60d509daca) +--- + ui/spice-core.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/ui/spice-core.c b/ui/spice-core.c +index bd7a248..3960fa0 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -778,6 +778,8 @@ void qemu_spice_init(void) + if (str) { + int streaming_video = parse_stream_video(str); + spice_server_set_streaming_video(spice_server, streaming_video); ++ } else { ++ spice_server_set_streaming_video(spice_server, SPICE_STREAM_VIDEO_OFF); + } + + spice_server_set_agent_mouse diff --git a/0107-scsi-bus-fix-transfer-length-and-direction-for-VERIF.patch b/0107-scsi-bus-fix-transfer-length-and-direction-for-VERIF.patch new file mode 100644 index 0000000..40f502c --- /dev/null +++ b/0107-scsi-bus-fix-transfer-length-and-direction-for-VERIF.patch @@ -0,0 +1,59 @@ +From d6f315b934c7b0311899636a1d90f01e94ebcaeb Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 28 Nov 2013 11:01:13 +0100 +Subject: [PATCH] scsi-bus: fix transfer length and direction for VERIFY + command +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The amount of bytes to transfer depends on the BYTCHK field. +If any data is transferred, it is sent to the device. + +Cc: qemu-stable@nongnu.org +Tested-by: Hervé Poussineau +Signed-off-by: Paolo Bonzini +(cherry picked from commit d12ad44cc4cc9142179e64295608611f118b8ad8) +--- + hw/scsi/scsi-bus.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c +index d352da7..e2fcd60 100644 +--- a/hw/scsi/scsi-bus.c ++++ b/hw/scsi/scsi-bus.c +@@ -886,7 +886,6 @@ static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf) + case RELEASE: + case ERASE: + case ALLOW_MEDIUM_REMOVAL: +- case VERIFY_10: + case SEEK_10: + case SYNCHRONIZE_CACHE: + case SYNCHRONIZE_CACHE_16: +@@ -903,6 +902,16 @@ static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf) + case ALLOW_OVERWRITE: + cmd->xfer = 0; + break; ++ case VERIFY_10: ++ case VERIFY_12: ++ case VERIFY_16: ++ if ((buf[1] & 2) == 0) { ++ cmd->xfer = 0; ++ } else if ((buf[1] & 4) == 1) { ++ cmd->xfer = 1; ++ } ++ cmd->xfer *= dev->blocksize; ++ break; + case MODE_SENSE: + break; + case WRITE_SAME_10: +@@ -1100,6 +1109,9 @@ static void scsi_cmd_xfer_mode(SCSICommand *cmd) + case WRITE_VERIFY_12: + case WRITE_16: + case WRITE_VERIFY_16: ++ case VERIFY_10: ++ case VERIFY_12: ++ case VERIFY_16: + case COPY: + case COPY_VERIFY: + case COMPARE: diff --git a/0108-scsi-disk-fix-VERIFY-emulation.patch b/0108-scsi-disk-fix-VERIFY-emulation.patch new file mode 100644 index 0000000..d8b4f01 --- /dev/null +++ b/0108-scsi-disk-fix-VERIFY-emulation.patch @@ -0,0 +1,90 @@ +From ae768bf8d6f15a3cce8edf4602d86352beab506a Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 28 Nov 2013 11:18:56 +0100 +Subject: [PATCH] scsi-disk: fix VERIFY emulation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +VERIFY emulation was completely botched (and remained botched through +all the refactorings). The command must be emulated both in check-medium +mode (BYTCHK=00, which we implement by doing nothing) and in check-bytes +mode (which we do not implement yet). Unlike WRITE AND VERIFY (which we +treat simply as WRITE with FUA bit set), VERIFY cannot be handled like +READ. In fact the device is _receiving_ data for VERIFY, not _sending_ +it like READ. + +Cc: qemu-stable@nongnu.org +Tested-by: Hervé Poussineau +Signed-off-by: Paolo Bonzini +(cherry picked from commit d97e7730816094a71cd1f19a56d7a73f77cdbf96) + +Conflicts: + hw/scsi/scsi-disk.c +--- + hw/scsi/scsi-disk.c | 26 +++++++++++++++++++------- + 1 file changed, 19 insertions(+), 7 deletions(-) + +diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c +index 74e6a14..1fd1c26 100644 +--- a/hw/scsi/scsi-disk.c ++++ b/hw/scsi/scsi-disk.c +@@ -1597,6 +1597,14 @@ static void scsi_disk_emulate_write_data(SCSIRequest *req) + scsi_disk_emulate_unmap(r, r->iov.iov_base); + break; + ++ case VERIFY_10: ++ case VERIFY_12: ++ case VERIFY_16: ++ if (r->req.status == -1) { ++ scsi_check_condition(r, SENSE_CODE(INVALID_FIELD)); ++ } ++ break; ++ + default: + abort(); + } +@@ -1837,6 +1845,14 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf) + case UNMAP: + DPRINTF("Unmap (len %lu)\n", (long)r->req.cmd.xfer); + break; ++ case VERIFY_10: ++ case VERIFY_12: ++ case VERIFY_16: ++ DPRINTF("Verify (bytchk %lu)\n", (r->req.buf[1] >> 1) & 3); ++ if (req->cmd.buf[1] & 6) { ++ goto illegal_request; ++ } ++ break; + case WRITE_SAME_10: + case WRITE_SAME_16: + nb_sectors = scsi_data_cdb_length(r->req.cmd.buf); +@@ -1936,10 +1952,6 @@ static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf) + scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED)); + return 0; + } +- /* fallthrough */ +- case VERIFY_10: +- case VERIFY_12: +- case VERIFY_16: + DPRINTF("Write %s(sector %" PRId64 ", count %u)\n", + (command & 0xe) == 0xe ? "And Verify " : "", + r->req.cmd.lba, len); +@@ -2207,14 +2219,14 @@ static const SCSIReqOps *const scsi_disk_reqops_dispatch[256] = { + [UNMAP] = &scsi_disk_emulate_reqops, + [WRITE_SAME_10] = &scsi_disk_emulate_reqops, + [WRITE_SAME_16] = &scsi_disk_emulate_reqops, ++ [VERIFY_10] = &scsi_disk_emulate_reqops, ++ [VERIFY_12] = &scsi_disk_emulate_reqops, ++ [VERIFY_16] = &scsi_disk_emulate_reqops, + + [READ_6] = &scsi_disk_dma_reqops, + [READ_10] = &scsi_disk_dma_reqops, + [READ_12] = &scsi_disk_dma_reqops, + [READ_16] = &scsi_disk_dma_reqops, +- [VERIFY_10] = &scsi_disk_dma_reqops, +- [VERIFY_12] = &scsi_disk_dma_reqops, +- [VERIFY_16] = &scsi_disk_dma_reqops, + [WRITE_6] = &scsi_disk_dma_reqops, + [WRITE_10] = &scsi_disk_dma_reqops, + [WRITE_12] = &scsi_disk_dma_reqops, diff --git a/0109-migration-drop-MADVISE_DONT_NEED-for-incoming-zero-p.patch b/0109-migration-drop-MADVISE_DONT_NEED-for-incoming-zero-p.patch new file mode 100644 index 0000000..9cd0ec3 --- /dev/null +++ b/0109-migration-drop-MADVISE_DONT_NEED-for-incoming-zero-p.patch @@ -0,0 +1,47 @@ +From 4c99df0e305aeb93405575daef6dc79de054f1aa Mon Sep 17 00:00:00 2001 +From: Peter Lieven +Date: Thu, 24 Oct 2013 09:21:29 +0200 +Subject: [PATCH] migration: drop MADVISE_DONT_NEED for incoming zero pages + +The madvise for zeroed out pages was introduced when every transferred +zero page was memset to zero and thus allocated. Since commit +211ea740 we check for zeroness of a target page before we memset +it to zero. Additionally we memmap target memory so it is essentially +zero initialized (except for e.g. option roms and bios which are loaded +into target memory although they shouldn't). + +It was reported recently that this madvise causes a performance degradation +in some situations. As the madvise should only be called rarely and if it's called +it is likely on a busy page (it was non-zero and changed to zero during migration) +drop it completely. + +Reported-By: Zhang Haoyu +Acked-by: Paolo Bonzini +Signed-off-by: Peter Lieven +Signed-off-by: Juan Quintela +(cherry picked from commit fc1c4a5d32e15a4c40c47945da85ef9c1e0c1b54) + +Conflicts: + arch_init.c +--- + arch_init.c | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/arch_init.c b/arch_init.c +index 68a7ab7..23151b3 100644 +--- a/arch_init.c ++++ b/arch_init.c +@@ -845,13 +845,6 @@ void ram_handle_compressed(void *host, uint8_t ch, uint64_t size) + { + if (ch != 0 || !is_zero_page(host)) { + memset(host, ch, size); +-#ifndef _WIN32 +- if (ch == 0 && +- (!kvm_enabled() || kvm_has_sync_mmu()) && +- getpagesize() <= TARGET_PAGE_SIZE) { +- qemu_madvise(host, TARGET_PAGE_SIZE, QEMU_MADV_DONTNEED); +- } +-#endif + } + } + diff --git a/0110-libcacard-Don-t-link-with-all-libraries-QEMU-links-t.patch b/0110-libcacard-Don-t-link-with-all-libraries-QEMU-links-t.patch new file mode 100644 index 0000000..eabf6df --- /dev/null +++ b/0110-libcacard-Don-t-link-with-all-libraries-QEMU-links-t.patch @@ -0,0 +1,30 @@ +From 61ec7dc46f8acad7ea6be4ba1993048f7404b0e3 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Thu, 30 Jan 2014 14:56:49 +0100 +Subject: [PATCH] libcacard: Don't link with all libraries QEMU links to + +As described in https://bugzilla.redhat.com/show_bug.cgi?id=987441 , +libcacard currently links to all the libraries QEMU is linking to, +including glusterfs libraries, libiscsi, ... libcacard does not need all of +these. This patch ensures it's only linked with the libraries it needs. + +Signed-off-by: Christophe Fergeau +Signed-off-by: Alon Levy +(cherry picked from commit 73db416ae7941f8ffeabc060ec87402b97314b6d) +--- + libcacard/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libcacard/Makefile b/libcacard/Makefile +index 47827a0..9fa297c 100644 +--- a/libcacard/Makefile ++++ b/libcacard/Makefile +@@ -24,7 +24,7 @@ vscclient$(EXESUF): libcacard/vscclient.o libcacard.la + + libcacard.la: LDFLAGS += -rpath $(libdir) -no-undefined \ + -export-syms $(SRC_PATH)/libcacard/libcacard.syms +-libcacard.la: LIBS += $(libcacard_libs) ++libcacard.la: LIBS = $(libcacard_libs) + libcacard.la: $(libcacard-lobj-y) + $(call LINK,$^) + diff --git a/0111-gtk-Fix-mouse-warping-with-gtk3.patch b/0111-gtk-Fix-mouse-warping-with-gtk3.patch new file mode 100644 index 0000000..1c31ba0 --- /dev/null +++ b/0111-gtk-Fix-mouse-warping-with-gtk3.patch @@ -0,0 +1,33 @@ +From 8273919dfbb42ab63c683ec73264f94178cfe82e Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Thu, 13 Mar 2014 15:30:23 -0400 +Subject: [PATCH] gtk: Fix mouse warping with gtk3 + +We were using the wrong coordinates, this fixes things to match the +original gtk2 implementation. + +You can see this error in action by using -vga qxl, however even after this +patch the mouse warps in small increments up and to the left, -7x and -3y +pixels at a time, until the pointer is warped off the widget. I think it's +a qxl bug, but the next patch covers it up. + +Signed-off-by: Cole Robinson +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 298526fe92d0b35ea343f8ddcc3a1d54cb422494) +--- + ui/gtk.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ui/gtk.c b/ui/gtk.c +index c38146f..6c9d90a 100644 +--- a/ui/gtk.c ++++ b/ui/gtk.c +@@ -355,7 +355,7 @@ static void gd_mouse_set(DisplayChangeListener *dcl, + x, y, &x_root, &y_root); + gdk_device_warp(gdk_device_manager_get_client_pointer(mgr), + gtk_widget_get_screen(s->drawing_area), +- x, y); ++ x_root, y_root); + } + #else + static void gd_mouse_set(DisplayChangeListener *dcl, diff --git a/0112-gtk-Don-t-warp-absolute-pointer.patch b/0112-gtk-Don-t-warp-absolute-pointer.patch new file mode 100644 index 0000000..c5fd8ef --- /dev/null +++ b/0112-gtk-Don-t-warp-absolute-pointer.patch @@ -0,0 +1,42 @@ +From 256b1b8cb133a1f26587e068fb403f067aeeaa59 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Thu, 13 Mar 2014 15:30:24 -0400 +Subject: [PATCH] gtk: Don't warp absolute pointer + +This matches the behavior of SDL, and makes the mouse usable when +using -display gtk -vga qxl + +https://bugzilla.redhat.com/show_bug.cgi?id=1051724 +Signed-off-by: Cole Robinson +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 2bda66028b4962c36d4eabe2995edab12df93691) +--- + ui/gtk.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/ui/gtk.c b/ui/gtk.c +index 6c9d90a..6ce9694 100644 +--- a/ui/gtk.c ++++ b/ui/gtk.c +@@ -349,6 +349,10 @@ static void gd_mouse_set(DisplayChangeListener *dcl, + GdkDeviceManager *mgr; + gint x_root, y_root; + ++ if (kbd_mouse_is_absolute()) { ++ return; ++ } ++ + dpy = gtk_widget_get_display(s->drawing_area); + mgr = gdk_display_get_device_manager(dpy); + gdk_window_get_root_coords(gtk_widget_get_window(s->drawing_area), +@@ -364,6 +368,10 @@ static void gd_mouse_set(DisplayChangeListener *dcl, + GtkDisplayState *s = container_of(dcl, GtkDisplayState, dcl); + gint x_root, y_root; + ++ if (kbd_mouse_is_absolute()) { ++ return; ++ } ++ + gdk_window_get_root_coords(gtk_widget_get_window(s->drawing_area), + x, y, &x_root, &y_root); + gdk_display_warp_pointer(gtk_widget_get_display(s->drawing_area), diff --git a/0113-Change-gtk-quit-accelerator-to-ctrl-shift-q-bz-10623.patch b/0113-Change-gtk-quit-accelerator-to-ctrl-shift-q-bz-10623.patch new file mode 100644 index 0000000..3cb08ff --- /dev/null +++ b/0113-Change-gtk-quit-accelerator-to-ctrl-shift-q-bz-10623.patch @@ -0,0 +1,37 @@ +From 94f0d20c1a3fa880fa4736c86bafd50c46e1cc57 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Wed, 19 Mar 2014 14:57:27 -0400 +Subject: [PATCH] Change gtk quit accelerator to ctrl+shift+q (bz 1062393) + +Similar patches queued for 2.1 +--- + ui/gtk.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/ui/gtk.c b/ui/gtk.c +index 6ce9694..8bc667d 100644 +--- a/ui/gtk.c ++++ b/ui/gtk.c +@@ -1310,7 +1310,6 @@ static GtkWidget *gd_create_menu_machine(GtkDisplayState *s, GtkAccelGroup *acce + { + GtkWidget *machine_menu; + GtkWidget *separator; +- GtkStockItem item; + + machine_menu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(machine_menu), accel_group); +@@ -1330,11 +1329,11 @@ static GtkWidget *gd_create_menu_machine(GtkDisplayState *s, GtkAccelGroup *acce + separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), separator); + +- s->quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); +- gtk_stock_lookup(GTK_STOCK_QUIT, &item); ++ s->quit_item = gtk_menu_item_new_with_mnemonic(_("_Quit")); + gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->quit_item), + "/Machine/Quit"); +- gtk_accel_map_add_entry("/Machine/Quit", item.keyval, item.modifier); ++ gtk_accel_map_add_entry("/Machine/Quit", ++ GDK_KEY_q, HOTKEY_MODIFIERS); + gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), s->quit_item); + + return machine_menu; diff --git a/0114-scsi-Assign-cancel_io-vector-for-scsi_disk_emulate_o.patch b/0114-scsi-Assign-cancel_io-vector-for-scsi_disk_emulate_o.patch new file mode 100644 index 0000000..84ad882 --- /dev/null +++ b/0114-scsi-Assign-cancel_io-vector-for-scsi_disk_emulate_o.patch @@ -0,0 +1,31 @@ +From fcaec0080923656c3607bd4d5eccc5d05c468dda Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Wed, 15 Jan 2014 10:35:36 +0100 +Subject: [PATCH] scsi: Assign cancel_io vector for scsi_disk_emulate_ops + +Some emulated disk operations (MODE SELECT, UNMAP, WRITE SAME) +can trigger asynchronous I/Os. Provide the cancel_io callback +to ensure that AIOCBs are properly cleaned up. + +Signed-off-by: Eric Farman +Cc: qemu-stable@nongnu.org +[Tweak commit message. - Paolo] +Signed-off-by: Paolo Bonzini + +(cherry picked from commit 33325a53f15ab5370e1917b2a11cadffc77c5a52) +--- + hw/scsi/scsi-disk.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c +index 1fd1c26..ade5d4a 100644 +--- a/hw/scsi/scsi-disk.c ++++ b/hw/scsi/scsi-disk.c +@@ -2181,6 +2181,7 @@ static const SCSIReqOps scsi_disk_emulate_reqops = { + .send_command = scsi_disk_emulate_command, + .read_data = scsi_disk_emulate_read_data, + .write_data = scsi_disk_emulate_write_data, ++ .cancel_io = scsi_cancel_io, + .get_buf = scsi_get_buf, + }; + diff --git a/0115-virtio-scsi-Cleanup-of-I-Os-that-never-started.patch b/0115-virtio-scsi-Cleanup-of-I-Os-that-never-started.patch new file mode 100644 index 0000000..b508f1e --- /dev/null +++ b/0115-virtio-scsi-Cleanup-of-I-Os-that-never-started.patch @@ -0,0 +1,39 @@ +From aa1e5b8649b8055722bf987d76322a1a1b46c407 Mon Sep 17 00:00:00 2001 +From: Eric Farman +Date: Tue, 14 Jan 2014 14:16:25 -0500 +Subject: [PATCH] virtio-scsi: Cleanup of I/Os that never started + +There is still a small window that occurs when a cancel I/O affects +an asynchronous I/O operation that hasn't started. In other words, +when the residual data length equals the expected data length. + +Today, the routine virtio_scsi_command_complete fails because the +VirtIOSCSIReq pointer (from the hba_private field in SCSIRequest) +was cleared earlier when virtio_scsi_complete_req was called by +the virtio_scsi_request_cancelled routine. As a result, the +virtio_scsi_command_complete routine needs to simply return when +it is processing a SCSIRequest block that was marked canceled. + +Signed-off-by: Eric Farman +Cc: qemu-stable@nongnu.org +Signed-off-by: Paolo Bonzini +(cherry picked from commit e9c0f0f58ad0a41c3c4b19e1911cfe095afc09ca) +--- + hw/scsi/virtio-scsi.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c +index 5545993..110827c 100644 +--- a/hw/scsi/virtio-scsi.c ++++ b/hw/scsi/virtio-scsi.c +@@ -306,6 +306,10 @@ static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status, + VirtIOSCSIReq *req = r->hba_private; + uint32_t sense_len; + ++ if (r->io_canceled) { ++ return; ++ } ++ + req->resp.cmd->response = VIRTIO_SCSI_S_OK; + req->resp.cmd->status = status; + if (req->resp.cmd->status == GOOD) { diff --git a/0116-virtio-scsi-Prevent-assertion-on-missed-events.patch b/0116-virtio-scsi-Prevent-assertion-on-missed-events.patch new file mode 100644 index 0000000..b312cc9 --- /dev/null +++ b/0116-virtio-scsi-Prevent-assertion-on-missed-events.patch @@ -0,0 +1,30 @@ +From 167ceff41489ca932ae7e75b54bb62c119341b05 Mon Sep 17 00:00:00 2001 +From: Eric Farman +Date: Tue, 14 Jan 2014 14:16:26 -0500 +Subject: [PATCH] virtio-scsi: Prevent assertion on missed events + +In some cases, an unplug can cause events to be dropped, which +leads to an assertion failure when preparing to notify the guest +kernel. + +Signed-off-by: Eric Farman +Cc: qemu-stable@nongnu.org +Signed-off-by: Paolo Bonzini +(cherry picked from commit 49fb65c7f985baa56d2964e0a85c1f098e3e2a9d) +--- + hw/scsi/virtio-scsi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c +index 110827c..15e40d9 100644 +--- a/hw/scsi/virtio-scsi.c ++++ b/hw/scsi/virtio-scsi.c +@@ -520,7 +520,7 @@ static void virtio_scsi_push_event(VirtIOSCSI *s, SCSIDevice *dev, + evt->event = event; + evt->reason = reason; + if (!dev) { +- assert(event == VIRTIO_SCSI_T_NO_EVENT); ++ assert(event == VIRTIO_SCSI_T_EVENTS_MISSED); + } else { + evt->lun[0] = 1; + evt->lun[1] = dev->id;