xen: mapcache: Unmap first entries in buckets
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>
This commit is contained in:
@@ -491,18 +491,23 @@ static void xen_invalidate_map_cache_entry_unlocked(MapCache *mc,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
entry->lock--;
|
entry->lock--;
|
||||||
if (entry->lock > 0 || pentry == NULL) {
|
if (entry->lock > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pentry->next = entry->next;
|
|
||||||
ram_block_notify_remove(entry->vaddr_base, entry->size, entry->size);
|
ram_block_notify_remove(entry->vaddr_base, entry->size, entry->size);
|
||||||
if (munmap(entry->vaddr_base, entry->size) != 0) {
|
if (munmap(entry->vaddr_base, entry->size) != 0) {
|
||||||
perror("unmap fails");
|
perror("unmap fails");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(entry->valid_mapping);
|
g_free(entry->valid_mapping);
|
||||||
|
if (pentry) {
|
||||||
|
pentry->next = entry->next;
|
||||||
g_free(entry);
|
g_free(entry);
|
||||||
|
} else {
|
||||||
|
memset(entry, 0, sizeof *entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct XenMapCacheData {
|
typedef struct XenMapCacheData {
|
||||||
|
Reference in New Issue
Block a user