[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH RFC 3/3] x86/mm: Simplify/correct l1_disallow_mask()
l1_disallow_mask() yields L1_DISALLOW_MASK with PAGE_CACHE_ATTRS conditionally permitted. First, rewrite it as a plain function. Next, correct some dubious behaviours. The use of is_pv_domain() is tautological; l1_disallow_mask() is only used in the PV pagetable code, and it return true for system domains as well. The use of has_arch_pdevs() is wonky; by making the use of cache attributes dependent on the instantanious property of whether any devices is assigned, means that a guest could have created a legal PTE which will fail validation at a later point when the device has been removed. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> RFC. I've not tested this, and I doubt it will work to start with owing to the removal of the dom_io special case which IIRC dom0 uses to map arbitrary MMIO. Furthermore, the rangeset_is_empty() calls have the same problem that has_arch_pdevs() has; they're not invariants on the domain. Also, VMs wanting/needing encrypted memory need fully working cacheability irrespective of device assignment. I expect the way we actually want to fix this is to have a CDF flag for allowing reduced cahcebility, and for this expression to simplify to just: if ( d->options & XEN_DOMCTL_CDF_any_cacheability ) disallow &= ~PAGE_CACHE_ATTRS; which is simpler still. For the current form, bloat-o-meter reports: add/remove: 1/0 grow/shrink: 1/2 up/down: 75/-280 (-205) Function old new delta l1_disallow_mask - 74 +74 mod_l1_entry.cold 55 56 +1 get_page_from_l1e 1271 1167 -104 mod_l1_entry 1860 1684 -176 which is an even bigger improvement than simply not duplicating the logic. --- xen/arch/x86/mm.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 95795567f2a5..31937319c057 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -162,13 +162,17 @@ static uint32_t __ro_after_init base_disallow_mask; #define L4_DISALLOW_MASK (base_disallow_mask) -#define l1_disallow_mask(d) \ - (((d) != dom_io) && \ - (rangeset_is_empty((d)->iomem_caps) && \ - rangeset_is_empty((d)->arch.ioport_caps) && \ - !has_arch_pdevs(d) && \ - is_pv_domain(d)) ? \ - L1_DISALLOW_MASK : (L1_DISALLOW_MASK & ~PAGE_CACHE_ATTRS)) +static uint32_t l1_disallow_mask(const struct domain *d) +{ + uint32_t disallow = L1_DISALLOW_MASK; + + if ( (d->options & XEN_DOMCTL_CDF_iommu) || + !rangeset_is_empty(d->iomem_caps) || + !rangeset_is_empty(d->arch.ioport_caps) ) + disallow &= ~PAGE_CACHE_ATTRS; + + return disallow; +} static s8 __read_mostly opt_mmio_relax; -- 2.39.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |