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

[Xen-devel] Ping: [PATCH] x86/mm: re-arrange get_page_from_l<N>e() vs pv_l1tf_check_l<N>e



>>> On 17.08.18 at 08:42,  wrote:
> Restore symmetry between get_page_from_l<N>e(): pv_l1tf_check_l<N>e is
> uniformly invoked from outside of them. They're no longer getting called
> for non-present PTEs. This way the slightly odd three-way return value
> meaning of the higher level ones can also be got rid of.
> 
> Introduce local variables holding the page table entries processed, and
> use them throughout the loop bodies instead of re-reading them from the
> page table several times.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> 
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -900,8 +900,11 @@ get_page_from_l1e(
>      struct domain *real_pg_owner;
>      bool write;
>  
> -    if ( !(l1f & _PAGE_PRESENT) )
> +    if ( unlikely(!(l1f & _PAGE_PRESENT)) )
> +    {
> +        ASSERT_UNREACHABLE();
>          return 0;
> +    }
>  
>      if ( unlikely(l1f & l1_disallow_mask(l1e_owner)) )
>      {
> @@ -1099,14 +1102,6 @@ get_page_from_l1e(
>      return -EBUSY;
>  }
>  
> -
> -/* NB. Virtual address 'l2e' maps to a machine address within frame 'pfn'. */
> -/*
> - * get_page_from_l2e returns:
> - *   1 => page not present
> - *   0 => success
> - *  <0 => error code
> - */
>  define_get_linear_pagetable(l2);
>  static int
>  get_page_from_l2e(
> @@ -1115,9 +1110,6 @@ get_page_from_l2e(
>      unsigned long mfn = l2e_get_pfn(l2e);
>      int rc;
>  
> -    if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) )
> -        return pv_l1tf_check_l2e(d, l2e) ? -ERESTART : 1;
> -
>      if ( unlikely((l2e_get_flags(l2e) & L2_DISALLOW_MASK)) )
>      {
>          gdprintk(XENLOG_WARNING, "Bad L2 flags %x\n",
> @@ -1132,13 +1124,6 @@ get_page_from_l2e(
>      return rc;
>  }
>  
> -
> -/*
> - * get_page_from_l3e returns:
> - *   1 => page not present
> - *   0 => success
> - *  <0 => error code
> - */
>  define_get_linear_pagetable(l3);
>  static int
>  get_page_from_l3e(
> @@ -1146,9 +1131,6 @@ get_page_from_l3e(
>  {
>      int rc;
>  
> -    if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
> -        return pv_l1tf_check_l3e(d, l3e) ? -ERESTART : 1;
> -
>      if ( unlikely((l3e_get_flags(l3e) & l3_disallow_mask(d))) )
>      {
>          gdprintk(XENLOG_WARNING, "Bad L3 flags %x\n",
> @@ -1166,12 +1148,6 @@ get_page_from_l3e(
>      return rc;
>  }
>  
> -/*
> - * get_page_from_l4e returns:
> - *   1 => page not present
> - *   0 => success
> - *  <0 => error code
> - */
>  define_get_linear_pagetable(l4);
>  static int
>  get_page_from_l4e(
> @@ -1179,9 +1155,6 @@ get_page_from_l4e(
>  {
>      int rc;
>  
> -    if ( !(l4e_get_flags(l4e) & _PAGE_PRESENT) )
> -        return pv_l1tf_check_l4e(d, l4e) ? -ERESTART : 1;
> -
>      if ( unlikely((l4e_get_flags(l4e) & L4_DISALLOW_MASK)) )
>      {
>          gdprintk(XENLOG_WARNING, "Bad L4 flags %x\n",
> @@ -1396,8 +1369,7 @@ static int alloc_l1_table(struct page_in
>              if ( ret )
>                  goto out;
>          }
> -
> -        switch ( ret = get_page_from_l1e(pl1e[i], d, d) )
> +        else switch ( ret = get_page_from_l1e(pl1e[i], d, d) )
>          {
>          default:
>              goto fail;
> @@ -1477,6 +1449,8 @@ static int alloc_l2_table(struct page_in
>  
>      for ( i = page->nr_validated_ptes; i < L2_PAGETABLE_ENTRIES; i++ )
>      {
> +        l2_pgentry_t l2e;
> +
>          if ( i > page->nr_validated_ptes && hypercall_preempt_check() )
>          {
>              page->nr_validated_ptes = i;
> @@ -1484,10 +1458,20 @@ static int alloc_l2_table(struct page_in
>              break;
>          }
>  
> -        if ( !is_guest_l2_slot(d, type, i) ||
> -             (rc = get_page_from_l2e(pl2e[i], pfn, d)) > 0 )
> +        if ( !is_guest_l2_slot(d, type, i) )
>              continue;
>  
> +        l2e = pl2e[i];
> +
> +        if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) )
> +        {
> +            if ( !pv_l1tf_check_l2e(d, l2e) )
> +                continue;
> +            rc = -ERESTART;
> +        }
> +        else
> +            rc = get_page_from_l2e(l2e, pfn, d);
> +
>          if ( unlikely(rc == -ERESTART) )
>          {
>              page->nr_validated_ptes = i;
> @@ -1503,14 +1487,14 @@ static int alloc_l2_table(struct page_in
>              break;
>          }
>  
> -        pl2e[i] = adjust_guest_l2e(pl2e[i], d);
> +        pl2e[i] = adjust_guest_l2e(l2e, d);
>      }
>  
> -    if ( rc >= 0 && (type & PGT_pae_xen_l2) )
> +    if ( !rc && (type & PGT_pae_xen_l2) )
>          init_xen_pae_l2_slots(pl2e, d);
>  
>      unmap_domain_page(pl2e);
> -    return rc > 0 ? 0 : rc;
> +    return rc;
>  }
>  
>  static int alloc_l3_table(struct page_info *page)
> @@ -1536,18 +1520,26 @@ static int alloc_l3_table(struct page_in
>      for ( i = page->nr_validated_ptes; i < L3_PAGETABLE_ENTRIES;
>            i++, partial = 0 )
>      {
> +        l3_pgentry_t l3e = pl3e[i];
> +
>          if ( is_pv_32bit_domain(d) && (i == 3) )
>          {
> -            if ( !(l3e_get_flags(pl3e[i]) & _PAGE_PRESENT) ||
> -                 (l3e_get_flags(pl3e[i]) & l3_disallow_mask(d)) )
> +            if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) ||
> +                 (l3e_get_flags(l3e) & l3_disallow_mask(d)) )
>                  rc = -EINVAL;
>              else
>                  rc = get_page_and_type_from_mfn(
> -                    l3e_get_mfn(pl3e[i]),
> +                    l3e_get_mfn(l3e),
>                      PGT_l2_page_table | PGT_pae_xen_l2, d, partial, 1);
>          }
> -        else if ( (rc = get_page_from_l3e(pl3e[i], pfn, d, partial)) > 0 )
> -            continue;
> +        else if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
> +        {
> +            if ( !pv_l1tf_check_l3e(d, l3e) )
> +                continue;
> +            rc = -ERESTART;
> +        }
> +        else
> +            rc = get_page_from_l3e(l3e, pfn, d, partial);
>  
>          if ( rc == -ERESTART )
>          {
> @@ -1563,10 +1555,10 @@ static int alloc_l3_table(struct page_in
>          if ( rc < 0 )
>              break;
>  
> -        pl3e[i] = adjust_guest_l3e(pl3e[i], d);
> +        pl3e[i] = adjust_guest_l3e(l3e, d);
>      }
>  
> -    if ( rc >= 0 && !create_pae_xen_mappings(d, pl3e) )
> +    if ( !rc && !create_pae_xen_mappings(d, pl3e) )
>          rc = -EINVAL;
>      if ( rc < 0 && rc != -ERESTART && rc != -EINTR )
>      {
> @@ -1583,7 +1575,7 @@ static int alloc_l3_table(struct page_in
>      }
>  
>      unmap_domain_page(pl3e);
> -    return rc > 0 ? 0 : rc;
> +    return rc;
>  }
>  
>  void init_xen_pae_l2_slots(l2_pgentry_t *l2t, const struct domain *d)
> @@ -1711,10 +1703,22 @@ static int alloc_l4_table(struct page_in
>      for ( i = page->nr_validated_ptes; i < L4_PAGETABLE_ENTRIES;
>            i++, partial = 0 )
>      {
> -        if ( !is_guest_l4_slot(d, i) ||
> -             (rc = get_page_from_l4e(pl4e[i], pfn, d, partial)) > 0 )
> +        l4_pgentry_t l4e;
> +
> +        if ( !is_guest_l4_slot(d, i) )
>              continue;
>  
> +        l4e = pl4e[i];
> +
> +        if ( !(l4e_get_flags(l4e) & _PAGE_PRESENT) )
> +        {
> +            if ( !pv_l1tf_check_l4e(d, l4e) )
> +                continue;
> +            rc = -ERESTART;
> +        }
> +        else
> +            rc = get_page_from_l4e(l4e, pfn, d, partial);
> +
>          if ( rc == -ERESTART )
>          {
>              page->nr_validated_ptes = i;
> @@ -1746,15 +1750,14 @@ static int alloc_l4_table(struct page_in
>              return rc;
>          }
>  
> -        pl4e[i] = adjust_guest_l4e(pl4e[i], d);
> +        pl4e[i] = adjust_guest_l4e(l4e, d);
>      }
>  
> -    if ( rc >= 0 )
> +    if ( !rc )
>      {
>          init_xen_l4_slots(pl4e, _mfn(pfn),
>                            d, INVALID_MFN, VM_ASSIST(d, m2p_strict));
>          atomic_inc(&d->arch.pv_domain.nr_l4_pages);
> -        rc = 0;
>      }
>      unmap_domain_page(pl4e);
>  
> --- a/xen/arch/x86/pv/ro-page-fault.c
> +++ b/xen/arch/x86/pv/ro-page-fault.c
> @@ -131,10 +131,12 @@ static int ptwr_emulated_update(unsigned
>      /* Check the new PTE. */
>      nl1e = l1e_from_intpte(val);
>  
> -    if ( !(l1e_get_flags(nl1e) & _PAGE_PRESENT) && pv_l1tf_check_l1e(d, 
> nl1e) )
> -        return X86EMUL_RETRY;
> -
> -    switch ( ret = get_page_from_l1e(nl1e, d, d) )
> +    if ( !(l1e_get_flags(nl1e) & _PAGE_PRESENT) )
> +    {
> +        if ( pv_l1tf_check_l1e(d, nl1e) )
> +            return X86EMUL_RETRY;
> +    }
> +    else switch ( ret = get_page_from_l1e(nl1e, d, d) )
>      {
>      default:
>          if ( is_pv_32bit_domain(d) && (bytes == 4) && (unaligned_addr & 4) &&
> 
> 
> 
> 




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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