From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Oleksii Kurochko <oleksii.kurochko@gmail.com>
Subject: Re: [PATCH v2 for-4.19 2/3] x86/EPT: avoid marking non-present entries for re-configuring
Date: Wed, 12 Jun 2024 17:23:02 +0200 [thread overview]
Message-ID: <Zmm9VuMjsOMhQCMQ@macbook> (raw)
In-Reply-To: <e944583a-2459-435f-90fb-04bcca18197f@suse.com>
On Wed, Jun 12, 2024 at 04:53:14PM +0200, Jan Beulich wrote:
> On 12.06.2024 16:38, Roger Pau Monné wrote:
> > On Wed, Jun 12, 2024 at 03:16:59PM +0200, Jan Beulich wrote:
> >> For non-present entries EMT, like most other fields, is meaningless to
> >> hardware. Make the logic in ept_set_entry() setting the field (and iPAT)
> >> conditional upon dealing with a present entry, leaving the value at 0
> >> otherwise. This has two effects for epte_get_entry_emt() which we'll
> >> want to leverage subsequently:
> >> 1) The call moved here now won't be issued with INVALID_MFN anymore (a
> >> respective BUG_ON() is being added).
> >> 2) Neither of the other two calls could now be issued with a truncated
> >> form of INVALID_MFN anymore (as long as there's no bug anywhere
> >> marking an entry present when that was populated using INVALID_MFN).
> >>
> >> Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
> >> ---
> >> v2: New.
> >>
> >> --- a/xen/arch/x86/mm/p2m-ept.c
> >> +++ b/xen/arch/x86/mm/p2m-ept.c
> >> @@ -650,6 +650,8 @@ static int cf_check resolve_misconfig(st
> >> if ( e.emt != MTRR_NUM_TYPES )
> >> break;
> >>
> >> + ASSERT(is_epte_present(&e));
> >
> > If this is added here, then there's a condition further below:
> >
> > if ( !is_epte_valid(&e) || !is_epte_present(&e) )
> >
> > That needs adjusting AFAICT.
>
> I don't think so, because e was re-fetched in between.
Oh, I see, we take the opportunity to do the recalculation for all the
EPT entries that share the same page table.
> > However, in ept_set_entry() we seem to unconditionally call
> > resolve_misconfig() against the new entry to be populated, won't this
> > possibly cause resolve_misconfig() to be called against non-present
> > EPT entries? I think this is fine because such non-present entries
> > will have emt == 0, and hence will take the break just ahead of the
> > added ASSERT().
>
> Right, hence how I placed this assertion.
OK, just wanted to double check.
> >> @@ -941,6 +932,22 @@ ept_set_entry(struct p2m_domain *p2m, gf
> >> need_modify_vtd_table = 0;
> >>
> >> ept_p2m_type_to_flags(p2m, &new_entry);
> >> +
> >> + if ( is_epte_present(&new_entry) )
> >> + {
> >> + bool ipat;
> >> + int emt = epte_get_entry_emt(p2m->domain, _gfn(gfn), mfn,
> >> + i * EPT_TABLE_ORDER, &ipat,
> >> + p2mt);
> >> +
> >> + BUG_ON(mfn_eq(mfn, INVALID_MFN));
> >> +
> >> + if ( emt >= 0 )
> >> + new_entry.emt = emt;
> >> + else /* ept_handle_misconfig() will need to take care of this. */
> >> + new_entry.emt = MTRR_NUM_TYPES;
> >> + new_entry.ipat = ipat;
> >> + }
> >
> > Should we assert that if new_entry.emt == MTRR_NUM_TYPES the entry
> > must have the present bit set before the atomic_write_ept_entry()
> > call?
>
> This would feel excessive to me. All writing to new_entry is close together,
> immediately ahead of that atomic_write_ept_entry(). And we're (now) writing
> MTRR_NUM_TYPES only when is_epte_present() is true (note that it's not "the
> present bit").
Fair enough.
Thanks, Roger.
next prev parent reply other threads:[~2024-06-12 15:23 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-12 13:15 [PATCH v2 for-4.19 0/3] x86/EPT: avoid undue forcing of MMIO accesses to UC Jan Beulich
2024-06-12 13:16 ` [PATCH v2 for-4.19 1/3] x86/EPT: correct special page checking in epte_get_entry_emt() Jan Beulich
2024-06-12 14:11 ` Roger Pau Monné
2024-06-12 14:47 ` Jan Beulich
2024-06-12 15:02 ` Roger Pau Monné
2024-06-12 15:06 ` Jan Beulich
2024-06-13 14:38 ` Oleksii K.
2024-06-12 13:16 ` [PATCH v2 for-4.19 2/3] x86/EPT: avoid marking non-present entries for re-configuring Jan Beulich
2024-06-12 14:38 ` Roger Pau Monné
2024-06-12 14:53 ` Jan Beulich
2024-06-12 15:23 ` Roger Pau Monné [this message]
2024-06-13 14:39 ` Oleksii K.
2024-06-12 13:17 ` [PATCH v2 for-4.19 3/3] x86/EPT: drop questionable mfn_valid() from epte_get_entry_emt() Jan Beulich
2024-06-12 15:00 ` Roger Pau Monné
2024-06-12 15:14 ` Jan Beulich
2024-06-12 15:27 ` Roger Pau Monné
2024-06-13 7:32 ` Roger Pau Monné
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zmm9VuMjsOMhQCMQ@macbook \
--to=roger.pau@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=oleksii.kurochko@gmail.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.