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

Re: [Xen-devel] [PATCH 6 of 9] xenpaging: add evict_pages function



On Thu, 2011-09-15 at 02:16 -0400, Olaf Hering wrote:
> # HG changeset patch
> # User Olaf Hering <olaf@xxxxxxxxx>
> # Date 1316067230 -7200
> # Node ID 3a3a5979b799d948802183d10d65894ee84a872f
> # Parent  6beca8cbc2c92900859712f8738db17084bcebdb
> xenpaging: add evict_pages function
> 
> Add new function to evict a couple of pages.

Do you really mean "a couple" here? (that generally means exactly two).
>From the implementation I think you mean evict a batch of pages?

> Allocate all possible slots in a paging file to allow growing and
> shrinking of the number of paged-out pages. Adjust other places to
> iterate over all slots.
> 
> This change is required by subsequent patches.
> 
> Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
> 
> diff -r 6beca8cbc2c9 -r 3a3a5979b799 tools/xenpaging/xenpaging.c
> --- a/tools/xenpaging/xenpaging.c
> +++ b/tools/xenpaging/xenpaging.c
> @@ -597,6 +597,30 @@ static int evict_victim(xenpaging_t *pag
>      return ret;
>  }
>  
> +/* Evict a couple of pages and write them to a free slot in the paging file 
> */
> +static int evict_pages(xenpaging_t *paging, int fd, xenpaging_victim_t 
> *victims, int num_pages)
> +{
> +    xc_interface *xch = paging->xc_handle;
> +    int rc, slot, num = 0;
> +
> +    for ( slot = 0; slot < paging->max_pages && num < num_pages; slot++ )
> +    {
> +        /* Slot is allocated */
> +        if ( victims[slot].gfn != INVALID_MFN )
> +            continue;
> +
> +        rc = evict_victim(paging, &victims[slot], fd, slot);
> +        if ( rc == -ENOSPC )
> +            break;
> +        if ( rc == -EINTR )
> +            break;
> +        if ( num && num % 100 == 0 )
> +            DPRINTF("%d pages evicted\n", num);
> +        num++;
> +    }
> +    return num;
> +}
> +
>  int main(int argc, char *argv[])
>  {
>      struct sigaction act;
> @@ -639,7 +663,12 @@ int main(int argc, char *argv[])
>          return 2;
>      }
>  
> -    victims = calloc(paging->num_pages, sizeof(xenpaging_victim_t));
> +    /* Allocate upper limit of pages to allow growing and shrinking */
> +    victims = calloc(paging->max_pages, sizeof(xenpaging_victim_t));
> +
> +    /* Mark all slots as unallocated */
> +    for ( i = 0; i < paging->max_pages; i++ )
> +        victims[i].gfn = INVALID_MFN;
>  
>      /* ensure that if we get a signal, we'll do cleanup, then exit */
>      act.sa_handler = close_handler;
> @@ -653,18 +682,7 @@ int main(int argc, char *argv[])
>      /* listen for page-in events to stop pager */
>      create_page_in_thread(paging);
>  
> -    /* Evict pages */
> -    for ( i = 0; i < paging->num_pages; i++ )
> -    {
> -        rc = evict_victim(paging, &victims[i], fd, i);
> -        if ( rc == -ENOSPC )
> -            break;
> -        if ( rc == -EINTR )
> -            break;
> -        if ( i % 100 == 0 )
> -            DPRINTF("%d pages evicted\n", i);
> -    }
> -
> +    i = evict_pages(paging, fd, victims, paging->num_pages);
>      DPRINTF("%d pages evicted. Done.\n", i);
>  
>      /* Swap pages in and out */
> @@ -690,13 +708,13 @@ int main(int argc, char *argv[])
>              if ( test_and_clear_bit(req.gfn, paging->bitmap) )
>              {
>                  /* Find where in the paging file to read from */
> -                for ( i = 0; i < paging->num_pages; i++ )
> +                for ( i = 0; i < paging->max_pages; i++ )
>                  {
>                      if ( victims[i].gfn == req.gfn )
>                          break;
>                  }
>      
> -                if ( i >= paging->num_pages )
> +                if ( i >= paging->max_pages )
>                  {
>                      DPRINTF("Couldn't find page %"PRIx64"\n", req.gfn);
>                      goto out;
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



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