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

Re: [Xen-devel] [PATCH RFC 17/55] x86/mm: drop lXe_to_lYe invocations in map_pages_to_xen



On Thu, 2019-02-07 at 16:44 +0000, Wei Liu wrote:
> Map and unmap page tables where necessary.
> 
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
>  xen/arch/x86/mm.c | 40 +++++++++++++++++++++++++++++-----------
>  1 file changed, 29 insertions(+), 11 deletions(-)
> 
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index c4cb6fbb60..1ea2974c1f 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -5014,8 +5014,10 @@ int map_pages_to_xen(
>                  else
>                  {
>                      l2_pgentry_t *l2t;
> +                    mfn_t l2t_mfn = l3e_get_mfn(ol3e);
> +
> +                    l2t = map_xen_pagetable_new(l2t_mfn);
>  
> -                    l2t = l3e_to_l2e(ol3e);
>                      for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
>                      {
>                          ol2e = l2t[i];
> @@ -5027,10 +5029,12 @@ int map_pages_to_xen(
>                          {
>                              unsigned int j;
>                              l1_pgentry_t *l1t;
> +                            mfn_t l1t_mfn = l2e_get_mfn(ol2e);
>  
> -                            l1t = l2e_to_l1e(ol2e);
> +                            l1t = map_xen_pagetable_new(l1t_mfn);
>                              for ( j = 0; j < L1_PAGETABLE_ENTRIES;
> j++ )
>                                  flush_flags(l1e_get_flags(l1t[j]));
> +                            UNMAP_XEN_PAGETABLE_NEW(l1t);
>                          }
>                      }
>                      flush_area(virt, flush_flags);
> @@ -5039,9 +5043,9 @@ int map_pages_to_xen(
>                          ol2e = l2t[i];
>                          if ( (l2e_get_flags(ol2e) & _PAGE_PRESENT)
> &&
>                               !(l2e_get_flags(ol2e) & _PAGE_PSE) )
> -                            free_xen_pagetable(l2e_to_l1e(ol2e));
> +                            free_xen_pagetable_new(l2e_get_mfn(ol2e)
> );
>                      }
> -                    free_xen_pagetable(l2t);
> +                    free_xen_pagetable_new(l2t_mfn);
>                  }
>              }
>  
> @@ -5146,12 +5150,14 @@ int map_pages_to_xen(
>                  else
>                  {
>                      l1_pgentry_t *l1t;
> +                    mfn_t l1t_mfn = l2e_get_mfn(ol2e);
>  
> -                    l1t = l2e_to_l1e(ol2e);
> +                    l1t = map_xen_pagetable_new(l1t_mfn);
>                      for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
>                          flush_flags(l1e_get_flags(l1t[i]));
>                      flush_area(virt, flush_flags);
> -                    free_xen_pagetable(l1t);
> +                    UNMAP_XEN_PAGETABLE_NEW(l1t);
> +                    free_xen_pagetable_new(l1t_mfn);
>                  }
>              }
>  
> @@ -5165,12 +5171,14 @@ int map_pages_to_xen(
>              /* Normal page mapping. */
>              if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) )
>              {
> +                /* XXX This forces page table to be populated */
>                  pl1e = virt_to_xen_l1e(virt);
>                  if ( pl1e == NULL )
>                  {
>                      ASSERT(rc == -ENOMEM);
>                      goto out;
>                  }
> +                UNMAP_XEN_PAGETABLE_NEW(pl1e);

This should be part of patch 15/55 "x86/mm: rewrite virt_to_xen_l1e"
where you adapt the callers of virt_to_xen_l1e to free the returned
pointer.

- Stefan

>              }
>              else if ( l2e_get_flags(*pl2e) & _PAGE_PSE )
>              {
> @@ -5234,9 +5242,11 @@ int map_pages_to_xen(
>                  }
>              }
>  
> -            pl1e  = l2e_to_l1e(*pl2e) + l1_table_offset(virt);
> +            pl1e  = map_xen_pagetable_new(l2e_get_mfn((*pl2e)));
> +            pl1e += l1_table_offset(virt);
>              ol1e  = *pl1e;
>              l1e_write_atomic(pl1e, l1e_from_mfn(mfn, flags));
> +            UNMAP_XEN_PAGETABLE_NEW(pl1e);
>              if ( (l1e_get_flags(ol1e) & _PAGE_PRESENT) )
>              {
>                  unsigned int flush_flags = FLUSH_TLB |
> FLUSH_ORDER(0);
> @@ -5257,6 +5267,7 @@ int map_pages_to_xen(
>              {
>                  unsigned long base_mfn;
>                  l1_pgentry_t *l1t;
> +                mfn_t l1t_mfn;
>  
>                  if ( locking )
>                      spin_lock(&map_pgdir_lock);
> @@ -5280,12 +5291,15 @@ int map_pages_to_xen(
>                      goto check_l3;
>                  }
>  
> -                l1t = l2e_to_l1e(ol2e);
> +                l1t_mfn = l2e_get_mfn(ol2e);
> +                l1t = map_xen_pagetable_new(l1t_mfn);
> +
>                  base_mfn = l1e_get_pfn(l1t[0]) &
> ~(L1_PAGETABLE_ENTRIES - 1);
>                  for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
>                      if ( (l1e_get_pfn(l1t[i]) != (base_mfn + i)) ||
>                           (l1e_get_flags(l1t[i]) != flags) )
>                          break;
> +                UNMAP_XEN_PAGETABLE_NEW(l1t);
>                  if ( i == L1_PAGETABLE_ENTRIES )
>                  {
>                      l2e_write_atomic(pl2e, l2e_from_pfn(base_mfn,
> @@ -5295,7 +5309,7 @@ int map_pages_to_xen(
>                      flush_area(virt - PAGE_SIZE,
>                                 FLUSH_TLB_GLOBAL |
>                                 FLUSH_ORDER(PAGETABLE_ORDER));
> -                    free_xen_pagetable(l2e_to_l1e(ol2e));
> +                    free_xen_pagetable_new(l1t_mfn);
>                  }
>                  else if ( locking )
>                      spin_unlock(&map_pgdir_lock);
> @@ -5311,6 +5325,7 @@ int map_pages_to_xen(
>          {
>              unsigned long base_mfn;
>              l2_pgentry_t *l2t;
> +            mfn_t l2t_mfn;
>  
>              if ( locking )
>                  spin_lock(&map_pgdir_lock);
> @@ -5328,7 +5343,9 @@ int map_pages_to_xen(
>                  goto end_of_loop;
>              }
>  
> -            l2t = l3e_to_l2e(ol3e);
> +            l2t_mfn = l3e_get_mfn(ol3e);
> +            l2t = map_xen_pagetable_new(l2t_mfn);
> +
>              base_mfn = l2e_get_pfn(l2t[0]) & ~(L2_PAGETABLE_ENTRIES
> *
>                                                L1_PAGETABLE_ENTRIES -
> 1);
>              for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
> @@ -5336,6 +5353,7 @@ int map_pages_to_xen(
>                        (base_mfn + (i << PAGETABLE_ORDER))) ||
>                       (l2e_get_flags(l2t[i]) != l1f_to_lNf(flags)) )
>                      break;
> +            UNMAP_XEN_PAGETABLE_NEW(l2t);
>              if ( i == L2_PAGETABLE_ENTRIES )
>              {
>                  l3e_write_atomic(pl3e, l3e_from_pfn(base_mfn,
> @@ -5345,7 +5363,7 @@ int map_pages_to_xen(
>                  flush_area(virt - PAGE_SIZE,
>                             FLUSH_TLB_GLOBAL |
>                             FLUSH_ORDER(2*PAGETABLE_ORDER));
> -                free_xen_pagetable(l3e_to_l2e(ol3e));
> +                free_xen_pagetable_new(l2t_mfn);
>              }
>              else if ( locking )
>                  spin_unlock(&map_pgdir_lock);



Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrer: Christian Schlaeger, Ralf Herbrich
Ust-ID: DE 289 237 879
Eingetragen am Amtsgericht Charlottenburg HRB 149173 B

_______________________________________________
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®.