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

[Xen-devel] Ping: [PATCH] x86/paging: use clear_guest() for zero-filling guest buffers



>>> On 06.02.12 at 17:35, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:
> While static arrays of all zeros may be tolerable (but are simply
> inefficient now that we have the necessary infrastructure), using on-
> stack arrays for this purpose (particularly when their size doesn't
> have an upper limit enforced) is calling for eventual problems (even
> if the code can be reached via administrative interfaces only).
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> 
> --- a/xen/arch/x86/mm/paging.c
> +++ b/xen/arch/x86/mm/paging.c
> @@ -21,11 +21,11 @@
>   */
>  
>  #include <xen/init.h>
> +#include <xen/guest_access.h>
>  #include <asm/paging.h>
>  #include <asm/shadow.h>
>  #include <asm/p2m.h>
>  #include <asm/hap.h>
> -#include <asm/guest_access.h>
>  #include <asm/hvm/nestedhvm.h>
>  #include <xen/numa.h>
>  #include <xsm/xsm.h>
> @@ -383,26 +383,30 @@ int paging_log_dirty_op(struct domain *d
>                    (pages < sc->pages) && (i2 < LOGDIRTY_NODE_ENTRIES);
>                    i2++ )
>              {
> -                static unsigned long zeroes[PAGE_SIZE/BYTES_PER_LONG];
>                  unsigned int bytes = PAGE_SIZE;
>                  l1 = ((l2 && mfn_valid(l2[i2])) ?
> -                      map_domain_page(mfn_x(l2[i2])) : zeroes);
> +                      map_domain_page(mfn_x(l2[i2])) : NULL);
>                  if ( unlikely(((sc->pages - pages + 7) >> 3) < bytes) )
>                      bytes = (unsigned int)((sc->pages - pages + 7) >> 3);
>                  if ( likely(peek) )
>                  {
> -                    if ( copy_to_guest_offset(sc->dirty_bitmap, pages >> 3,
> -                                              (uint8_t *)l1, bytes) != 0 )
> +                    if ( (l1 ? copy_to_guest_offset(sc->dirty_bitmap,
> +                                                    pages >> 3, (uint8_t 
> *)l1,
> +                                                    bytes)
> +                             : clear_guest_offset(sc->dirty_bitmap,
> +                                                  pages >> 3, bytes)) != 0 )
>                      {
>                          rv = -EFAULT;
>                          goto out;
>                      }
>                  }
> -                if ( clean && l1 != zeroes )
> -                    clear_page(l1);
>                  pages += bytes << 3;
> -                if ( l1 != zeroes )
> +                if ( l1 )
> +                {
> +                    if ( clean )
> +                        clear_page(l1);
>                      unmap_domain_page(l1);
> +                }
>              }
>              if ( l2 )
>                  unmap_domain_page(l2);
> @@ -462,12 +466,9 @@ int paging_log_dirty_range(struct domain
>  
>      if ( !d->arch.paging.log_dirty.fault_count &&
>           !d->arch.paging.log_dirty.dirty_count ) {
> -        int size = (nr + BITS_PER_LONG - 1) / BITS_PER_LONG;
> -        unsigned long zeroes[size];
> -        memset(zeroes, 0x00, size * BYTES_PER_LONG);
> -        rv = 0;
> -        if ( copy_to_guest_offset(dirty_bitmap, 0, (uint8_t *) zeroes,
> -                                  size * BYTES_PER_LONG) != 0 )
> +        unsigned int size = BITS_TO_LONGS(nr);
> +
> +        if ( clear_guest(dirty_bitmap, size * BYTES_PER_LONG) != 0 )
>              rv = -EFAULT;
>          goto out;
>      }
> @@ -495,11 +496,10 @@ int paging_log_dirty_range(struct domain
>                    (pages < nr) && (i2 < LOGDIRTY_NODE_ENTRIES);
>                    i2++ )
>              {
> -                static unsigned long zeroes[PAGE_SIZE/BYTES_PER_LONG];
>                  unsigned int bytes = PAGE_SIZE;
>                  uint8_t *s;
>                  l1 = ((l2 && mfn_valid(l2[i2])) ?
> -                      map_domain_page(mfn_x(l2[i2])) : zeroes);
> +                      map_domain_page(mfn_x(l2[i2])) : NULL);
>  
>                  s = ((uint8_t*)l1) + (b1 >> 3);
>                  bytes -= b1 >> 3;
> @@ -507,9 +507,18 @@ int paging_log_dirty_range(struct domain
>                  if ( likely(((nr - pages + 7) >> 3) < bytes) )
>                      bytes = (unsigned int)((nr - pages + 7) >> 3);
>  
> +                if ( !l1 )
> +                {
> +                    if ( clear_guest_offset(dirty_bitmap, pages >> 3,
> +                                            bytes) != 0 )
> +                    {
> +                        rv = -EFAULT;
> +                        goto out;
> +                    }
> +                }
>                  /* begin_pfn is not 32K aligned, hence we have to bit
>                   * shift the bitmap */
> -                if ( b1 & 0x7 )
> +                else if ( b1 & 0x7 )
>                  {
>                      int i, j;
>                      uint32_t *l = (uint32_t*) s;
> @@ -553,11 +562,12 @@ int paging_log_dirty_range(struct domain
>                      }
>                  }
>  
> -                if ( l1 != zeroes )
> -                    clear_page(l1);
>                  pages += bytes << 3;
> -                if ( l1 != zeroes )
> +                if ( l1 )
> +                {
> +                    clear_page(l1);
>                      unmap_domain_page(l1);
> +                }
>                  b1 = b1 & 0x7;
>              }
>              b2 = 0;



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