commit kvm for openSUSE:Factory
Hello community, here is the log from the commit of package kvm for openSUSE:Factory checked in at 2012-07-24 16:09:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kvm (Old) and /work/SRC/openSUSE:Factory/.kvm.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "kvm", Maintainer is "BROGERS@suse.com" Changes: -------- --- /work/SRC/openSUSE:Factory/kvm/kvm.changes 2012-07-09 08:01:46.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.kvm.new/kvm.changes 2012-07-24 17:22:07.000000000 +0200 @@ -1,0 +2,20 @@ +Tue Jul 17 21:59:45 UTC 2012 - brogers@suse.com + +- Update to qemu-kvm v1.1.1 (bug fixes only) Noteworthy fixes: + - rtl8139: validate rx ring before receiving packets + - ahci: SATA FIS is 20 bytes, not 0x20 + - sheepdog: fix return value of do_load_save_vm_state + - fdc: fix implied seek while there is no media in drive + - qcow2: fix autoclear image header update + - pci_bridge_dev: fix error path in pci_bridge_dev_initfn() + - qdev: release parent properties on dc->init failure + - intel-hda and ahci: Fix reset of MSI function + - rtl8139: honor RxOverflow flag in can_receive method + - monitor: Fix memory leak with readline completion + - qcow2: Silence false warning + - kvm: i8254: Fix conversion of in-kernel to userspace state + - kvm/apic: correct short memset + - exec: fix TB invalidation after breakpoint insertion/deletion + - virtio-blk: Fix geometry sector calculation + +------------------------------------------------------------------- Old: ---- kvm-qemu-preXX-qemu-kvm-Add-missing-default-machine-options.patch qemu-kvm-1.1.0.tar.bz2 New: ---- qemu-kvm-1.1.1.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kvm.spec ++++++ --- /var/tmp/diff_new_pack.SHhKPm/_old 2012-07-24 17:22:12.000000000 +0200 +++ /var/tmp/diff_new_pack.SHhKPm/_new 2012-07-24 17:22:12.000000000 +0200 @@ -19,8 +19,8 @@ %bcond_without spice -%define package_true_version 1.1.0 -%define package_base_version 1.1.0 +%define package_true_version 1.1.1 +%define package_base_version 1.1.1 %define bios_id seabios-1.7.0 # ipxe is through git commit id: addf699c86ae18edd7de13433da78be926c22504 %define pxe_rom_id ipxe-1.0.0 @@ -144,7 +144,6 @@ Patch105: kvm-qemu-preXX-dictzip3.patch Patch106: kvm-qemu-preXX-use--libexecdir-instead-of-ignoring.patch Patch107: kvm-qemu-preXX-uhci-fix-uhci_async_cancel_all.patch -Patch108: kvm-qemu-preXX-qemu-kvm-Add-missing-default-machine-options.patch Patch200: kvm-studio-slirp-nooutgoing.patch Patch201: kvm-studio-vnc.patch @@ -238,7 +237,6 @@ %patch105 -p1 %patch106 -p1 %patch107 -p1 -%patch108 -p1 # Studio addons %patch200 -p1 @@ -413,8 +411,6 @@ %files %defattr(-,root,root) -# qmp-commands.txt needs to be included as doc, we well as qemu-nbd.8? (we delete this above!!!!, also virtfs-proxy-helper.1 if building virtfs -# Also see what qemu has doc'd/ Do we want to NOT include kvm-supported.txt for oS? %doc COPYING COPYING.LIB Changelog README qemu-kvm.html qemu-kvm-tech.html kvm-supported.txt qmp-commands.txt %attr(755,root,kvm) %{_bindir}/qemu-kvm %attr(755,root,kvm) %{_bindir}/kvm_stat ++++++ qemu-kvm-1.1.0.tar.bz2 -> qemu-kvm-1.1.1.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/Makefile new/qemu-kvm-1.1.1/Makefile --- old/qemu-kvm-1.1.0/Makefile 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/Makefile 2012-07-16 09:52:03.000000000 +0200 @@ -271,6 +271,7 @@ install-doc: $(DOCS) $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)" $(INSTALL_DATA) qemu-doc.html qemu-tech.html "$(DESTDIR)$(qemu_docdir)" + $(INSTALL_DATA) QMP/qmp-commands.txt "$(DESTDIR)$(qemu_docdir)" ifdef CONFIG_POSIX $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1" $(INSTALL_DATA) qemu.1 qemu-img.1 "$(DESTDIR)$(mandir)/man1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/VERSION new/qemu-kvm-1.1.1/VERSION --- old/qemu-kvm-1.1.0/VERSION 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/VERSION 2012-07-16 09:52:03.000000000 +0200 @@ -1 +1 @@ -1.1.0 +1.1.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/block/qcow2-cluster.c new/qemu-kvm-1.1.1/block/qcow2-cluster.c --- old/qemu-kvm-1.1.0/block/qcow2-cluster.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/block/qcow2-cluster.c 2012-07-16 09:52:03.000000000 +0200 @@ -471,6 +471,8 @@ QCOW_OFLAG_COMPRESSED | QCOW_OFLAG_ZERO); *cluster_offset &= L2E_OFFSET_MASK; break; + default: + abort(); } qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/block/qcow2-refcount.c new/qemu-kvm-1.1.1/block/qcow2-refcount.c --- old/qemu-kvm-1.1.0/block/qcow2-refcount.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/block/qcow2-refcount.c 2012-07-16 09:52:03.000000000 +0200 @@ -367,7 +367,7 @@ } for(i = 0; i < table_size; i++) { - cpu_to_be64s(&new_table[i]); + be64_to_cpus(&new_table[i]); } /* Hook up the new refcount table in the qcow2 header */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/block/qcow2.c new/qemu-kvm-1.1.1/block/qcow2.c --- old/qemu-kvm-1.1.0/block/qcow2.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/block/qcow2.c 2012-07-16 09:52:03.000000000 +0200 @@ -298,14 +298,6 @@ goto fail; } - if (!bs->read_only && s->autoclear_features != 0) { - s->autoclear_features = 0; - ret = qcow2_update_header(bs); - if (ret < 0) { - goto fail; - } - } - /* Check support for various header values */ if (header.refcount_order != 4) { report_unsupported(bs, "%d bit reference counts", @@ -411,6 +403,15 @@ goto fail; } + /* Clear unknown autoclear feature bits */ + if (!bs->read_only && s->autoclear_features != 0) { + s->autoclear_features = 0; + ret = qcow2_update_header(bs); + if (ret < 0) { + goto fail; + } + } + /* Initialise locks */ qemu_co_mutex_init(&s->lock); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/block/sheepdog.c new/qemu-kvm-1.1.1/block/sheepdog.c --- old/qemu-kvm-1.1.0/block/sheepdog.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/block/sheepdog.c 2012-07-16 09:52:03.000000000 +0200 @@ -1957,7 +1957,7 @@ int64_t pos, int size, int load) { int fd, create; - int ret = 0; + int ret = 0, remaining = size; unsigned int data_len; uint64_t vmstate_oid; uint32_t vdi_index; @@ -1968,11 +1968,11 @@ return fd; } - while (size) { + while (remaining) { vdi_index = pos / SD_DATA_OBJ_SIZE; offset = pos % SD_DATA_OBJ_SIZE; - data_len = MIN(size, SD_DATA_OBJ_SIZE); + data_len = MIN(remaining, SD_DATA_OBJ_SIZE); vmstate_oid = vid_to_vmstate_oid(s->inode.vdi_id, vdi_index); @@ -1993,9 +1993,9 @@ } pos += data_len; - size -= data_len; - ret += data_len; + remaining -= data_len; } + ret = size; cleanup: closesocket(fd); return ret; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/configure new/qemu-kvm-1.1.1/configure --- old/qemu-kvm-1.1.0/configure 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/configure 2012-07-16 09:52:03.000000000 +0200 @@ -2828,7 +2828,11 @@ open_by_hande_at=no cat > $TMPC << EOF #include <fcntl.h> +#if !defined(AT_EMPTY_PATH) +# error missing definition +#else int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } +#endif EOF if compile_prog "" "" ; then open_by_handle_at=yes @@ -2932,7 +2936,8 @@ tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)" else if test "$virtfs" = yes; then - feature_not_found "virtfs" + echo "VirtFS is supported only on Linux and requires libcap-devel and libattr-devel" + exit 1 fi virtfs=no fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/exec.c new/qemu-kvm-1.1.1/exec.c --- old/qemu-kvm-1.1.0/exec.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/exec.c 2012-07-16 09:52:03.000000000 +0200 @@ -1492,7 +1492,8 @@ static void breakpoint_invalidate(CPUArchState *env, target_ulong pc) { - tb_invalidate_phys_addr(cpu_get_phys_page_debug(env, pc)); + tb_invalidate_phys_addr(cpu_get_phys_page_debug(env, pc) | + (pc & ~TARGET_PAGE_MASK)); } #endif #endif /* TARGET_HAS_ICE */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/ide/ahci.c new/qemu-kvm-1.1.1/hw/ide/ahci.c --- old/qemu-kvm-1.1.0/hw/ide/ahci.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/ide/ahci.c 2012-07-16 09:52:03.000000000 +0200 @@ -462,7 +462,7 @@ static void ahci_init_d2h(AHCIDevice *ad) { - uint8_t init_fis[0x20]; + uint8_t init_fis[20]; IDEState *ide_state = &ad->port.ifs[0]; memset(init_fis, 0, sizeof(init_fis)); @@ -619,7 +619,7 @@ d2h_fis[11] = cmd_fis[11]; d2h_fis[12] = cmd_fis[12]; d2h_fis[13] = cmd_fis[13]; - for (i = 14; i < 0x20; i++) { + for (i = 14; i < 20; i++) { d2h_fis[i] = 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/ide/ich.c new/qemu-kvm-1.1.1/hw/ide/ich.c --- old/qemu-kvm-1.1.0/hw/ide/ich.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/ide/ich.c 2012-07-16 09:52:03.000000000 +0200 @@ -84,6 +84,14 @@ .unmigratable = 1, }; +static void pci_ich9_reset(void *opaque) +{ + struct AHCIPCIState *d = opaque; + + msi_reset(&d->card); + ahci_reset(opaque); +} + static int pci_ich9_ahci_init(PCIDevice *dev) { struct AHCIPCIState *d; @@ -102,7 +110,7 @@ /* XXX Software should program this register */ d->card.config[0x90] = 1 << 6; /* Address Map Register - AHCI mode */ - qemu_register_reset(ahci_reset, d); + qemu_register_reset(pci_ich9_reset, d); msi_init(dev, 0x50, 1, true, false); d->ahci.irq = d->card.irq[0]; @@ -133,7 +141,7 @@ d = DO_UPCAST(struct AHCIPCIState, card, dev); msi_uninit(dev); - qemu_unregister_reset(ahci_reset, d); + qemu_unregister_reset(pci_ich9_reset, d); ahci_uninit(&d->ahci); return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/intel-hda.c new/qemu-kvm-1.1.1/hw/intel-hda.c --- old/qemu-kvm-1.1.0/hw/intel-hda.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/intel-hda.c 2012-07-16 09:52:03.000000000 +0200 @@ -1107,6 +1107,9 @@ DeviceState *qdev; HDACodecDevice *cdev; + if (d->msi) { + msi_reset(&d->pci); + } intel_hda_regs_reset(d); d->wall_base_ns = qemu_get_clock_ns(vm_clock); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/kvm/apic.c new/qemu-kvm-1.1.1/hw/kvm/apic.c --- old/qemu-kvm-1.1.0/hw/kvm/apic.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/kvm/apic.c 2012-07-16 09:52:03.000000000 +0200 @@ -29,7 +29,7 @@ APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d); int i; - memset(kapic, 0, sizeof(kapic)); + memset(kapic, 0, sizeof(*kapic)); kvm_apic_set_reg(kapic, 0x2, s->id << 24); kvm_apic_set_reg(kapic, 0x8, s->tpr); kvm_apic_set_reg(kapic, 0xd, s->log_dest << 24); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/pc_piix.c new/qemu-kvm-1.1.1/hw/pc_piix.c --- old/qemu-kvm-1.1.0/hw/pc_piix.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/pc_piix.c 2012-07-16 09:52:03.000000000 +0200 @@ -393,6 +393,7 @@ .desc = "Standard PC", .init = pc_init_pci, .max_cpus = 255, + .default_machine_opts = "accel=kvm,kernel_irqchip=on", .compat_props = (GlobalProperty[]) { PC_COMPAT_1_0, { /* end of list */ } @@ -407,6 +408,7 @@ .desc = "Standard PC", .init = pc_init_pci, .max_cpus = 255, + .default_machine_opts = "accel=kvm,kernel_irqchip=on", .compat_props = (GlobalProperty[]) { PC_COMPAT_0_15, { /* end of list */ } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/pci_bridge_dev.c new/qemu-kvm-1.1.1/hw/pci_bridge_dev.c --- old/qemu-kvm-1.1.0/hw/pci_bridge_dev.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/pci_bridge_dev.c 2012-07-16 09:52:03.000000000 +0200 @@ -52,7 +52,7 @@ { PCIBridge *br = DO_UPCAST(PCIBridge, dev, dev); PCIBridgeDev *bridge_dev = DO_UPCAST(PCIBridgeDev, bridge, br); - int err; + int err, ret; pci_bridge_map_irq(br, NULL, pci_bridge_dev_map_irq_fn); err = pci_bridge_initfn(dev); if (err) { @@ -86,6 +86,8 @@ shpc_cleanup(dev, &bridge_dev->bar); shpc_error: memory_region_destroy(&bridge_dev->bar); + ret = pci_bridge_exitfn(dev); + assert(!ret); bridge_error: return err; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/qdev-monitor.c new/qemu-kvm-1.1.1/hw/qdev-monitor.c --- old/qemu-kvm-1.1.0/hw/qdev-monitor.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/qdev-monitor.c 2012-07-16 09:52:03.000000000 +0200 @@ -20,6 +20,7 @@ #include "qdev.h" #include "monitor.h" #include "qmp-commands.h" +#include "arch_init.h" /* * Aliases were a bad idea from the start. Let's keep them @@ -29,16 +30,18 @@ { const char *typename; const char *alias; + uint32_t arch_mask; } QDevAlias; static const QDevAlias qdev_alias_table[] = { - { "virtio-blk-pci", "virtio-blk" }, - { "virtio-net-pci", "virtio-net" }, - { "virtio-serial-pci", "virtio-serial" }, - { "virtio-balloon-pci", "virtio-balloon" }, - { "virtio-blk-s390", "virtio-blk" }, - { "virtio-net-s390", "virtio-net" }, - { "virtio-serial-s390", "virtio-serial" }, + { "virtio-blk-pci", "virtio-blk", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X }, + { "virtio-net-pci", "virtio-net", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X }, + { "virtio-serial-pci", "virtio-serial", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X }, + { "virtio-balloon-pci", "virtio-balloon", + QEMU_ARCH_ALL & ~QEMU_ARCH_S390X }, + { "virtio-blk-s390", "virtio-blk", QEMU_ARCH_S390X }, + { "virtio-net-s390", "virtio-net", QEMU_ARCH_S390X }, + { "virtio-serial-s390", "virtio-serial", QEMU_ARCH_S390X }, { "lsi53c895a", "lsi" }, { "ich9-ahci", "ahci" }, { } @@ -50,6 +53,11 @@ int i; for (i = 0; qdev_alias_table[i].typename; i++) { + if (qdev_alias_table[i].arch_mask && + !(qdev_alias_table[i].arch_mask & arch_type)) { + continue; + } + if (strcmp(qdev_alias_table[i].typename, typename) == 0) { return qdev_alias_table[i].alias; } @@ -110,6 +118,11 @@ int i; for (i = 0; qdev_alias_table[i].alias; i++) { + if (qdev_alias_table[i].arch_mask && + !(qdev_alias_table[i].arch_mask & arch_type)) { + continue; + } + if (strcmp(qdev_alias_table[i].alias, alias) == 0) { return qdev_alias_table[i].typename; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/qdev.c new/qemu-kvm-1.1.1/hw/qdev.c --- old/qemu-kvm-1.1.0/hw/qdev.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/qdev.c 2012-07-16 09:52:03.000000000 +0200 @@ -150,6 +150,7 @@ rc = dc->init(dev); if (rc < 0) { + object_unparent(OBJECT(dev)); qdev_free(dev); return rc; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/rtl8139.c new/qemu-kvm-1.1.1/hw/rtl8139.c --- old/qemu-kvm-1.1.0/hw/rtl8139.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/rtl8139.c 2012-07-16 09:52:03.000000000 +0200 @@ -781,6 +781,13 @@ #endif } +/* Workaround for buggy guest driver such as linux who allocates rx + * rings after the receiver were enabled. */ +static bool rtl8139_cp_rx_valid(RTL8139State *s) +{ + return !(s->RxRingAddrLO == 0 && s->RxRingAddrHI == 0); +} + static int rtl8139_can_receive(VLANClientState *nc) { RTL8139State *s = DO_UPCAST(NICState, nc, nc)->opaque; @@ -792,14 +799,14 @@ if (!rtl8139_receiver_enabled(s)) return 1; - if (rtl8139_cp_receiver_enabled(s)) { + if (rtl8139_cp_receiver_enabled(s) && rtl8139_cp_rx_valid(s)) { /* ??? Flow control not implemented in c+ mode. This is a hack to work around slirp deficiencies anyway. */ return 1; } else { avail = MOD2(s->RxBufferSize + s->RxBufPtr - s->RxBufAddr, s->RxBufferSize); - return (avail == 0 || avail >= 1514); + return (avail == 0 || avail >= 1514 || (s->IntrMask & RxOverflow)); } } @@ -937,6 +944,10 @@ if (rtl8139_cp_receiver_enabled(s)) { + if (!rtl8139_cp_rx_valid(s)) { + return size; + } + DPRINTF("in C+ Rx mode ================\n"); /* begin C+ receiver mode */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/virtio-blk.c new/qemu-kvm-1.1.1/hw/virtio-blk.c --- old/qemu-kvm-1.1.0/hw/virtio-blk.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/virtio-blk.c 2012-07-16 09:52:03.000000000 +0200 @@ -147,9 +147,11 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req) { +#ifdef __linux__ int ret; - int status = VIRTIO_BLK_S_OK; int i; +#endif + int status = VIRTIO_BLK_S_OK; /* * We require at least one output segment each for the virtio_blk_outhdr @@ -489,7 +491,22 @@ stw_raw(&blkcfg.min_io_size, s->conf->min_io_size / blk_size); stw_raw(&blkcfg.opt_io_size, s->conf->opt_io_size / blk_size); blkcfg.heads = heads; - blkcfg.sectors = secs & ~s->sector_mask; + /* + * We must ensure that the block device capacity is a multiple of + * the logical block size. If that is not the case, lets use + * sector_mask to adopt the geometry to have a correct picture. + * For those devices where the capacity is ok for the given geometry + * we dont touch the sector value of the geometry, since some devices + * (like s390 dasd) need a specific value. Here the capacity is already + * cyls*heads*secs*blk_size and the sector value is not block size + * divided by 512 - instead it is the amount of blk_size blocks + * per track (cylinder). + */ + if (bdrv_getlength(s->bs) / heads / secs % blk_size) { + blkcfg.sectors = secs & ~s->sector_mask; + } else { + blkcfg.sectors = secs; + } blkcfg.size_max = 0; blkcfg.physical_block_exp = get_physical_block_exp(s->conf); blkcfg.alignment_offset = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/virtio-pci.c new/qemu-kvm-1.1.1/hw/virtio-pci.c --- old/qemu-kvm-1.1.0/hw/virtio-pci.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/virtio-pci.c 2012-07-16 09:52:03.000000000 +0200 @@ -629,7 +629,7 @@ /* Must unset mask notifier while guest notifier * is still assigned */ - if (!assign) { + if (kvm_irqchip_in_kernel() && !assign) { r = msix_unset_mask_notifier(&proxy->pci_dev); assert(r >= 0); } @@ -647,7 +647,7 @@ /* Must set mask notifier after guest notifier * has been assigned */ - if (assign) { + if (kvm_irqchip_in_kernel() && assign) { r = msix_set_mask_notifier(&proxy->pci_dev, virtio_pci_mask_notifier); if (r < 0) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/hw/xen_disk.c new/qemu-kvm-1.1.1/hw/xen_disk.c --- old/qemu-kvm-1.1.0/hw/xen_disk.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/hw/xen_disk.c 2012-07-16 09:52:03.000000000 +0200 @@ -537,6 +537,15 @@ blk_handle_requests(blkdev); } +/* + * We need to account for the grant allocations requiring contiguous + * chunks; the worst case number would be + * max_req * max_seg + (max_req - 1) * (max_seg - 1) + 1, + * but in order to keep things simple just use + * 2 * max_req * max_seg. + */ +#define MAX_GRANTS(max_req, max_seg) (2 * (max_req) * (max_seg)) + static void blk_alloc(struct XenDevice *xendev) { struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); @@ -548,6 +557,11 @@ if (xen_mode != XEN_EMULATE) { batch_maps = 1; } + if (xc_gnttab_set_max_grants(xendev->gnttabdev, + MAX_GRANTS(max_requests, BLKIF_MAX_SEGMENTS_PER_REQUEST)) < 0) { + xen_be_printf(xendev, 0, "xc_gnttab_set_max_grants failed: %s\n", + strerror(errno)); + } } static int blk_init(struct XenDevice *xendev) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/os-win32.c new/qemu-kvm-1.1.1/os-win32.c --- old/qemu-kvm-1.1.0/os-win32.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/os-win32.c 2012-07-16 09:52:03.000000000 +0200 @@ -57,7 +57,13 @@ static BOOL WINAPI qemu_ctrl_handler(DWORD type) { - exit(STATUS_CONTROL_C_EXIT); + qemu_system_shutdown_request(); + /* Windows 7 kills application when the function returns. + Sleep here to give QEMU a try for closing. + Sleep period is 10000ms because Windows kills the program + after 10 seconds anyway. */ + Sleep(10000); + return TRUE; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/qemu-img.texi new/qemu-kvm-1.1.1/qemu-img.texi --- old/qemu-kvm-1.1.0/qemu-img.texi 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/qemu-img.texi 2012-07-16 09:52:03.000000000 +0200 @@ -232,6 +232,29 @@ @end table +@item qed +Image format with support for backing files and compact image files (when your +filesystem or transport medium does not support holes). Good performance due +to less metadata than the more featureful qcow2 format, especially with +cache=writethrough or cache=directsync. Consider using qcow2 which will soon +have a similar optimization and is most actively developed. + +Supported options: +@table @code +@item backing_file +File name of a base image (see @option{create} subcommand). +@item backing_fmt +Image file format of backing file (optional). Useful if the format cannot be +autodetected because it has no header, like some vhd/vpc files. +@item cluster_size +Changes the cluster size (must be power-of-2 between 4K and 64K). Smaller +cluster sizes can improve the image file size whereas larger cluster sizes +generally provide better performance. +@item table_size +Changes the number of clusters per L1/L2 table (must be power-of-2 between 1 +and 16). There is normally no need to change this value but this option can be +used for performance benchmarking. +@end table @item qcow Old QEMU image format. Left for compatibility. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/readline.c new/qemu-kvm-1.1.1/readline.c --- old/qemu-kvm-1.1.0/readline.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/readline.c 2012-07-16 09:52:03.000000000 +0200 @@ -337,6 +337,9 @@ } readline_show_prompt(rs); } + for (i = 0; i < rs->nb_completions; i++) { + g_free(rs->completions[i]); + } } /* return true if command handled */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/target-xtensa/cpu.h new/qemu-kvm-1.1.1/target-xtensa/cpu.h --- old/qemu-kvm-1.1.0/target-xtensa/cpu.h 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/target-xtensa/cpu.h 2012-07-16 09:52:03.000000000 +0200 @@ -370,9 +370,12 @@ uint32_t *vpn, uint32_t wi, uint32_t *ei); int xtensa_tlb_lookup(const CPUXtensaState *env, uint32_t addr, bool dtlb, uint32_t *pwi, uint32_t *pei, uint8_t *pring); +void xtensa_tlb_set_entry_mmu(const CPUXtensaState *env, + xtensa_tlb_entry *entry, bool dtlb, + unsigned wi, unsigned ei, uint32_t vpn, uint32_t pte); void xtensa_tlb_set_entry(CPUXtensaState *env, bool dtlb, unsigned wi, unsigned ei, uint32_t vpn, uint32_t pte); -int xtensa_get_physical_addr(CPUXtensaState *env, +int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb, uint32_t vaddr, int is_write, int mmu_idx, uint32_t *paddr, uint32_t *page_size, unsigned *access); void reset_mmu(CPUXtensaState *env); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/target-xtensa/helper.c new/qemu-kvm-1.1.1/target-xtensa/helper.c --- old/qemu-kvm-1.1.0/target-xtensa/helper.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/target-xtensa/helper.c 2012-07-16 09:52:03.000000000 +0200 @@ -135,11 +135,11 @@ uint32_t page_size; unsigned access; - if (xtensa_get_physical_addr(env, addr, 0, 0, + if (xtensa_get_physical_addr(env, false, addr, 0, 0, &paddr, &page_size, &access) == 0) { return paddr; } - if (xtensa_get_physical_addr(env, addr, 2, 0, + if (xtensa_get_physical_addr(env, false, addr, 2, 0, &paddr, &page_size, &access) == 0) { return paddr; } @@ -448,30 +448,48 @@ } } -static int autorefill_mmu(CPUXtensaState *env, uint32_t vaddr, bool dtlb, - uint32_t *wi, uint32_t *ei, uint8_t *ring); +static int get_pte(CPUXtensaState *env, uint32_t vaddr, uint32_t *pte); -static int get_physical_addr_mmu(CPUXtensaState *env, +static int get_physical_addr_mmu(CPUXtensaState *env, bool update_tlb, uint32_t vaddr, int is_write, int mmu_idx, - uint32_t *paddr, uint32_t *page_size, unsigned *access) + uint32_t *paddr, uint32_t *page_size, unsigned *access, + bool may_lookup_pt) { bool dtlb = is_write != 2; uint32_t wi; uint32_t ei; uint8_t ring; + uint32_t vpn; + uint32_t pte; + const xtensa_tlb_entry *entry = NULL; + xtensa_tlb_entry tmp_entry; int ret = xtensa_tlb_lookup(env, vaddr, dtlb, &wi, &ei, &ring); if ((ret == INST_TLB_MISS_CAUSE || ret == LOAD_STORE_TLB_MISS_CAUSE) && - (mmu_idx != 0 || ((vaddr ^ env->sregs[PTEVADDR]) & 0xffc00000)) && - autorefill_mmu(env, vaddr, dtlb, &wi, &ei, &ring) == 0) { + may_lookup_pt && get_pte(env, vaddr, &pte) == 0) { + ring = (pte >> 4) & 0x3; + wi = 0; + split_tlb_entry_spec_way(env, vaddr, dtlb, &vpn, wi, &ei); + + if (update_tlb) { + wi = ++env->autorefill_idx & 0x3; + xtensa_tlb_set_entry(env, dtlb, wi, ei, vpn, pte); + env->sregs[EXCVADDR] = vaddr; + qemu_log("%s: autorefill(%08x): %08x -> %08x\n", + __func__, vaddr, vpn, pte); + } else { + xtensa_tlb_set_entry_mmu(env, &tmp_entry, dtlb, wi, ei, vpn, pte); + entry = &tmp_entry; + } ret = 0; } if (ret != 0) { return ret; } - const xtensa_tlb_entry *entry = - xtensa_tlb_get_entry(env, dtlb, wi, ei); + if (entry == NULL) { + entry = xtensa_tlb_get_entry(env, dtlb, wi, ei); + } if (ring < mmu_idx) { return dtlb ? @@ -494,30 +512,21 @@ return 0; } -static int autorefill_mmu(CPUXtensaState *env, uint32_t vaddr, bool dtlb, - uint32_t *wi, uint32_t *ei, uint8_t *ring) +static int get_pte(CPUXtensaState *env, uint32_t vaddr, uint32_t *pte) { uint32_t paddr; uint32_t page_size; unsigned access; uint32_t pt_vaddr = (env->sregs[PTEVADDR] | (vaddr >> 10)) & 0xfffffffc; - int ret = get_physical_addr_mmu(env, pt_vaddr, 0, 0, - &paddr, &page_size, &access); + int ret = get_physical_addr_mmu(env, false, pt_vaddr, 0, 0, + &paddr, &page_size, &access, false); qemu_log("%s: trying autorefill(%08x) -> %08x\n", __func__, vaddr, ret ? ~0 : paddr); if (ret == 0) { - uint32_t vpn; - uint32_t pte = ldl_phys(paddr); - - *ring = (pte >> 4) & 0x3; - *wi = (++env->autorefill_idx) & 0x3; - split_tlb_entry_spec_way(env, vaddr, dtlb, &vpn, *wi, ei); - xtensa_tlb_set_entry(env, dtlb, *wi, *ei, vpn, pte); - qemu_log("%s: autorefill(%08x): %08x -> %08x\n", - __func__, vaddr, vpn, pte); + *pte = ldl_phys(paddr); } return ret; } @@ -553,13 +562,13 @@ * * \return 0 if ok, exception cause code otherwise */ -int xtensa_get_physical_addr(CPUXtensaState *env, +int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb, uint32_t vaddr, int is_write, int mmu_idx, uint32_t *paddr, uint32_t *page_size, unsigned *access) { if (xtensa_option_enabled(env->config, XTENSA_OPTION_MMU)) { - return get_physical_addr_mmu(env, vaddr, is_write, mmu_idx, - paddr, page_size, access); + return get_physical_addr_mmu(env, update_tlb, + vaddr, is_write, mmu_idx, paddr, page_size, access, true); } else if (xtensa_option_bits_enabled(env->config, XTENSA_OPTION_BIT(XTENSA_OPTION_REGION_PROTECTION) | XTENSA_OPTION_BIT(XTENSA_OPTION_REGION_TRANSLATION))) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/target-xtensa/op_helper.c new/qemu-kvm-1.1.1/target-xtensa/op_helper.c --- old/qemu-kvm-1.1.0/target-xtensa/op_helper.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/target-xtensa/op_helper.c 2012-07-16 09:52:03.000000000 +0200 @@ -79,7 +79,7 @@ uint32_t paddr; uint32_t page_size; unsigned access; - int ret = xtensa_get_physical_addr(env, vaddr, is_write, mmu_idx, + int ret = xtensa_get_physical_addr(env, true, vaddr, is_write, mmu_idx, &paddr, &page_size, &access); qemu_log("%s(%08x, %d, %d) -> %08x, ret = %d\n", __func__, @@ -103,7 +103,7 @@ uint32_t paddr; uint32_t page_size; unsigned access; - int ret = xtensa_get_physical_addr(env, vaddr, 2, 0, + int ret = xtensa_get_physical_addr(env, false, vaddr, 2, 0, &paddr, &page_size, &access); if (ret == 0) { tb_invalidate_phys_addr(paddr); @@ -655,6 +655,16 @@ } } +void xtensa_tlb_set_entry_mmu(const CPUXtensaState *env, + xtensa_tlb_entry *entry, bool dtlb, + unsigned wi, unsigned ei, uint32_t vpn, uint32_t pte) +{ + entry->vaddr = vpn; + entry->paddr = pte & xtensa_tlb_get_addr_mask(env, dtlb, wi); + entry->asid = (env->sregs[RASID] >> ((pte >> 1) & 0x18)) & 0xff; + entry->attr = pte & 0xf; +} + void xtensa_tlb_set_entry(CPUXtensaState *env, bool dtlb, unsigned wi, unsigned ei, uint32_t vpn, uint32_t pte) { @@ -665,10 +675,8 @@ if (entry->asid) { tlb_flush_page(env, entry->vaddr); } - entry->vaddr = vpn; - entry->paddr = pte & xtensa_tlb_get_addr_mask(env, dtlb, wi); - entry->asid = (env->sregs[RASID] >> ((pte >> 1) & 0x18)) & 0xff; - entry->attr = pte & 0xf; + xtensa_tlb_set_entry_mmu(env, entry, dtlb, wi, ei, vpn, pte); + tlb_flush_page(env, entry->vaddr); } else { qemu_log("%s %d, %d, %d trying to set immutable entry\n", __func__, dtlb, wi, ei); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/target-xtensa/translate.c new/qemu-kvm-1.1.1/target-xtensa/translate.c --- old/qemu-kvm-1.1.0/target-xtensa/translate.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/target-xtensa/translate.c 2012-07-16 09:52:03.000000000 +0200 @@ -388,6 +388,7 @@ dc->next_pc == dc->lend) { int label = gen_new_label(); + gen_advance_ccount(dc); tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label); tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1); gen_jumpi(dc, dc->lbeg, slot); @@ -410,6 +411,7 @@ { int label = gen_new_label(); + gen_advance_ccount(dc); tcg_gen_brcond_i32(cond, t0, t1, label); gen_jumpi_check_loop_end(dc, 0); gen_set_label(label); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/tests/tcg/xtensa/test_mmu.S new/qemu-kvm-1.1.1/tests/tcg/xtensa/test_mmu.S --- old/qemu-kvm-1.1.0/tests/tcg/xtensa/test_mmu.S 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/tests/tcg/xtensa/test_mmu.S 2012-07-16 09:52:03.000000000 +0200 @@ -293,26 +293,219 @@ assert eq, a2, a3 test_end -test dtlb_autoload - set_vector kernel, 0 - - movi a2, 0xd4000000 +/* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr + * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr + */ +.macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr + movi a2, 0x80000000 wsr a2, ptevaddr - movi a3, 0x00001013 - s32i a3, a2, 4 + + movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */ + movi a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */ + wdtlb a4, a3 + isync + + movi a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr) + movi a1, ((\vaddr) >> 12) << 2 + add a2, a1, a2 + s32i a3, a2, 0 + + movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */ + movi a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */ + wdtlb a4, a3 + isync + + movi a3, (\vaddr) +.endm + +/* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */ +.macro go_ring ring, excm, vaddr + movi a3, 10f + pitlb a3, a3 + ritlb1 a2, a3 + movi a1, 0x10 + or a2, a2, a1 + movi a1, 0x000ff000 + and a3, a3, a1 + movi a1, 4 + or a3, a3, a1 + witlb a2, a3 + movi a3, 10f + movi a1, 0x000fffff + and a1, a3, a1 + + movi a2, 0 + wsr a2, excvaddr + + movi a3, \vaddr + movi a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4) + jx a1 +10: + wsr a2, ps + isync +.endm + +/* in: a3 -- virtual address to test */ +.macro assert_auto_tlb + movi a2, 0x4000f + wsr a2, ps + isync + pdtlb a2, a3 + movi a1, 0xfffff01f + and a2, a2, a1 + movi a1, 0xfffff000 + and a1, a1, a3 + xor a1, a1, a2 + assert gei, a1, 0x10 + movi a2, 0x14 + assert lt, a1, a2 +.endm + +/* in: a3 -- virtual address to test */ +.macro assert_no_auto_tlb + movi a2, 0x4000f + wsr a2, ps + isync pdtlb a2, a3 movi a1, 0x10 and a1, a1, a2 assert eqi, a1, 0 - l8ui a1, a3, 0 - pdtlb a2, a3 - movi a1, 0xfffff010 - and a1, a1, a2 - movi a3, 0x00001010 - assert eq, a1, a3 - movi a1, 0xf +.endm + +.macro assert_sr sr, v + rsr a2, \sr + movi a1, (\v) + assert eq, a1, a2 +.endm + +.macro assert_epc1_1m vaddr + movi a2, (\vaddr) + movi a1, 0xfffff and a1, a1, a2 - assert lti, a1, 4 + rsr a2, epc1 + assert eq, a1, a2 +.endm + +test dtlb_autoload + set_vector kernel, 0 + + pt_setup 0, 3, 1, 0x1000, 0x1000, 3 + assert_no_auto_tlb + + l8ui a1, a3, 0 + + rsr a2, excvaddr + assert eq, a2, a3 + + assert_auto_tlb +test_end + +test autoload_load_store_privilege + set_vector kernel, 0 + set_vector double, 2f + + pt_setup 0, 3, 0, 0x2000, 0x2000, 3 + movi a3, 0x2004 + assert_no_auto_tlb + + movi a2, 0x4005f /* ring 1 + excm => cring == 0 */ + wsr a2, ps + isync +1: + l32e a2, a3, -4 /* ring used */ + test_fail +2: + rsr a2, excvaddr + addi a1, a3, -4 + assert eq, a1, a2 + + assert_auto_tlb + assert_sr depc, 1b + assert_sr exccause, 26 +test_end + +test autoload_pte_load_prohibited + set_vector kernel, 2f + + pt_setup 0, 3, 0, 0x3000, 0, 0xc + assert_no_auto_tlb +1: + l32i a2, a3, 0 + test_fail +2: + rsr a2, excvaddr + assert eq, a2, a3 + + assert_auto_tlb + assert_sr epc1, 1b + assert_sr exccause, 28 +test_end + +test autoload_pt_load_prohibited + set_vector kernel, 2f + + pt_setup 0, 0xc, 0, 0x4000, 0x4000, 3 + assert_no_auto_tlb +1: + l32i a2, a3, 0 + test_fail +2: + rsr a2, excvaddr + assert eq, a2, a3 + + assert_no_auto_tlb + assert_sr epc1, 1b + assert_sr exccause, 24 +test_end + +test autoload_pt_privilege + set_vector kernel, 2f + pt_setup 0, 3, 1, 0x5000, 0, 3 + go_ring 1, 0, 0x5001 + + l8ui a2, a3, 0 +1: + syscall +2: + rsr a2, excvaddr + assert eq, a2, a3 + + assert_auto_tlb + assert_epc1_1m 1b + assert_sr exccause, 1 +test_end + +test autoload_pte_privilege + set_vector kernel, 2f + pt_setup 0, 3, 0, 0x6000, 0, 3 + go_ring 1, 0, 0x6001 +1: + l8ui a2, a3, 0 + syscall +2: + rsr a2, excvaddr + assert eq, a2, a3 + + assert_auto_tlb + assert_epc1_1m 1b + assert_sr exccause, 26 +test_end + +test autoload_3_level_pt + set_vector kernel, 2f + pt_setup 1, 3, 1, 0x00400000, 0, 3 + pt_setup 1, 3, 1, 0x80001000, 0x2000000, 3 + go_ring 1, 0, 0x00400001 +1: + l8ui a2, a3, 0 + syscall +2: + rsr a2, excvaddr + assert eq, a2, a3 + + assert_no_auto_tlb + assert_epc1_1m 1b + assert_sr exccause, 24 test_end test_suite_end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qemu-kvm-1.1.0/trace/simple.c new/qemu-kvm-1.1.1/trace/simple.c --- old/qemu-kvm-1.1.0/trace/simple.c 2012-06-30 04:14:15.000000000 +0200 +++ new/qemu-kvm-1.1.1/trace/simple.c 2012-07-16 09:52:03.000000000 +0200 @@ -161,8 +161,11 @@ } timestamp = get_clock(); - +#if GLIB_CHECK_VERSION(2, 30, 0) + idx = g_atomic_int_add((gint *)&trace_idx, 1) % TRACE_BUF_LEN; +#else idx = g_atomic_int_exchange_and_add((gint *)&trace_idx, 1) % TRACE_BUF_LEN; +#endif trace_buf[idx] = (TraceRecord){ .event = event, .timestamp_ns = timestamp, -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de