xen: mapcache: Unmap first entries in buckets
authorEdgar E. Iglesias <edgar.iglesias@amd.com>
Mon, 29 Apr 2024 17:12:42 +0000 (19:12 +0200)
committerEdgar E. Iglesias <edgar.iglesias@amd.com>
Sun, 9 Jun 2024 18:16:14 +0000 (20:16 +0200)
When invalidating memory ranges, if we happen to hit the first
entry in a bucket we were never unmapping it. This was harmless
for foreign mappings but now that we're looking to reuse the
mapcache for transient grant mappings, we must unmap entries
when invalidated.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
hw/xen/xen-mapcache.c

index bc860f437383400713cca6947769acbc872e24c0..ec954456966fcad9b3d83c4521121c3f75d978bc 100644 (file)
@@ -491,18 +491,23 @@ static void xen_invalidate_map_cache_entry_unlocked(MapCache *mc,
         return;
     }
     entry->lock--;
-    if (entry->lock > 0 || pentry == NULL) {
+    if (entry->lock > 0) {
         return;
     }
 
-    pentry->next = entry->next;
     ram_block_notify_remove(entry->vaddr_base, entry->size, entry->size);
     if (munmap(entry->vaddr_base, entry->size) != 0) {
         perror("unmap fails");
         exit(-1);
     }
+
     g_free(entry->valid_mapping);
-    g_free(entry);
+    if (pentry) {
+        pentry->next = entry->next;
+        g_free(entry);
+    } else {
+        memset(entry, 0, sizeof *entry);
+    }
 }
 
 typedef struct XenMapCacheData {