Blame SOURCES/kvm-vfio-common-remove-spurious-tpm-crb-cmd-misalignment.patch

586cba
From b90a5878355bd549200ed1eff52ea084325bfc8a Mon Sep 17 00:00:00 2001
586cba
From: Eric Auger <eric.auger@redhat.com>
586cba
Date: Fri, 6 May 2022 15:25:10 +0200
586cba
Subject: [PATCH 5/5] vfio/common: remove spurious tpm-crb-cmd misalignment
586cba
 warning
586cba
MIME-Version: 1.0
586cba
Content-Type: text/plain; charset=UTF-8
586cba
Content-Transfer-Encoding: 8bit
586cba
586cba
RH-Author: Eric Auger <eric.auger@redhat.com>
586cba
RH-MergeRequest: 84: vfio/common: Remove spurious tpm-crb-cmd misalignment warning
586cba
RH-Commit: [2/2] 9b73a9aec59cb50d5e3468cc553464bf4a73d0a1 (eauger1/centos-qemu-kvm)
586cba
RH-Bugzilla: 2037612
586cba
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
586cba
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
586cba
RH-Acked-by: Andrew Jones <drjones@redhat.com>
586cba
586cba
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2037612
586cba
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45166961
586cba
Upstream Status: YES
586cba
Tested: With TPM-CRB and VFIO
586cba
586cba
The CRB command buffer currently is a RAM MemoryRegion and given
586cba
its base address alignment, it causes an error report on
586cba
vfio_listener_region_add(). This region could have been a RAM device
586cba
region, easing the detection of such safe situation but this option
586cba
was not well received. So let's add a helper function that uses the
586cba
memory region owner type to detect the situation is safe wrt
586cba
the assignment. Other device types can be checked here if such kind
586cba
of problem occurs again.
586cba
586cba
Conflicts in hw/vfio/common.c
586cba
We don't have 8e3b0cbb721 ("Replace qemu_real_host_page variables with inlined functions")
586cba
586cba
Signed-off-by: Eric Auger <eric.auger@redhat.com>
586cba
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
586cba
Acked-by: Stefan Berger <stefanb@linux.ibm.com>
586cba
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
586cba
Link: https://lore.kernel.org/r/20220506132510.1847942-3-eric.auger@redhat.com
586cba
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
586cba
(cherry picked from commit 851d6d1a0ff29a87ec588205842edf6b86d99b5c)
586cba
Signed-off-by: Eric Auger <eric.auger@redhat.com>
586cba
---
586cba
 hw/vfio/common.c     | 27 ++++++++++++++++++++++++++-
586cba
 hw/vfio/trace-events |  1 +
586cba
 2 files changed, 27 insertions(+), 1 deletion(-)
586cba
586cba
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
586cba
index 080046e3f5..0fbe0d47af 100644
586cba
--- a/hw/vfio/common.c
586cba
+++ b/hw/vfio/common.c
586cba
@@ -40,6 +40,7 @@
586cba
 #include "trace.h"
586cba
 #include "qapi/error.h"
586cba
 #include "migration/migration.h"
586cba
+#include "sysemu/tpm.h"
586cba
 
586cba
 VFIOGroupList vfio_group_list =
586cba
     QLIST_HEAD_INITIALIZER(vfio_group_list);
586cba
@@ -861,6 +862,22 @@ static void vfio_unregister_ram_discard_listener(VFIOContainer *container,
586cba
     g_free(vrdl);
586cba
 }
586cba
 
586cba
+static bool vfio_known_safe_misalignment(MemoryRegionSection *section)
586cba
+{
586cba
+    MemoryRegion *mr = section->mr;
586cba
+
586cba
+    if (!TPM_IS_CRB(mr->owner)) {
586cba
+        return false;
586cba
+    }
586cba
+
586cba
+    /* this is a known safe misaligned region, just trace for debug purpose */
586cba
+    trace_vfio_known_safe_misalignment(memory_region_name(mr),
586cba
+                                       section->offset_within_address_space,
586cba
+                                       section->offset_within_region,
586cba
+                                       qemu_real_host_page_size);
586cba
+    return true;
586cba
+}
586cba
+
586cba
 static void vfio_listener_region_add(MemoryListener *listener,
586cba
                                      MemoryRegionSection *section)
586cba
 {
586cba
@@ -884,7 +901,15 @@ static void vfio_listener_region_add(MemoryListener *listener,
586cba
     if (unlikely((section->offset_within_address_space &
586cba
                   ~qemu_real_host_page_mask) !=
586cba
                  (section->offset_within_region & ~qemu_real_host_page_mask))) {
586cba
-        error_report("%s received unaligned region", __func__);
586cba
+        if (!vfio_known_safe_misalignment(section)) {
586cba
+            error_report("%s received unaligned region %s iova=0x%"PRIx64
586cba
+                         " offset_within_region=0x%"PRIx64
586cba
+                         " qemu_real_host_page_size=0x%"PRIxPTR,
586cba
+                         __func__, memory_region_name(section->mr),
586cba
+                         section->offset_within_address_space,
586cba
+                         section->offset_within_region,
586cba
+                         qemu_real_host_page_size);
586cba
+        }
586cba
         return;
586cba
     }
586cba
 
586cba
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
586cba
index 0ef1b5f4a6..582882db91 100644
586cba
--- a/hw/vfio/trace-events
586cba
+++ b/hw/vfio/trace-events
586cba
@@ -100,6 +100,7 @@ vfio_listener_region_add_skip(uint64_t start, uint64_t end) "SKIPPING region_add
586cba
 vfio_spapr_group_attach(int groupfd, int tablefd) "Attached groupfd %d to liobn fd %d"
586cba
 vfio_listener_region_add_iommu(uint64_t start, uint64_t end) "region_add [iommu] 0x%"PRIx64" - 0x%"PRIx64
586cba
 vfio_listener_region_add_ram(uint64_t iova_start, uint64_t iova_end, void *vaddr) "region_add [ram] 0x%"PRIx64" - 0x%"PRIx64" [%p]"
586cba
+vfio_known_safe_misalignment(const char *name, uint64_t iova, uint64_t offset_within_region, uintptr_t page_size) "Region \"%s\" iova=0x%"PRIx64" offset_within_region=0x%"PRIx64" qemu_real_host_page_size=0x%"PRIxPTR ": cannot be mapped for DMA"
586cba
 vfio_listener_region_add_no_dma_map(const char *name, uint64_t iova, uint64_t size, uint64_t page_size) "Region \"%s\" 0x%"PRIx64" size=0x%"PRIx64" is not aligned to 0x%"PRIx64" and cannot be mapped for DMA"
586cba
 vfio_listener_region_del_skip(uint64_t start, uint64_t end) "SKIPPING region_del 0x%"PRIx64" - 0x%"PRIx64
586cba
 vfio_listener_region_del(uint64_t start, uint64_t end) "region_del 0x%"PRIx64" - 0x%"PRIx64
586cba
-- 
586cba
2.31.1
586cba