The following changes since commit 70f31414e71250c6049a46851372ee6ea76f40dd:
Merge remote-tracking branch 'remotes/ehabkost/tags/numa-pull-request' into staging (2017-06-01 10:58:47 +0100) are available in the git repository at: git://github.com/bonzini/qemu.git tags/for-upstream for you to fetch changes up to 0c5029c963dbce627d75cd0267594224c89a6479: Merge tag 'tags/for-upstream' into HEAD ---------------------------------------------------------------- * virtio-scsi use-after-free fix (Fam) * vhost-user-scsi support (Felipe) * SMM fixes and improvements for TCG (myself, Mihail) * irqchip and AddressSpaceDispatch cleanups and fixes (Peter) * Coverity fix (Stefano) * NBD cleanups and fixes (Vladimir, Eric, myself) * RTC accuracy improvements and code cleanups (Guangrong+Yunfang) * socket error reporting improvement (Daniel) * GDB XML description for SSE registers (Abdallah) * kvmclock update fix (Denis) * SMM memory savings (Gonglei) * -cpu 486 fix (Paolo) * various bugfixes (Roman, Peter, myself, Thomas) * rtc-test improvement (Guangrong) * migration throttling fix (Felipe) ---------------------------------------------------------------- Dropped Peter's "exec: fix address_space_get_iotlb_entry page mask" at his request, fixed vhost-user-scsi. Abdallah Bouassida (1): target/i386: Add GDB XML description for SSE registers Daniel P. Berrange (1): sockets: improve error reporting if UNIX socket path is too long Denis Plotnikov (1): kvmclock: update system_time_msr address forcibly Eric Blake (1): nbd: Fully initialize client in case of failed negotiation Fam Zheng (1): virtio-scsi: Unset hotplug handler when unrealize Felipe Franciosi (3): vhost-user-scsi: Introduce vhost-user-scsi host device vhost-user-scsi: Introduce a vhost-user-scsi sample application cpus: reset throttle_thread_scheduled after sleep Gonglei (1): kvm: don't register smram_listener when smm is off Mihail Abakumov (1): i386: fix read/write cr with icount option Paolo Bonzini (5): target/i386: enable A20 automatically in system management mode target/i386: use multiple CPU AddressSpaces linuxboot_dma: compile for i486 edu: fix memory leak on msi_broken platforms nbd: make it thread-safe, fix qcow2 over nbd Peter Xu (4): kvm: irqchip: trace changes on msi add/remove msix: trace control bit write op kvm: irqchip: skip update msi when disabled exec: simplify phys_page_find() params Roman Pen (1): i386/kvm: do not zero out segment flags if segment is unusable or not present Stefano Stabellini (1): Check the return value of fcntl in qemu_set_cloexec Tai Yunfang (1): mc146818rtc: precisely count the clock for periodic timer Thomas Huth (1): hw/core: nmi.c can be compiled as common-obj nowadays Vladimir Sementsov-Ogievskiy (5): nbd: strict nbd_wr_syncv nbd: read_sync and friends: return 0 on success nbd: add errp parameter to nbd_wr_syncv() nbd: add errp to read_sync, write_sync and drop_sync nbd/client.c: use errp instead of LOG Xiao Guangrong (5): mc146818rtc: update periodic timer only if it is needed mc146818rtc: ensure LOST_TICK_POLICY_SLEW is only enabled on TARGET_I386 mc146818rtc: drop unnecessary '#ifdef TARGET_I386' mc146818rtc: embrace all x86 specific code qtest: add rtc periodic timer test .gitignore | 1 + Makefile | 3 + Makefile.objs | 4 + block/nbd-client.c | 41 +- configure | 4 +- contrib/libvhost-user/libvhost-user.h | 11 +- contrib/vhost-user-scsi/Makefile.objs | 1 + contrib/vhost-user-scsi/vhost-user-scsi.c | 886 ++++++++++++++++++++++++++++++ cpus.c | 2 +- default-configs/pci.mak | 1 + default-configs/s390x-softmmu.mak | 1 + exec.c | 13 +- gdb-xml/i386-32bit-sse.xml | 52 ++ gdb-xml/i386-32bit.xml | 14 + gdb-xml/i386-64bit-sse.xml | 60 ++ gdb-xml/i386-64bit.xml | 14 + hw/core/Makefile.objs | 2 +- hw/i386/kvm/clock.c | 3 + hw/misc/edu.c | 12 +- hw/pci/msix.c | 11 +- hw/pci/trace-events | 3 + hw/scsi/Makefile.objs | 1 + hw/scsi/vhost-scsi-common.c | 1 - hw/scsi/vhost-user-scsi.c | 211 +++++++ hw/scsi/virtio-scsi.c | 3 + hw/timer/mc146818rtc.c | 203 ++++--- hw/virtio/virtio-pci.c | 58 ++ hw/virtio/virtio-pci.h | 11 + include/block/nbd.h | 8 +- include/hw/timer/mc146818rtc_regs.h | 20 + include/hw/virtio/vhost-user-scsi.h | 35 ++ include/hw/virtio/virtio-scsi.h | 2 + kvm-all.c | 8 +- nbd/client.c | 125 ++--- nbd/common.c | 23 +- nbd/nbd-internal.h | 40 +- nbd/server.c | 100 ++-- pc-bios/linuxboot_dma.bin | Bin 1536 -> 1536 bytes pc-bios/optionrom/Makefile | 1 + qemu-nbd.c | 5 +- target/i386/arch_memory_mapping.c | 18 +- target/i386/cpu.c | 23 +- target/i386/cpu.h | 20 +- target/i386/helper.c | 96 ++-- target/i386/kvm.c | 36 +- target/i386/machine.c | 4 - target/i386/smm_helper.c | 18 - target/i386/translate.c | 12 + tests/qemu-iotests/083.out | 2 + tests/rtc-test.c | 49 ++ trace-events | 3 +- util/oslib-posix.c | 4 +- util/qemu-sockets.c | 68 ++- 53 files changed, 1954 insertions(+), 393 deletions(-) create mode 100644 contrib/vhost-user-scsi/Makefile.objs create mode 100644 contrib/vhost-user-scsi/vhost-user-scsi.c create mode 100644 gdb-xml/i386-32bit-sse.xml create mode 100644 gdb-xml/i386-32bit.xml create mode 100644 gdb-xml/i386-64bit-sse.xml create mode 100644 gdb-xml/i386-64bit.xml create mode 100644 hw/scsi/vhost-user-scsi.c create mode 100644 include/hw/virtio/vhost-user-scsi.h -- 2.13.0 diff --cc hw/scsi/vhost-user-scsi.c index 0000000000,d27b2ada8e..c8fdf33074 mode 000000,100644..100644 --- a/hw/scsi/vhost-user-scsi.c +++ b/hw/scsi/vhost-user-scsi.c @@@ -1,0 -1,211 +1,211 @@@ + /* + * vhost-user-scsi host device + * + * Copyright (c) 2016 Nutanix Inc. All rights reserved. + * + * Author: + * Felipe Franciosi <fel...@nutanix.com> + * + * This work is largely based on the "vhost-scsi" implementation by: + * Stefan Hajnoczi <stefa...@linux.vnet.ibm.com> + * Nicholas Bellinger <n...@risingtidesystems.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + + #include "qemu/osdep.h" + #include "migration/vmstate.h" + #include "qapi/error.h" + #include "qemu/error-report.h" + #include "qemu/typedefs.h" + #include "qom/object.h" + #include "hw/fw-path-provider.h" + #include "hw/qdev-core.h" + #include "hw/virtio/vhost.h" + #include "hw/virtio/vhost-backend.h" + #include "hw/virtio/vhost-user-scsi.h" + #include "hw/virtio/virtio.h" + #include "hw/virtio/virtio-access.h" -#include "sysemu/char.h" ++#include "chardev/char-fe.h" + + /* Features supported by the host application */ + static const int user_feature_bits[] = { + VIRTIO_F_NOTIFY_ON_EMPTY, + VIRTIO_RING_F_INDIRECT_DESC, + VIRTIO_RING_F_EVENT_IDX, + VIRTIO_SCSI_F_HOTPLUG, + VHOST_INVALID_FEATURE_BIT + }; + + static void vhost_user_scsi_set_status(VirtIODevice *vdev, uint8_t status) + { + VHostUserSCSI *s = (VHostUserSCSI *)vdev; + VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s); + bool start = (status & VIRTIO_CONFIG_S_DRIVER_OK) && vdev->vm_running; + + if (vsc->dev.started == start) { + return; + } + + if (start) { + int ret; + + ret = vhost_scsi_common_start(vsc); + if (ret < 0) { + error_report("unable to start vhost-user-scsi: %s", strerror(-ret)); + exit(1); + } + } else { + vhost_scsi_common_stop(vsc); + } + } + + static void vhost_dummy_handle_output(VirtIODevice *vdev, VirtQueue *vq) + { + } + + static void vhost_user_scsi_save(QEMUFile *f, void *opaque) + { + VirtIODevice *vdev = VIRTIO_DEVICE(opaque); + virtio_save(vdev, f); + } + + static int vhost_user_scsi_load(QEMUFile *f, void *opaque, int version_id) + { + VirtIODevice *vdev = VIRTIO_DEVICE(opaque); + return virtio_load(vdev, f, version_id); + } + + static void vhost_user_scsi_realize(DeviceState *dev, Error **errp) + { + VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(dev); + VHostUserSCSI *s = VHOST_USER_SCSI(dev); + VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s); + static int vhost_user_scsi_id; + Error *err = NULL; + int ret; + + if (!vs->conf.chardev.chr) { + error_setg(errp, "vhost-user-scsi: missing chardev"); + return; + } + + virtio_scsi_common_realize(dev, vhost_dummy_handle_output, + vhost_dummy_handle_output, + vhost_dummy_handle_output, &err); + if (err != NULL) { + error_propagate(errp, err); + return; + } + + vsc->dev.nvqs = 2 + vs->conf.num_queues; + vsc->dev.vqs = g_new(struct vhost_virtqueue, vsc->dev.nvqs); + vsc->dev.vq_index = 0; + vsc->dev.backend_features = 0; + + ret = vhost_dev_init(&vsc->dev, (void *)&vs->conf.chardev, + VHOST_BACKEND_TYPE_USER, 0); + if (ret < 0) { + error_setg(errp, "vhost-user-scsi: vhost initialization failed: %s", + strerror(-ret)); + return; + } + + /* Channel and lun both are 0 for bootable vhost-user-scsi disk */ + vsc->channel = 0; + vsc->lun = 0; + vsc->target = vs->conf.boot_tpgt; + + register_savevm(dev, "vhost-user-scsi", vhost_user_scsi_id++, 1, + vhost_user_scsi_save, vhost_user_scsi_load, s); + } + + static void vhost_user_scsi_unrealize(DeviceState *dev, Error **errp) + { + VirtIODevice *vdev = VIRTIO_DEVICE(dev); + VHostUserSCSI *s = VHOST_USER_SCSI(dev); + VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s); + + /* This will stop the vhost backend. */ + vhost_user_scsi_set_status(vdev, 0); + + vhost_dev_cleanup(&vsc->dev); + g_free(vsc->dev.vqs); + + virtio_scsi_common_unrealize(dev, errp); + } + + static uint64_t vhost_user_scsi_get_features(VirtIODevice *vdev, + uint64_t features, Error **errp) + { + VHostUserSCSI *s = VHOST_USER_SCSI(vdev); + + /* Turn on predefined features supported by this device */ + features |= s->host_features; + + return vhost_scsi_common_get_features(vdev, features, errp); + } + + static Property vhost_user_scsi_properties[] = { + DEFINE_PROP_CHR("chardev", VirtIOSCSICommon, conf.chardev), + DEFINE_PROP_UINT32("boot_tpgt", VirtIOSCSICommon, conf.boot_tpgt, 0), + DEFINE_PROP_UINT32("num_queues", VirtIOSCSICommon, conf.num_queues, 1), + DEFINE_PROP_UINT32("max_sectors", VirtIOSCSICommon, conf.max_sectors, + 0xFFFF), + DEFINE_PROP_UINT32("cmd_per_lun", VirtIOSCSICommon, conf.cmd_per_lun, 128), + DEFINE_PROP_BIT64("hotplug", VHostUserSCSI, host_features, + VIRTIO_SCSI_F_HOTPLUG, + true), + DEFINE_PROP_BIT64("param_change", VHostUserSCSI, host_features, + VIRTIO_SCSI_F_CHANGE, + true), + DEFINE_PROP_END_OF_LIST(), + }; + + static void vhost_user_scsi_class_init(ObjectClass *klass, void *data) + { + DeviceClass *dc = DEVICE_CLASS(klass); + VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); + FWPathProviderClass *fwc = FW_PATH_PROVIDER_CLASS(klass); + + dc->props = vhost_user_scsi_properties; + set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); + vdc->realize = vhost_user_scsi_realize; + vdc->unrealize = vhost_user_scsi_unrealize; + vdc->get_features = vhost_user_scsi_get_features; + vdc->set_config = vhost_scsi_common_set_config; + vdc->set_status = vhost_user_scsi_set_status; + fwc->get_dev_path = vhost_scsi_common_get_fw_dev_path; + } + + static void vhost_user_scsi_instance_init(Object *obj) + { + VHostSCSICommon *vsc = VHOST_SCSI_COMMON(obj); + + vsc->feature_bits = user_feature_bits; + + /* Add the bootindex property for this object */ + device_add_bootindex_property(obj, &vsc->bootindex, "bootindex", NULL, + DEVICE(vsc), NULL); + } + + static const TypeInfo vhost_user_scsi_info = { + .name = TYPE_VHOST_USER_SCSI, + .parent = TYPE_VHOST_SCSI_COMMON, + .instance_size = sizeof(VHostUserSCSI), + .class_init = vhost_user_scsi_class_init, + .instance_init = vhost_user_scsi_instance_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_FW_PATH_PROVIDER }, + { } + }, + }; + + static void virtio_register_types(void) + { + type_register_static(&vhost_user_scsi_info); + } + + type_init(virtio_register_types) diff --cc include/hw/virtio/virtio-scsi.h index eac2013ddd,ca77a4263d..de6ae5a9f6 --- a/include/hw/virtio/virtio-scsi.h +++ b/include/hw/virtio/virtio-scsi.h @@@ -21,6 -21,7 +21,7 @@@ #include "hw/virtio/virtio.h" #include "hw/pci/pci.h" #include "hw/scsi/scsi.h" -#include "sysemu/char.h" ++#include "chardev/char-fe.h" #include "sysemu/iothread.h" #define TYPE_VIRTIO_SCSI_COMMON "virtio-scsi-common"