git: f4c6843ec2b9 - main - xen: use correct cache attributes for Xen specific memory regions

Roger Pau Monné royger at FreeBSD.org
Thu Aug 12 07:24:19 UTC 2021


The branch main has been updated by royger:

URL: https://cgit.FreeBSD.org/src/commit/?id=f4c6843ec2b9aa5eff475778fb000ed6278c5b77

commit f4c6843ec2b9aa5eff475778fb000ed6278c5b77
Author:     Roger Pau Monné <royger at FreeBSD.org>
AuthorDate: 2021-04-09 09:31:44 +0000
Commit:     Roger Pau Monné <royger at FreeBSD.org>
CommitDate: 2021-08-12 07:18:32 +0000

    xen: use correct cache attributes for Xen specific memory regions
    
    bus_activate_resource maps memory regions as uncacheable on x86, which
    is more strict than required for regions allocated using xenmem_alloc,
    so don't rely on bus_activate_resource and instead map the region
    using pmap_mapdev_attr and VM_MEMATTR_XEN as the cache attribute.
    
    Sponsored by: Citrix Systems R&D
---
 sys/dev/xen/bus/xenpv.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/sys/dev/xen/bus/xenpv.c b/sys/dev/xen/bus/xenpv.c
index 42f2c88a2885..91004039a85e 100644
--- a/sys/dev/xen/bus/xenpv.c
+++ b/sys/dev/xen/bus/xenpv.c
@@ -120,10 +120,11 @@ xenpv_alloc_physmem(device_t dev, device_t child, int *res_id, size_t size)
 {
 	struct resource *res;
 	vm_paddr_t phys_addr;
+	void *virt_addr;
 	int error;
 
 	res = bus_alloc_resource(child, SYS_RES_MEMORY, res_id, LOW_MEM_LIMIT,
-	    ~0, size, RF_ACTIVE);
+	    ~0, size, RF_ACTIVE | RF_UNMAPPED);
 	if (res == NULL)
 		return (NULL);
 
@@ -134,6 +135,9 @@ xenpv_alloc_physmem(device_t dev, device_t child, int *res_id, size_t size)
 		bus_release_resource(child, SYS_RES_MEMORY, *res_id, res);
 		return (NULL);
 	}
+	virt_addr = pmap_mapdev_attr(phys_addr, size, VM_MEMATTR_XEN);
+	KASSERT(virt_addr != NULL, ("Failed to create linear mappings"));
+	rman_set_virtual(res, virt_addr);
 
 	return (res);
 }
@@ -142,11 +146,14 @@ static int
 xenpv_free_physmem(device_t dev, device_t child, int res_id, struct resource *res)
 {
 	vm_paddr_t phys_addr;
+	vm_offset_t virt_addr;
 	size_t size;
 
 	phys_addr = rman_get_start(res);
 	size = rman_get_size(res);
+	virt_addr = (vm_offset_t)rman_get_virtual(res);
 
+	pmap_unmapdev(virt_addr, size);
 	vm_phys_fictitious_unreg_range(phys_addr, phys_addr + size);
 	return (bus_release_resource(child, SYS_RES_MEMORY, res_id, res));
 }


More information about the dev-commits-src-all mailing list