qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: qemu-stable@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>
Subject: [Qemu-devel] [PATCH 030/113] address_space_read: address_space_to_flatview needs RCU lock
Date: Mon, 18 Jun 2018 20:41:56 -0500	[thread overview]
Message-ID: <20180619014319.28272-31-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180619014319.28272-1-mdroth@linux.vnet.ibm.com>

From: Paolo Bonzini <pbonzini@redhat.com>

address_space_read is calling address_space_to_flatview but it can
be called outside the RCU lock.  To fix it, push the rcu_read_lock/unlock
pair up from flatview_read_full to address_space_read's constant size
fast path and address_space_read_full.

Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit b2a44fcad74f1cc7a6786d38eba7db12ab2352ba)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 exec.c                | 38 +++++++++++++++++++++++++-------------
 include/exec/memory.h | 23 +++++++++--------------
 2 files changed, 34 insertions(+), 27 deletions(-)

diff --git a/exec.c b/exec.c
index 884e243a84..7e3c5c67f0 100644
--- a/exec.c
+++ b/exec.c
@@ -2575,6 +2575,8 @@ static const MemoryRegionOps watch_mem_ops = {
     },
 };
 
+static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
+                                      MemTxAttrs attrs, uint8_t *buf, int len);
 static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
                                   const uint8_t *buf, int len);
 static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
@@ -3092,24 +3094,18 @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
     return result;
 }
 
-MemTxResult flatview_read_full(FlatView *fv, hwaddr addr,
-                               MemTxAttrs attrs, uint8_t *buf, int len)
+/* Called from RCU critical section.  */
+static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
+                                 MemTxAttrs attrs, uint8_t *buf, int len)
 {
     hwaddr l;
     hwaddr addr1;
     MemoryRegion *mr;
-    MemTxResult result = MEMTX_OK;
-
-    if (len > 0) {
-        rcu_read_lock();
-        l = len;
-        mr = flatview_translate(fv, addr, &addr1, &l, false);
-        result = flatview_read_continue(fv, addr, attrs, buf, len,
-                                        addr1, l, mr);
-        rcu_read_unlock();
-    }
 
-    return result;
+    l = len;
+    mr = flatview_translate(fv, addr, &addr1, &l, false);
+    return flatview_read_continue(fv, addr, attrs, buf, len,
+                                  addr1, l, mr);
 }
 
 static MemTxResult flatview_rw(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
@@ -3130,6 +3126,22 @@ MemTxResult address_space_rw(AddressSpace *as, hwaddr addr,
                        addr, attrs, buf, len, is_write);
 }
 
+MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,
+                                    MemTxAttrs attrs, uint8_t *buf, int len)
+{
+    MemTxResult result = MEMTX_OK;
+    FlatView *fv;
+
+    if (len > 0) {
+        rcu_read_lock();
+        fv = address_space_to_flatview(as);
+        result = flatview_read(fv, addr, attrs, buf, len);
+        rcu_read_unlock();
+    }
+
+    return result;
+}
+
 MemTxResult address_space_write(AddressSpace *as, hwaddr addr,
                                 MemTxAttrs attrs,
                                 const uint8_t *buf, int len)
diff --git a/include/exec/memory.h b/include/exec/memory.h
index ca544027fb..e7fdb1b79a 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -1907,13 +1907,12 @@ void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len,
 
 
 /* Internal functions, part of the implementation of address_space_read.  */
+MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,
+                                    MemTxAttrs attrs, uint8_t *buf, int len);
 MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
                                    MemTxAttrs attrs, uint8_t *buf,
                                    int len, hwaddr addr1, hwaddr l,
                                    MemoryRegion *mr);
-
-MemTxResult flatview_read_full(FlatView *fv, hwaddr addr,
-                               MemTxAttrs attrs, uint8_t *buf, int len);
 void *qemu_map_ram_ptr(RAMBlock *ram_block, ram_addr_t addr);
 
 static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
@@ -1932,7 +1931,7 @@ static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
  *
  * Return a MemTxResult indicating whether the operation succeeded
  * or failed (eg unassigned memory, device rejected the transaction,
- * IOMMU fault).
+ * IOMMU fault).  Called within RCU critical section.
  *
  * @as: #AddressSpace to be accessed
  * @addr: address within that address space
@@ -1940,17 +1939,20 @@ static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
  * @buf: buffer with the data transferred
  */
 static inline __attribute__((__always_inline__))
-MemTxResult flatview_read(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
-                          uint8_t *buf, int len)
+MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
+                               MemTxAttrs attrs, uint8_t *buf,
+                               int len)
 {
     MemTxResult result = MEMTX_OK;
     hwaddr l, addr1;
     void *ptr;
     MemoryRegion *mr;
+    FlatView *fv;
 
     if (__builtin_constant_p(len)) {
         if (len) {
             rcu_read_lock();
+            fv = address_space_to_flatview(as);
             l = len;
             mr = flatview_translate(fv, addr, &addr1, &l, false);
             if (len == l && memory_access_is_direct(mr, false)) {
@@ -1963,18 +1965,11 @@ MemTxResult flatview_read(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
             rcu_read_unlock();
         }
     } else {
-        result = flatview_read_full(fv, addr, attrs, buf, len);
+        result = address_space_read_full(as, addr, attrs, buf, len);
     }
     return result;
 }
 
-static inline MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
-                                             MemTxAttrs attrs, uint8_t *buf,
-                                             int len)
-{
-    return flatview_read(address_space_to_flatview(as), addr, attrs, buf, len);
-}
-
 /**
  * address_space_read_cached: read from a cached RAM region
  *
-- 
2.11.0

  parent reply	other threads:[~2018-06-19  1:45 UTC|newest]

Thread overview: 125+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-19  1:41 [Qemu-devel] [PATCH 00/113] Patch Round-up for stable 2.11.2, freeze on 2018-06-22 Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 001/113] block/ssh: fix possible segmentation fault when .desc is not null-terminated Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 002/113] pci-bridge/i82801b11: clear bridge registers on platform reset Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 003/113] virtio-balloon: unref the memory region before continuing Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 004/113] memfd: fix configure test Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 005/113] sdl: workaround bug in sdl 2.0.8 headers Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 006/113] spapr: Allow some cases where we can't set VSMT mode in the kernel Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 007/113] spapr: Adjust default VSMT value for better migration compatibility Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 008/113] spapr: set vsmt to MAX(8, smp_threads) Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 009/113] spapr: use spapr->vsmt to compute VCPU ids Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 010/113] spapr: move VCPU calculation to core machine code Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 011/113] target/ppc: Clarify compat mode max_threads value Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 012/113] spapr: rename spapr_vcpu_id() to spapr_get_vcpu_id() Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 013/113] spapr: consolidate the VCPU id numbering logic in a single place Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 014/113] spapr: fix missing CPU core nodes in DT when running with TCG Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 015/113] spapr: register dummy ICPs later Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 016/113] spapr: make pseries-2.11 the default machine type Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 017/113] nbd: Honor server's advertised minimum block size Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 018/113] specs/qcow2: Fix documentation of the compressed cluster descriptor Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 019/113] rbd: Fix use after free in qemu_rbd_set_keypairs() error path Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 020/113] tpm: Set the flags of the CMD_INIT command to 0 Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 021/113] loader: don't perform overlapping address check for memory region ROM images Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 022/113] target/xtensa: dump correct physical registers Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 023/113] linux-user: fix mmap/munmap/mprotect/mremap/shmat Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 024/113] linux-user: fix assertion in shmdt Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 025/113] linux-user: fix target_mprotect/target_munmap error return values Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 026/113] sparc: fix leon3 casa instruction when MMU is disabled Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 027/113] openpic_kvm: drop address_space_to_flatview call Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 028/113] memory: inline some performance-sensitive accessors Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 029/113] address_space_write: address_space_to_flatview needs RCU lock Michael Roth
2018-06-19  1:41 ` Michael Roth [this message]
2018-06-19  1:41 ` [Qemu-devel] [PATCH 031/113] address_space_access_valid: " Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 032/113] address_space_map: " Michael Roth
2018-06-19  1:41 ` [Qemu-devel] [PATCH 033/113] address_space_rw: " Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 034/113] memory: fix flatview_access_valid RCU read lock/unlock imbalance Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 035/113] migration/block: reset dirty bitmap before read in bulk phase Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 036/113] multiboot: bss_end_addr can be zero Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 037/113] multiboot: Remove unused variables from multiboot.c Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 038/113] multiboot: Use header names when displaying fields Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 039/113] multiboot: fprintf(stderr...) -> error_report() Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 040/113] multiboot: Reject kernels exceeding the address space Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 041/113] multiboot: Check validity of mh_header_addr Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 042/113] tests/multiboot: Test exit code for every qemu run Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 043/113] tests/multiboot: Add tests for the a.out kludge Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 044/113] tests/multiboot: Add .gitignore Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 045/113] arm/translate-a64: treat DISAS_UPDATE as variant of DISAS_EXIT Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 046/113] virtio_net: flush uncompleted TX on reset Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 047/113] qemu-pr-helper: Actually allow users to specify pidfile Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 048/113] block/file-posix: Fix fully preallocated truncate Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 049/113] iotests: Test preallocated truncate of 2G image Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 050/113] tcg: Mark muluh_i64 and mulsh_i64 as 64-bit ops Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 051/113] target/i386: Fix andn instruction Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 052/113] exec: fix memory leak in find_max_supported_pagesize() Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 053/113] gluster: Fix blockdev-add with server.N.type=unix Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 054/113] cpus.c: ensure running CPU recalculates icount deadlines on timer expiry Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 055/113] vfio-ccw: fix memory leaks in vfio_ccw_realize() Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 056/113] hw/block/pflash_cfi: fix off-by-one error Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 057/113] tcg: Introduce tcg_set_insn_start_param Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 058/113] hw/char/cmsdk-apb-uart.c: Correctly clear INTSTATUS bits on writes Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 059/113] device_tree: Increase FDT_MAX_SIZE to 1 MiB Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 060/113] ccid: Fix dwProtocols advertisement of T=0 Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 061/113] nbd/client: Fix error messages during NBD_INFO_BLOCK_SIZE Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 062/113] s390: Do not pass inofficial IPL type to the guest Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 063/113] s390-ccw: force diag 308 subcode to unsigned long Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 064/113] tcg/arm: Fix memory barrier encoding Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 065/113] target/arm: Implement v8M VLLDM and VLSTM Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 066/113] target/ppc: always set PPC_MEM_TLBIE in pre 2.8 migration hack Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 067/113] spapr: don't advertise radix GTSE if max-compat-cpu < power9 Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 068/113] qxl: fix local renderer crash Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 069/113] configure: recognize more rpmbuild macros Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 070/113] qemu-img: Resolve relative backing paths in rebase Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 071/113] iotests: Add test for rebasing with relative paths Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 072/113] qemu-io: Use purely string blockdev options Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 073/113] qemu-img: Use only string options in img_open_opts Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 074/113] iotests: Add test for -U/force-share conflicts Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 075/113] lm32: take BQL before writing IP/IM register Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 076/113] raw: Check byte range uniformly Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 077/113] s390x/css: disabled subchannels cannot be status pending Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 078/113] pc-bios/s390-ccw: struct tpi_info must be declared as aligned(4) Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 079/113] qdev: rename typedef qdev_resetfn() -> DeviceReset() Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 080/113] qdev: add helpers to be more explicit when using abstract QOM parent functions Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 081/113] s390x/virtio: Convert virtio-ccw from *_exit to *_unrealize Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 082/113] virtio-ccw: common reset handler Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 083/113] s390x/ccw: make sure all ccw devices are properly reset Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 084/113] console: Avoid segfault in screendump Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 085/113] hw/intc/arm_gicv3: Fix APxR<n> register dispatching Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 086/113] intel-iommu: Redefine macros to enable supporting 48 bit address width Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 087/113] intel-iommu: Extend address width to 48 bits Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 088/113] intel-iommu: send PSI always even if across PDEs Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 089/113] intel-iommu: remove IntelIOMMUNotifierNode Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 090/113] intel-iommu: add iommu lock Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 091/113] intel-iommu: only do page walk for MAP notifiers Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 092/113] intel-iommu: introduce vtd_page_walk_info Michael Roth
2018-06-19  1:42 ` [Qemu-devel] [PATCH 093/113] intel-iommu: pass in address space when page walk Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 094/113] intel-iommu: trace domain id during " Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 095/113] util: implement simple iova tree Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 096/113] intel-iommu: rework the page walk logic Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 097/113] arm_gicv3_kvm: increase clroffset accordingly Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 098/113] Fix libusb-1.0.22 deprecated libusb_set_debug with libusb_set_option Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 099/113] ahci: fix PxCI register race Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 100/113] arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 101/113] block: Make bdrv_is_writable() public Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 102/113] qcow2: Do not mark inactive images corrupt Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 103/113] iotests: Add case for a corrupted inactive image Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 104/113] throttle: Fix crash on reopen Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 105/113] vga: fix region calculation Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 106/113] i386: define the 'ssbd' CPUID feature bit (CVE-2018-3639) Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 107/113] i386: Define the Virt SSBD MSR and handling of it (CVE-2018-3639) Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 108/113] i386: define the AMD 'virt-ssbd' CPUID feature bit (CVE-2018-3639) Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 109/113] tap: set vhostfd passed from qemu cli to non-blocking Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 110/113] vhost-user: delete net client if necessary Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 111/113] qemu-img: Fix assert when mapping unaligned raw file Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 112/113] iotests: Add test 221 to catch qemu-img map regression Michael Roth
2018-06-19  1:43 ` [Qemu-devel] [PATCH 113/113] arm_gicv3_kvm: kvm_dist_get/put_priority: skip the registers banked by GICR_IPRIORITYR Michael Roth
2018-06-19  7:42 ` [Qemu-devel] [PATCH 00/113] Patch Round-up for stable 2.11.2, freeze on 2018-06-22 Cornelia Huck
2018-06-20 20:41   ` Michael Roth
2018-06-20 21:55     ` Michael Roth
2018-06-21  8:34       ` Cornelia Huck
2018-06-19 11:56 ` [Qemu-devel] [Qemu-stable] " Greg Kurz
2018-06-20 20:29   ` Michael Roth
2018-06-21 12:30     ` Greg Kurz
2018-06-19 18:19 ` [Qemu-devel] " Cole Robinson
2018-06-19 21:57 ` Bruce Rogers
2018-06-20 21:48 ` Michael Roth
2018-06-21 12:15   ` Philippe Mathieu-Daudé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180619014319.28272-31-mdroth@linux.vnet.ibm.com \
    --to=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).