From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: qemu-stable@nongnu.org, Peter Xu <peterx@redhat.com>,
"Michael S . Tsirkin" <mst@redhat.com>
Subject: [Qemu-devel] [PATCH 33/99] intel-iommu: rework the page walk logic
Date: Mon, 23 Jul 2018 15:16:42 -0500 [thread overview]
Message-ID: <20180723201748.25573-34-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180723201748.25573-1-mdroth@linux.vnet.ibm.com>
From: Peter Xu <peterx@redhat.com>
This patch fixes a potential small window that the DMA page table might
be incomplete or invalid when the guest sends domain/context
invalidations to a device. This can cause random DMA errors for
assigned devices.
This is a major change to the VT-d shadow page walking logic. It
includes but is not limited to:
- For each VTDAddressSpace, now we maintain what IOVA ranges we have
mapped and what we have not. With that information, now we only send
MAP or UNMAP when necessary. Say, we don't send MAP notifies if we
know we have already mapped the range, meanwhile we don't send UNMAP
notifies if we know we never mapped the range at all.
- Introduce vtd_sync_shadow_page_table[_range] APIs so that we can call
in any places to resync the shadow page table for a device.
- When we receive domain/context invalidation, we should not really run
the replay logic, instead we use the new sync shadow page table API to
resync the whole shadow page table without unmapping the whole
region. After this change, we'll only do the page walk once for each
domain invalidations (before this, it can be multiple, depending on
number of notifiers per address space).
While at it, the page walking logic is also refactored to be simpler.
CC: QEMU Stable <qemu-stable@nongnu.org>
Reported-by: Jintack Lim <jintack@cs.columbia.edu>
Tested-by: Jintack Lim <jintack@cs.columbia.edu>
Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
(cherry picked from commit 63b88968f139b6a77f2f81e6f1eedf70c0170a85)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
hw/i386/intel_iommu.c | 213 +++++++++++++++++++++++++---------
hw/i386/trace-events | 3 +-
include/hw/i386/intel_iommu.h | 2 +
3 files changed, 159 insertions(+), 59 deletions(-)
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index 61bb3d31e7..b5a09b7908 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -769,10 +769,77 @@ typedef struct {
static int vtd_page_walk_one(IOMMUTLBEntry *entry, vtd_page_walk_info *info)
{
+ VTDAddressSpace *as = info->as;
vtd_page_walk_hook hook_fn = info->hook_fn;
void *private = info->private;
+ DMAMap target = {
+ .iova = entry->iova,
+ .size = entry->addr_mask,
+ .translated_addr = entry->translated_addr,
+ .perm = entry->perm,
+ };
+ DMAMap *mapped = iova_tree_find(as->iova_tree, &target);
+
+ if (entry->perm == IOMMU_NONE && !info->notify_unmap) {
+ trace_vtd_page_walk_one_skip_unmap(entry->iova, entry->addr_mask);
+ return 0;
+ }
assert(hook_fn);
+
+ /* Update local IOVA mapped ranges */
+ if (entry->perm) {
+ if (mapped) {
+ /* If it's exactly the same translation, skip */
+ if (!memcmp(mapped, &target, sizeof(target))) {
+ trace_vtd_page_walk_one_skip_map(entry->iova, entry->addr_mask,
+ entry->translated_addr);
+ return 0;
+ } else {
+ /*
+ * Translation changed. Normally this should not
+ * happen, but it can happen when with buggy guest
+ * OSes. Note that there will be a small window that
+ * we don't have map at all. But that's the best
+ * effort we can do. The ideal way to emulate this is
+ * atomically modify the PTE to follow what has
+ * changed, but we can't. One example is that vfio
+ * driver only has VFIO_IOMMU_[UN]MAP_DMA but no
+ * interface to modify a mapping (meanwhile it seems
+ * meaningless to even provide one). Anyway, let's
+ * mark this as a TODO in case one day we'll have
+ * a better solution.
+ */
+ IOMMUAccessFlags cache_perm = entry->perm;
+ int ret;
+
+ /* Emulate an UNMAP */
+ entry->perm = IOMMU_NONE;
+ trace_vtd_page_walk_one(info->domain_id,
+ entry->iova,
+ entry->translated_addr,
+ entry->addr_mask,
+ entry->perm);
+ ret = hook_fn(entry, private);
+ if (ret) {
+ return ret;
+ }
+ /* Drop any existing mapping */
+ iova_tree_remove(as->iova_tree, &target);
+ /* Recover the correct permission */
+ entry->perm = cache_perm;
+ }
+ }
+ iova_tree_insert(as->iova_tree, &target);
+ } else {
+ if (!mapped) {
+ /* Skip since we didn't map this range at all */
+ trace_vtd_page_walk_one_skip_unmap(entry->iova, entry->addr_mask);
+ return 0;
+ }
+ iova_tree_remove(as->iova_tree, &target);
+ }
+
trace_vtd_page_walk_one(info->domain_id, entry->iova,
entry->translated_addr, entry->addr_mask,
entry->perm);
@@ -834,45 +901,34 @@ static int vtd_page_walk_level(dma_addr_t addr, uint64_t start,
*/
entry_valid = read_cur | write_cur;
- entry.target_as = &address_space_memory;
- entry.iova = iova & subpage_mask;
- entry.perm = IOMMU_ACCESS_FLAG(read_cur, write_cur);
- entry.addr_mask = ~subpage_mask;
-
- if (vtd_is_last_slpte(slpte, level)) {
- /* NOTE: this is only meaningful if entry_valid == true */
- entry.translated_addr = vtd_get_slpte_addr(slpte, info->aw);
- if (!entry_valid && !info->notify_unmap) {
- trace_vtd_page_walk_skip_perm(iova, iova_next);
- goto next;
- }
- ret = vtd_page_walk_one(&entry, info);
- if (ret < 0) {
- return ret;
- }
- } else {
- if (!entry_valid) {
- if (info->notify_unmap) {
- /*
- * The whole entry is invalid; unmap it all.
- * Translated address is meaningless, zero it.
- */
- entry.translated_addr = 0x0;
- ret = vtd_page_walk_one(&entry, info);
- if (ret < 0) {
- return ret;
- }
- } else {
- trace_vtd_page_walk_skip_perm(iova, iova_next);
- }
- goto next;
- }
+ if (!vtd_is_last_slpte(slpte, level) && entry_valid) {
+ /*
+ * This is a valid PDE (or even bigger than PDE). We need
+ * to walk one further level.
+ */
ret = vtd_page_walk_level(vtd_get_slpte_addr(slpte, info->aw),
iova, MIN(iova_next, end), level - 1,
read_cur, write_cur, info);
- if (ret < 0) {
- return ret;
- }
+ } else {
+ /*
+ * This means we are either:
+ *
+ * (1) the real page entry (either 4K page, or huge page)
+ * (2) the whole range is invalid
+ *
+ * In either case, we send an IOTLB notification down.
+ */
+ entry.target_as = &address_space_memory;
+ entry.iova = iova & subpage_mask;
+ entry.perm = IOMMU_ACCESS_FLAG(read_cur, write_cur);
+ entry.addr_mask = ~subpage_mask;
+ /* NOTE: this is only meaningful if entry_valid == true */
+ entry.translated_addr = vtd_get_slpte_addr(slpte, info->aw);
+ ret = vtd_page_walk_one(&entry, info);
+ }
+
+ if (ret < 0) {
+ return ret;
}
next:
@@ -964,6 +1020,58 @@ static int vtd_dev_to_context_entry(IntelIOMMUState *s, uint8_t bus_num,
return 0;
}
+static int vtd_sync_shadow_page_hook(IOMMUTLBEntry *entry,
+ void *private)
+{
+ memory_region_notify_iommu((IOMMUMemoryRegion *)private, *entry);
+ return 0;
+}
+
+/* If context entry is NULL, we'll try to fetch it on our own. */
+static int vtd_sync_shadow_page_table_range(VTDAddressSpace *vtd_as,
+ VTDContextEntry *ce,
+ hwaddr addr, hwaddr size)
+{
+ IntelIOMMUState *s = vtd_as->iommu_state;
+ vtd_page_walk_info info = {
+ .hook_fn = vtd_sync_shadow_page_hook,
+ .private = (void *)&vtd_as->iommu,
+ .notify_unmap = true,
+ .aw = s->aw_bits,
+ .as = vtd_as,
+ };
+ VTDContextEntry ce_cache;
+ int ret;
+
+ if (ce) {
+ /* If the caller provided context entry, use it */
+ ce_cache = *ce;
+ } else {
+ /* If the caller didn't provide ce, try to fetch */
+ ret = vtd_dev_to_context_entry(s, pci_bus_num(vtd_as->bus),
+ vtd_as->devfn, &ce_cache);
+ if (ret) {
+ /*
+ * This should not really happen, but in case it happens,
+ * we just skip the sync for this time. After all we even
+ * don't have the root table pointer!
+ */
+ trace_vtd_err("Detected invalid context entry when "
+ "trying to sync shadow page table");
+ return 0;
+ }
+ }
+
+ info.domain_id = VTD_CONTEXT_ENTRY_DID(ce_cache.hi);
+
+ return vtd_page_walk(&ce_cache, addr, addr + size, &info);
+}
+
+static int vtd_sync_shadow_page_table(VTDAddressSpace *vtd_as)
+{
+ return vtd_sync_shadow_page_table_range(vtd_as, NULL, 0, UINT64_MAX);
+}
+
/*
* Fetch translation type for specific device. Returns <0 if error
* happens, otherwise return the shifted type to check against
@@ -1296,7 +1404,7 @@ static void vtd_iommu_replay_all(IntelIOMMUState *s)
VTDAddressSpace *vtd_as;
QLIST_FOREACH(vtd_as, &s->vtd_as_with_notifiers, next) {
- memory_region_iommu_replay_all(&vtd_as->iommu);
+ vtd_sync_shadow_page_table(vtd_as);
}
}
@@ -1371,14 +1479,13 @@ static void vtd_context_device_invalidate(IntelIOMMUState *s,
vtd_switch_address_space(vtd_as);
/*
* So a device is moving out of (or moving into) a
- * domain, a replay() suites here to notify all the
- * IOMMU_NOTIFIER_MAP registers about this change.
+ * domain, resync the shadow page table.
* This won't bring bad even if we have no such
* notifier registered - the IOMMU notification
* framework will skip MAP notifications if that
* happened.
*/
- memory_region_iommu_replay_all(&vtd_as->iommu);
+ vtd_sync_shadow_page_table(vtd_as);
}
}
}
@@ -1436,18 +1543,11 @@ static void vtd_iotlb_domain_invalidate(IntelIOMMUState *s, uint16_t domain_id)
if (!vtd_dev_to_context_entry(s, pci_bus_num(vtd_as->bus),
vtd_as->devfn, &ce) &&
domain_id == VTD_CONTEXT_ENTRY_DID(ce.hi)) {
- memory_region_iommu_replay_all(&vtd_as->iommu);
+ vtd_sync_shadow_page_table(vtd_as);
}
}
}
-static int vtd_page_invalidate_notify_hook(IOMMUTLBEntry *entry,
- void *private)
-{
- memory_region_notify_iommu((IOMMUMemoryRegion *)private, *entry);
- return 0;
-}
-
static void vtd_iotlb_page_invalidate_notify(IntelIOMMUState *s,
uint16_t domain_id, hwaddr addr,
uint8_t am)
@@ -1462,21 +1562,12 @@ static void vtd_iotlb_page_invalidate_notify(IntelIOMMUState *s,
vtd_as->devfn, &ce);
if (!ret && domain_id == VTD_CONTEXT_ENTRY_DID(ce.hi)) {
if (vtd_as_has_map_notifier(vtd_as)) {
- vtd_page_walk_info info = {
- .hook_fn = vtd_page_invalidate_notify_hook,
- .private = (void *)&vtd_as->iommu,
- .notify_unmap = true,
- .aw = s->aw_bits,
- .as = vtd_as,
- .domain_id = domain_id,
- };
-
/*
* As long as we have MAP notifications registered in
* any of our IOMMU notifiers, we need to sync the
* shadow page table.
*/
- vtd_page_walk(&ce, addr, addr + size, &info);
+ vtd_sync_shadow_page_table_range(vtd_as, &ce, addr, size);
} else {
/*
* For UNMAP-only notifiers, we don't need to walk the
@@ -2806,6 +2897,7 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus, int devfn)
vtd_dev_as->devfn = (uint8_t)devfn;
vtd_dev_as->iommu_state = s;
vtd_dev_as->context_cache_entry.context_cache_gen = 0;
+ vtd_dev_as->iova_tree = iova_tree_new();
/*
* Memory region relationships looks like (Address range shows
@@ -2858,6 +2950,7 @@ static void vtd_address_space_unmap(VTDAddressSpace *as, IOMMUNotifier *n)
hwaddr start = n->start;
hwaddr end = n->end;
IntelIOMMUState *s = as->iommu_state;
+ DMAMap map;
/*
* Note: all the codes in this function has a assumption that IOVA
@@ -2902,6 +2995,10 @@ static void vtd_address_space_unmap(VTDAddressSpace *as, IOMMUNotifier *n)
VTD_PCI_FUNC(as->devfn),
entry.iova, size);
+ map.iova = entry.iova;
+ map.size = entry.addr_mask;
+ iova_tree_remove(as->iova_tree, &map);
+
memory_region_notify_one(n, &entry);
}
diff --git a/hw/i386/trace-events b/hw/i386/trace-events
index ca23ba9fad..e14d06ec83 100644
--- a/hw/i386/trace-events
+++ b/hw/i386/trace-events
@@ -40,8 +40,9 @@ vtd_replay_ce_valid(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t domain, uint6
vtd_replay_ce_invalid(uint8_t bus, uint8_t dev, uint8_t fn) "replay invalid context device %02"PRIx8":%02"PRIx8".%02"PRIx8
vtd_page_walk_level(uint64_t addr, uint32_t level, uint64_t start, uint64_t end) "walk (base=0x%"PRIx64", level=%"PRIu32") iova range 0x%"PRIx64" - 0x%"PRIx64
vtd_page_walk_one(uint16_t domain, uint64_t iova, uint64_t gpa, uint64_t mask, int perm) "domain 0x%"PRIu16" iova 0x%"PRIx64" -> gpa 0x%"PRIx64" mask 0x%"PRIx64" perm %d"
+vtd_page_walk_one_skip_map(uint64_t iova, uint64_t mask, uint64_t translated) "iova 0x%"PRIx64" mask 0x%"PRIx64" translated 0x%"PRIx64
+vtd_page_walk_one_skip_unmap(uint64_t iova, uint64_t mask) "iova 0x%"PRIx64" mask 0x%"PRIx64
vtd_page_walk_skip_read(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to unable to read"
-vtd_page_walk_skip_perm(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to perm empty"
vtd_page_walk_skip_reserve(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to rsrv set"
vtd_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
vtd_as_unmap_whole(uint8_t bus, uint8_t slot, uint8_t fn, uint64_t iova, uint64_t size) "Device %02x:%02x.%x start 0x%"PRIx64" size 0x%"PRIx64
diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h
index 156f35e919..fbfedcb1c0 100644
--- a/include/hw/i386/intel_iommu.h
+++ b/include/hw/i386/intel_iommu.h
@@ -27,6 +27,7 @@
#include "hw/i386/ioapic.h"
#include "hw/pci/msi.h"
#include "hw/sysbus.h"
+#include "qemu/iova-tree.h"
#define TYPE_INTEL_IOMMU_DEVICE "intel-iommu"
#define INTEL_IOMMU_DEVICE(obj) \
@@ -95,6 +96,7 @@ struct VTDAddressSpace {
QLIST_ENTRY(VTDAddressSpace) next;
/* Superset of notifier flags that this address space has */
IOMMUNotifierFlag notifier_flags;
+ IOVATree *iova_tree; /* Traces mapped IOVA ranges */
};
struct VTDBus {
--
2.17.1
next prev parent reply other threads:[~2018-07-23 20:19 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-23 20:16 [Qemu-devel] [PATCH 00/99] Patch Round-up for stable 2.12.1, freeze on 2018-07-30 Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 01/99] tests: fix tpm-crb tpm-tis tests race Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 02/99] device_tree: Increase FDT_MAX_SIZE to 1 MiB Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 03/99] ccid: Fix dwProtocols advertisement of T=0 Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 04/99] nbd/client: Fix error messages during NBD_INFO_BLOCK_SIZE Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 05/99] s390-ccw: force diag 308 subcode to unsigned long Michael Roth
2018-07-23 22:14 ` Michael Roth
2018-07-24 9:40 ` Cornelia Huck
2018-07-24 11:07 ` Cornelia Huck
2018-07-24 19:16 ` Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 06/99] tcg/arm: Fix memory barrier encoding Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 07/99] target/arm: Implement v8M VLLDM and VLSTM Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 08/99] target/ppc: always set PPC_MEM_TLBIE in pre 2.8 migration hack Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 09/99] spapr: don't advertise radix GTSE if max-compat-cpu < power9 Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 10/99] qxl: fix local renderer crash Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 11/99] configure: recognize more rpmbuild macros Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 12/99] qemu-img: Resolve relative backing paths in rebase Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 13/99] iotests: Add test for rebasing with relative paths Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 14/99] qemu-io: Use purely string blockdev options Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 15/99] qemu-img: Use only string options in img_open_opts Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 16/99] iotests: Add test for -U/force-share conflicts Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 17/99] lm32: take BQL before writing IP/IM register Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 18/99] raw: Check byte range uniformly Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 19/99] s390x/css: disabled subchannels cannot be status pending Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 20/99] pc-bios/s390-ccw: struct tpi_info must be declared as aligned(4) Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 21/99] virtio-ccw: common reset handler Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 22/99] s390x/ccw: make sure all ccw devices are properly reset Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 23/99] console: Avoid segfault in screendump Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 24/99] hw/intc/arm_gicv3: Fix APxR<n> register dispatching Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 25/99] intel-iommu: send PSI always even if across PDEs Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 26/99] intel-iommu: remove IntelIOMMUNotifierNode Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 27/99] intel-iommu: add iommu lock Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 28/99] intel-iommu: only do page walk for MAP notifiers Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 29/99] intel-iommu: introduce vtd_page_walk_info Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 30/99] intel-iommu: pass in address space when page walk Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 31/99] intel-iommu: trace domain id during " Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 32/99] util: implement simple iova tree Michael Roth
2018-07-23 20:16 ` Michael Roth [this message]
2018-07-23 20:16 ` [Qemu-devel] [PATCH 34/99] arm_gicv3_kvm: increase clroffset accordingly Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 35/99] Fix libusb-1.0.22 deprecated libusb_set_debug with libusb_set_option Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 36/99] ahci: fix PxCI register race Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 37/99] arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 38/99] block: Make bdrv_is_writable() public Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 39/99] qcow2: Do not mark inactive images corrupt Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 40/99] iotests: Add case for a corrupted inactive image Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 41/99] throttle: Fix crash on reopen Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 42/99] i386: define the 'ssbd' CPUID feature bit (CVE-2018-3639) Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 43/99] i386: Define the Virt SSBD MSR and handling of it (CVE-2018-3639) Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 44/99] i386: define the AMD 'virt-ssbd' CPUID feature bit (CVE-2018-3639) Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 45/99] tap: set vhostfd passed from qemu cli to non-blocking Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 46/99] vhost-user: delete net client if necessary Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 47/99] qemu-img: Fix assert when mapping unaligned raw file Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 48/99] iotests: Add test 221 to catch qemu-img map regression Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 49/99] arm_gicv3_kvm: kvm_dist_get/put_priority: skip the registers banked by GICR_IPRIORITYR Michael Roth
2018-07-23 20:16 ` [Qemu-devel] [PATCH 50/99] usb: correctly handle Zero Length Packets Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 51/99] usb/dev-mtp: Fix use of uninitialized values Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 52/99] vnc: fix use-after-free Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 53/99] block/mirror: honor ratelimit again Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 54/99] cpus: tcg: fix never exiting loop on unplug Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 55/99] nbd/client: fix nbd_negotiate_simple_meta_context Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 56/99] migration/block-dirty-bitmap: fix memory leak in dirty_bitmap_load_bits Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 57/99] qapi: fill in CpuInfoFast.arch in query-cpus-fast Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 58/99] block/mirror: Make cancel always cancel pre-READY Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 59/99] iotests: Add test for cancelling a mirror job Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 60/99] riscv: spike: allow base == 0 Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 61/99] riscv: htif: increase the priority of the htif subregion Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 62/99] riscv: requires libfdt Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 63/99] nbd/client: Relax handling of large NBD_CMD_BLOCK_STATUS reply Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 64/99] tcg/i386: Fix dup_vec in non-AVX2 codepath Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 65/99] softfloat: Handle default NaN mode after pickNaNMulAdd, not before Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 66/99] tcg: Limit the number of ops in a TB Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 67/99] RISC-V: Minimal QEMU 2.12 fix for sifive_u machine Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 68/99] blockjob: expose error string via query Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 69/99] target/arm: Fix fp_status_f16 tininess before rounding Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 70/99] fpu/softfloat: Don't set Invalid for float-to-int(MAXINT) Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 71/99] target/arm: Implement vector shifted SCVF/UCVF for fp16 Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 72/99] target/arm: Implement vector shifted FCVT " Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 73/99] target/arm: Fix float16 to/from int16 Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 74/99] target/arm: Clear SVE high bits for FMOV Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 75/99] fpu/softfloat: Fix conversion from uint64 to float128 Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 76/99] target/arm: Implement FMOV (general) for fp16 Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 77/99] target/arm: Implement FCVT (scalar, integer) " Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 78/99] target/arm: Implement FCVT (scalar, fixed-point) " Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 79/99] target/arm: Introduce and use read_fp_hreg Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 80/99] target/arm: Implement FP data-processing (2 source) for fp16 Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 81/99] target/arm: Implement FP data-processing (3 " Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 82/99] target/arm: Implement FCMP " Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 83/99] target/arm: Implement FCSEL " Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 84/99] target/arm: Implement FMOV (immediate) " Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 85/99] target/arm: Fix sqrt_f16 exception raising Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 86/99] hw/isa/superio: Fix inconsistent use of Chardev->be Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 87/99] mux: fix ctrl-a b again Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 88/99] nfs: Remove processed options from QDict Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 89/99] replace functions which are only available in glib-2.24 Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 90/99] vfio/pci: Default display option to "off" Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 91/99] migration/block-dirty-bitmap: fix dirty_bitmap_load Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 92/99] tcg: Reduce max TB opcode count Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 93/99] nbd/server: Reject 0-length block status request Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 94/99] iscsi: Avoid potential for get_status overflow Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 95/99] virtio-rng: process pending requests on DRIVER_OK Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 96/99] target/ppc: set is_jmp on ppc_tr_breakpoint_check Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 97/99] tap: fix memory leak on success to create a tap device Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 98/99] qemu-img: avoid overflow of min_sparse parameter Michael Roth
2018-07-23 20:17 ` [Qemu-devel] [PATCH 99/99] tcg/i386: Mark xmm registers call-clobbered Michael Roth
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=20180723201748.25573-34-mdroth@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=mst@redhat.com \
--cc=peterx@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.