[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] x86/dom0: attempt to fixup p2m page-faults for PVH dom0
On 17.02.2025 11:51, Roger Pau Monné wrote: > On Mon, Feb 17, 2025 at 11:27:52AM +0100, Jan Beulich wrote: >> On 17.02.2025 11:20, Roger Pau Monné wrote: >>> On Mon, Feb 17, 2025 at 09:44:28AM +0100, Jan Beulich wrote: >>>> On 17.02.2025 09:25, Roger Pau Monné wrote: >>>>> On Fri, Feb 14, 2025 at 02:07:05PM +0100, Jan Beulich wrote: >>>>>> On 14.02.2025 13:38, Roger Pau Monné wrote: >>>>>>> On Fri, Feb 14, 2025 at 12:53:01PM +0100, Jan Beulich wrote: >>>>>>>> On 14.02.2025 10:29, Roger Pau Monne wrote: >>>>>>>>> +{ >>>>>>>>> + unsigned long gfn = paddr_to_pfn(addr); >>>>>>>>> + struct domain *currd = current->domain; >>>>>>>>> + p2m_type_t type; >>>>>>>>> + mfn_t mfn; >>>>>>>>> + int rc; >>>>>>>>> + >>>>>>>>> + ASSERT(is_hardware_domain(currd)); >>>>>>>>> + ASSERT(!altp2m_active(currd)); >>>>>>>>> + >>>>>>>>> + /* >>>>>>>>> + * Fixups are only applied for MMIO holes, and rely on the >>>>>>>>> hardware domain >>>>>>>>> + * having identity mappings for non RAM regions (gfn == mfn). >>>>>>>>> + */ >>>>>>>>> + if ( !iomem_access_permitted(currd, gfn, gfn) || >>>>>>>>> + !is_memory_hole(_mfn(gfn), _mfn(gfn)) ) >>>>>>>>> + return -EPERM; >>>>>>>>> + >>>>>>>>> + mfn = get_gfn(currd, gfn, &type); >>>>>>>>> + if ( !mfn_eq(mfn, INVALID_MFN) || !p2m_is_hole(type) ) >>>>>>>>> + rc = mfn_eq(mfn, _mfn(gfn)) ? 0 : -EEXIST; >>>>>>>> >>>>>>>> I understand this is to cover the case where two vCPU-s access the >>>>>>>> same GFN >>>>>>>> at about the same time. However, the "success" log message at the call >>>>>>>> site >>>>>>>> being debug-only means we may be silently hiding bugs in release >>>>>>>> builds, if >>>>>>>> e.g. we get here despite the GFN having had an identity mapping >>>>>>>> already for >>>>>>>> ages. >>>>>>> >>>>>>> Possibly, but what would be your suggestion to fix this? I will think >>>>>>> about it, but I can't immediately see a solution that's not simply to >>>>>>> make the message printed by the caller to be gprintk() instead of >>>>>>> gdprintk() so catch such bugs. Would you agree to that? >>>>>> >>>>>> My thinking was that it might be best to propagate a distinguishable >>>>>> error >>>>>> code (perhaps -EEXIST, with its present use then replaced) out of the >>>>>> function, >>>>>> and make the choice of gprintk() vs gdprintk() depend on that. >>>>>> Accompanied by a >>>>>> comment explaining things a little. >>>>> >>>>> I think it would be easier if I just made those gprintk() instead of >>>>> gdprintk(), all with severity XENLOG_DEBUG except for the one that >>>>> reports the failure of the fixup function that is XENLOG_WARNING. >>>>> Would you be OK with that? >>>> >>>> Hmm. Okay-ish at best. Even if debug+guest-level messages are suppressed by >>>> default, I think it wouldn't be nice if many of them might appear in >>>> release >>>> builds with guest_loglevel=all. What I find difficult is to predict how >>>> high >>>> the chances are to see any of them (and then possibly multiple times). >>> >>> I think getting those messages even in non-debug builds might be >>> helpful for debugging purposes. Sometimes it's difficult for users to >>> switch to a debug build of Xen if not provided by their upstream. >>> >>> FWIW, on my Intel NUC I see three of those: >>> >>> (XEN) [ 5.418855] arch/x86/hvm/emulate.c:391:d0v0 fixup p2m mapping for >>> page fedc7 added >>> (XEN) [ 5.474574] arch/x86/hvm/emulate.c:391:d0v0 fixup p2m mapping for >>> page fd6a0 added >>> (XEN) [ 8.712784] arch/x86/hvm/emulate.c:391:d0v2 fixup p2m mapping for >>> page fe410 added >> >> For my understanding: Did Xen with a PVH Dom0 not work on the NUC before? Or >> else how come it survived without this fixing up of mappings? > > I've got no idea what's in those addresses. It did survive and seems > to work fine without those identity mappings in the p2m. I assume > that returning ~0 for reads and ignoring writes what good enough. On one hand I find this concerning. Otoh this way we'll maybe learn what issues were so far papered over by said read/write behavior. (Of course there's also a small chance of this opening up new problem areas.) >>> Would you be fine with this approach: >>> >>> bool __ro_after_init opt_dom0_pf_fixup; >>> static int hwdom_fixup_p2m(paddr_t addr) >>> { >>> unsigned long gfn = paddr_to_pfn(addr); >>> struct domain *currd = current->domain; >>> p2m_type_t type; >>> mfn_t mfn; >>> int rc; >>> >>> ASSERT(is_hardware_domain(currd)); >>> ASSERT(!altp2m_active(currd)); >>> >>> /* >>> * Fixups are only applied for MMIO holes, and rely on the hardware >>> domain >>> * having identity mappings for non RAM regions (gfn == mfn). >>> */ >>> if ( !iomem_access_permitted(currd, gfn, gfn) || >>> !is_memory_hole(_mfn(gfn), _mfn(gfn)) ) >>> return -EPERM; >>> >>> mfn = get_gfn(currd, gfn, &type); >>> if ( !mfn_eq(mfn, INVALID_MFN) || !p2m_is_hole(type) ) >>> rc = mfn_eq(mfn, _mfn(gfn)) ? -EEXIST : -ENOTEMPTY; >>> else >>> rc = set_mmio_p2m_entry(currd, _gfn(gfn), _mfn(gfn), 0); >>> put_gfn(currd, gfn); >>> >>> return rc; >>> } >>> [...] >>> int inner_rc = hwdom_fixup_p2m(addr); >>> >>> if ( !inner_rc || inner_rc == -EEXIST ) >>> { >>> gdprintk(XENLOG_DEBUG, >>> "fixup p2m mapping for page %lx %s\n", >>> paddr_to_pfn(addr), >>> !inner_rc ? "added" : "already present"); >> >> As before, I think the "already present" message wants to be present also in >> release build logs. As opposed to the "added" one. Yet at the same time, if >> e.g. you and Andrew agree on the shape above, I won't stand in the way. > > I didn't want to add yet another level of indentation, as it then > becomes: > > int inner_rc = hwdom_fixup_p2m(addr); > > if ( !inner_rc || inner_rc == -EEXIST ) > { > if ( !inner_rc ) > gdprintk(XENLOG_DEBUG, > "fixup p2m mapping for page %lx added\n", > paddr_to_pfn(addr)); > else > gprintk(XENLOG_INFO, > "fixup p2m mapping for page %lx already > present\n", > paddr_to_pfn(addr)); > > Would you be OK with the above proposal then? Yes (with off-by-1 indentation corrected). It's unfortunate that this can't be written in a more compact form. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |