[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] EPT: refine epte_present test


  • To: "Tim Deegan" <tim@xxxxxxx>
  • From: "Andres Lagar-Cavilla" <andres@xxxxxxxxxxxxxxxx>
  • Date: Thu, 19 Jan 2012 04:58:08 -0800
  • Cc: andres@xxxxxxxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxx, adin@xxxxxxxxxxxxxx
  • Delivery-date: Thu, 19 Jan 2012 12:58:35 +0000
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id :in-reply-to:references:date:subject:from:to:cc:reply-to :mime-version:content-type:content-transfer-encoding; q=dns; s= lagarcavilla.org; b=W/smABxJKBWaY8aauhrClXAL0WGeoNwtKcwiHGPkw6KF VPaG/Vm39ui8eWhGBKyw8MqGaU5hTiTtmSJsdVac7pLbhMtNsDatI1mhu57N/msW Z1zKXk/F+ifAF9MVIfdYFVWvGsHx5Wb4O9Cn6U0plIjpplOKeFM2WAUjPmWm1vo=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

> Hi,
>
> I agree with the idea of this patch but:
>
>> +static inline bool_t is_epte_valid(ept_entry_t *e)
>> +{
>> +    ept_entry_t rights = { .epte = 0 };
>> +
>> +    /* Not valid if empty */
>> +    if (e->epte == 0) return 0;
>> +
>> +    /* Not valid if mfn not valid */
>> +    if ( !mfn_valid(e->mfn) ) return 0;
>> +
>> +    /* Not valid if rights different from those of
>> +     * its p2m type and access combination */
>> +    ept_p2m_type_to_flags(&rights, e->sa_p2mt, e->access);
>> +    if ( epte_permissions(&rights) != epte_permissions(e) )
>> +        return 0;
>
> This is a rather odd set of tests.  Since we construct EPT pagetables
> ourselves, I think that we only need to test for uninitialised entries
> and explicitly invalid entries.
>
> Does this patch work for you?

It will achieve the stated goal. I am curious as to whether we should
check for p2m_broken. In any case:
Acked-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>

>
> diff -r f5b366c6c4c6 xen/arch/x86/mm/p2m-ept.c
> --- a/xen/arch/x86/mm/p2m-ept.c       Thu Jan 19 10:42:42 2012 +0000
> +++ b/xen/arch/x86/mm/p2m-ept.c       Thu Jan 19 11:01:34 2012 +0000
> @@ -41,6 +41,10 @@
>
>  #define is_epte_present(ept_entry)      ((ept_entry)->epte & 0x7)
>  #define is_epte_superpage(ept_entry)    ((ept_entry)->sp)
> +static inline bool_t is_epte_valid(ept_entry_t *e)
> +{
> +    return (e->epte != 0 && e->sa_p2mt != p2m_invalid);
> +}
>
>  /* Non-ept "lock-and-check" wrapper */
>  static int ept_pod_check_and_populate(struct p2m_domain *p2m, unsigned
> long gfn,
> @@ -777,7 +781,7 @@ static void ept_change_entry_type_page(m
>
>      for ( int i = 0; i < EPT_PAGETABLE_ENTRIES; i++ )
>      {
> -        if ( !is_epte_present(epte + i) )
> +        if ( !is_epte_valid(epte + i) )
>              continue;
>
>          if ( (ept_page_level > 0) && !is_epte_superpage(epte + i) )
>



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.