[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |