|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/3] x86/P2M: synchronize fast and slow paths of p2m_get_page_from_gfn()
On Wed, Feb 26, 2025 at 12:52:27PM +0100, Jan Beulich wrote:
> Handling of both grants and foreign pages was different between the two
> paths.
>
> While permitting access to grants would be desirable, doing so would
> require more involved handling; undo that for the time being. In
> particular the page reference obtained would prevent the owning domain
> from changing e.g. the page's type (after the grantee has released the
> last reference of the grant). Instead perhaps another reference on the
> grant would need obtaining. Which in turn would require determining
> which grant that was.
>
> Foreign pages in any event need permitting on both paths.
>
> Introduce a helper function to be used on both paths, such that
> respective checking differs in just the extra "to be unshared" condition
> on the fast path.
>
> While there adjust the sanity check for foreign pages: Don't leak the
> reference on release builds when on a debug build the assertion would
> have triggered. (Thanks to Roger for the suggestion.)
>
> Fixes: 80ea7af17269 ("x86/mm: Introduce get_page_from_gfn()")
> Fixes: 50fe6e737059 ("pvh dom0: add and remove foreign pages")
> Fixes: cbbca7be4aaa ("x86/p2m: make p2m_get_page_from_gfn() handle grant case
> correctly")
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Just a couple of nits below (with a reply to your RFC).
> ---
> RFC: While the helper could take const struct domain * as first
> parameter, for a P2M function it seemed more natural to have it
> take const struct p2m_domain *.
>
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -328,12 +328,45 @@ void p2m_put_gfn(struct p2m_domain *p2m,
> gfn_unlock(p2m, gfn_x(gfn), 0);
> }
>
> +static struct page_info *get_page_from_mfn_and_type(
> + const struct p2m_domain *p2m, mfn_t mfn, p2m_type_t t)
Re your RFC: since it's a static function, just used for
p2m_get_page_from_gfn(), I would consider passing a domain instead of
a p2m_domain, as the solely usage of p2m is to obtain the domain.
> +{
> + struct page_info *page;
> +
> + if ( !mfn_valid(mfn) )
> + return NULL;
> +
> + page = mfn_to_page(mfn);
> +
> + if ( p2m_is_ram(t) )
Should this be a likely() to speed up the common successful path?
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |