Pārlūkot izejas kodu

Merge remote-tracking branch 'remotes/aperard/tags/pull-xen-20220127' into staging

Xen patches

- bug fixes for mapcache and ioreq handling

# gpg: Signature made Thu 27 Jan 2022 15:17:22 GMT
# gpg:                using RSA key F80C006308E22CFD8A92E7980CF5572FD7FB55AF
# gpg: Good signature from "Anthony PERARD <anthony.perard@gmail.com>" [unknown]
# gpg:                 aka "Anthony PERARD <anthony.perard@citrix.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 5379 2F71 024C 600F 778A  7161 D8D5 7199 DF83 42C8
#      Subkey fingerprint: F80C 0063 08E2 2CFD 8A92  E798 0CF5 572F D7FB 55AF

* remotes/aperard/tags/pull-xen-20220127:
  xen-mapcache: Avoid entry->lock overflow
  xen-hvm: Allow disabling buffer_io_timer

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Peter Maydell 3 gadi atpakaļ
vecāks
revīzija
b367db4812
2 mainītis faili ar 11 papildinājumiem un 3 dzēšanām
  1. 4 2
      hw/i386/xen/xen-hvm.c
  2. 7 1
      hw/i386/xen/xen-mapcache.c

+ 4 - 2
hw/i386/xen/xen-hvm.c

@@ -1087,10 +1087,11 @@ static void handle_ioreq(XenIOState *state, ioreq_t *req)
     }
     }
 }
 }
 
 
-static int handle_buffered_iopage(XenIOState *state)
+static bool handle_buffered_iopage(XenIOState *state)
 {
 {
     buffered_iopage_t *buf_page = state->buffered_io_page;
     buffered_iopage_t *buf_page = state->buffered_io_page;
     buf_ioreq_t *buf_req = NULL;
     buf_ioreq_t *buf_req = NULL;
+    bool handled_ioreq = false;
     ioreq_t req;
     ioreq_t req;
     int qw;
     int qw;
 
 
@@ -1144,9 +1145,10 @@ static int handle_buffered_iopage(XenIOState *state)
         assert(!req.data_is_ptr);
         assert(!req.data_is_ptr);
 
 
         qatomic_add(&buf_page->read_pointer, qw + 1);
         qatomic_add(&buf_page->read_pointer, qw + 1);
+        handled_ioreq = true;
     }
     }
 
 
-    return req.count;
+    return handled_ioreq;
 }
 }
 
 
 static void handle_buffered_io(void *opaque)
 static void handle_buffered_io(void *opaque)

+ 7 - 1
hw/i386/xen/xen-mapcache.c

@@ -52,7 +52,7 @@ typedef struct MapCacheEntry {
     hwaddr paddr_index;
     hwaddr paddr_index;
     uint8_t *vaddr_base;
     uint8_t *vaddr_base;
     unsigned long *valid_mapping;
     unsigned long *valid_mapping;
-    uint8_t lock;
+    uint32_t lock;
 #define XEN_MAPCACHE_ENTRY_DUMMY (1 << 0)
 #define XEN_MAPCACHE_ENTRY_DUMMY (1 << 0)
     uint8_t flags;
     uint8_t flags;
     hwaddr size;
     hwaddr size;
@@ -355,6 +355,12 @@ tryagain:
     if (lock) {
     if (lock) {
         MapCacheRev *reventry = g_malloc0(sizeof(MapCacheRev));
         MapCacheRev *reventry = g_malloc0(sizeof(MapCacheRev));
         entry->lock++;
         entry->lock++;
+        if (entry->lock == 0) {
+            fprintf(stderr,
+                    "mapcache entry lock overflow: "TARGET_FMT_plx" -> %p\n",
+                    entry->paddr_index, entry->vaddr_base);
+            abort();
+        }
         reventry->dma = dma;
         reventry->dma = dma;
         reventry->vaddr_req = mapcache->last_entry->vaddr_base + address_offset;
         reventry->vaddr_req = mapcache->last_entry->vaddr_base + address_offset;
         reventry->paddr_index = mapcache->last_entry->paddr_index;
         reventry->paddr_index = mapcache->last_entry->paddr_index;