[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 0/3] x86: modify_ldt improvement, test, and config option
On 07/29/2015 05:26 PM, Andy Lutomirski wrote: On Wed, Jul 29, 2015 at 2:23 PM, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> wrote:On 07/29/2015 03:03 PM, Andrew Cooper wrote:On 29/07/15 15:43, Boris Ostrovsky wrote:FYI, I have got a repro now and am investigating.Good and bad news. This bug has nothing to do with LDTs themselves. I have worked out what is going on, but this: diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 5abeaac..7e1a82e 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -493,6 +493,7 @@ static void set_aliased_prot(void *v, pgprot_t prot) pte = pfn_pte(pfn, prot); + (void)*(volatile int*)v; if (HYPERVISOR_update_va_mapping((unsigned long)v, pte, 0)) { pr_err("set_aliased_prot va update failed w/ lazy mode %u\n", paravirt_get_lazy_mode()); BUG(); Is perhaps not the fix we are looking for, and every use of HYPERVISOR_update_va_mapping() is susceptible to the same problem.I think in most cases we know that page is mapped so hopefully this is the only site that we need to be careful about.Is there any chance we can get some kind of quick-and-dirty fix that can go to x86/urgent in the next few days even if a clean fix isn't available yet? I'll try to have it tomorrow. The update_va_mapping hypercall is designed to emulate writing the pte for v, with auditing applied. As part of this, it does a pagewalk on v to locate and map the l1. During this walk, Xen it finds the l2 not present, and fails the hypercall. i.e. v is not reachable from the current cr3. Reading the virtual address immediately before issuing the hypercall causes Linux's memory faulting logic to fault in the l2. This also explains why vm_unmap_aliases() appears to fix the issue; it is likely to fault in enough of the paging structure for v to be reachable.We've just touched this page (in write_ldt()) in this test so why would it not be mapped?With my patches applied, the LDT is never written via any paravirt hook -- I write it once (possibly implicitly using kzalloc/vzalloc) before paravirt_alloc_ldt(), and write_ldt() is never called. We could even remove it write_ldt() :) I was referring to 'new_ldt->entries[ldt_info.entry_number] = ldt;' which we do write in this test, so it will fault the page in. -boris _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |