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 16:38:55 +0200 [thread overview]
Message-ID: <Zmmy_-JqqWRuwvCj@macbook> (raw)
In-Reply-To: <d31f0f8e-4eb7-4617-86f6-81f38b5c61aa@suse.com>
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>
> ---
> 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.
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().
> +
> if ( level == 0 )
> {
> for ( gfn -= i, i = 0; i < EPT_PAGETABLE_ENTRIES; ++i )
> @@ -915,17 +917,6 @@ ept_set_entry(struct p2m_domain *p2m, gf
>
> if ( mfn_valid(mfn) || p2m_allows_invalid_mfn(p2mt) )
> {
> - bool ipat;
> - int emt = epte_get_entry_emt(p2m->domain, _gfn(gfn), mfn,
> - i * EPT_TABLE_ORDER, &ipat,
> - p2mt);
> -
> - 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;
> new_entry.sp = !!i;
> new_entry.sa_p2mt = p2mt;
> new_entry.access = p2ma;
> @@ -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?
Thanks, Roger.
next prev parent reply other threads:[~2024-06-12 14:39 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é [this message]
2024-06-12 14:53 ` Jan Beulich
2024-06-12 15:23 ` Roger Pau Monné
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=Zmmy_-JqqWRuwvCj@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.