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

Re: [Xen-devel] [PATCH 05/21] xenpaging: add signal handling


  • To: Olaf Hering <olaf@xxxxxxxxx>
  • From: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
  • Date: Fri, 26 Nov 2010 14:29:33 +0000
  • Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
  • Delivery-date: Fri, 26 Nov 2010 06:30:24 -0800
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=awCaDs+zEWjjIs+e/V954tl/4B3HDPUEnuM93BjKiuGBa4b+VolfCw7HsY+F5GBaUC x2FfSJrzv1O5sg1Xhgf9C89xSf5Yf7mqaFbzrJqQt+L8qonrW5MOlYj4Emnl1G8dQKDa 8pC7GEB3Vfcjz0ciISFO8RHyamtu+6eYP5uXM=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

Olaf, I haven't been looking at these patches as we've been going
along, but there seem to be two things happening in this patch not
mentioned in the description:

* Making xenpaging_teardown() not skip when a tear-down item fails,
but continue to try to tear down the rest
* Making return values for the program as a whole (1 for initializing
the paging, 2 for a failed file open)

These kinds of things should at least be mentioned in the description;
and I would personally probably pull them out and put them in a
separate patch.

 -George

On Fri, Nov 26, 2010 at 1:49 PM, Olaf Hering <olaf@xxxxxxxxx> wrote:
> Leave paging loop if xenpaging gets a signal.
> Remove paging file on exit.
>
> Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
>
> ---
> v2:
>  unlink pagefile in signal handler to avoid stale pagefiles if xenpaging is
>  stuck in some loop
>
>  tools/xenpaging/xenpaging.c |   42 +++++++++++++++++++++++++++++++++---------
>  1 file changed, 33 insertions(+), 9 deletions(-)
>
> --- xen-unstable.hg-4.1.22433.orig/tools/xenpaging/xenpaging.c
> +++ xen-unstable.hg-4.1.22433/tools/xenpaging/xenpaging.c
> @@ -25,6 +25,7 @@
>  #include <stdlib.h>
>  #include <stdarg.h>
>  #include <time.h>
> +#include <signal.h>
>  #include <xc_private.h>
>
>  #include <xen/mem_event.h>
> @@ -43,6 +44,14 @@
>  #define DPRINTF(...) ((void)0)
>  #endif
>
> +static char filename[80];
> +static int interrupted;
> +static void close_handler(int sig)
> +{
> +    interrupted = sig;
> +    if ( filename[0] )
> +        unlink(filename);
> +}
>
>  static void *init_page(void)
>  {
> @@ -248,7 +257,6 @@ int xenpaging_teardown(xc_interface *xch
>     if ( rc != 0 )
>     {
>         ERROR("Error tearing down domain paging in xen");
> -        goto err;
>     }
>
>     /* Unbind VIRQ */
> @@ -256,7 +264,6 @@ int xenpaging_teardown(xc_interface *xch
>     if ( rc != 0 )
>     {
>         ERROR("Error unbinding event port");
> -        goto err;
>     }
>     paging->mem_event.port = -1;
>
> @@ -265,7 +272,6 @@ int xenpaging_teardown(xc_interface *xch
>     if ( rc != 0 )
>     {
>         ERROR("Error closing event channel");
> -        goto err;
>     }
>     paging->mem_event.xce_handle = -1;
>
> @@ -274,7 +280,6 @@ int xenpaging_teardown(xc_interface *xch
>     if ( rc != 0 )
>     {
>         ERROR("Error closing connection to xen");
> -        goto err;
>     }
>     paging->xc_handle = NULL;
>
> @@ -380,7 +385,7 @@ int xenpaging_evict_page(xc_interface *x
>     return ret;
>  }
>
> -int xenpaging_resume_page(xenpaging_t *paging, mem_event_response_t *rsp)
> +static int xenpaging_resume_page(xenpaging_t *paging, mem_event_response_t 
> *rsp)
>  {
>     int ret;
>
> @@ -461,6 +466,11 @@ static int evict_victim(xc_interface *xc
>             goto out;
>         }
>
> +        if ( interrupted )
> +        {
> +            ret = -EINTR;
> +            goto out;
> +        }
>         ret = xc_mem_paging_nominate(paging->xc_handle,
>                                      paging->mem_event.domain_id, 
> victim->gfn);
>         if ( ret == 0 )
> @@ -485,6 +495,7 @@ static int evict_victim(xc_interface *xc
>
>  int main(int argc, char *argv[])
>  {
> +    struct sigaction act;
>     domid_t domain_id;
>     int num_pages;
>     xenpaging_t *paging;
> @@ -498,7 +509,6 @@ int main(int argc, char *argv[])
>
>     int open_flags = O_CREAT | O_TRUNC | O_RDWR;
>     mode_t open_mode = S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | 
> S_IWOTH;
> -    char filename[80];
>     int fd;
>
>     if ( argc != 3 )
> @@ -520,7 +530,7 @@ int main(int argc, char *argv[])
>     if ( paging == NULL )
>     {
>         ERROR("Error initialising paging");
> -        goto out;
> +        return 1;
>     }
>
>     /* Open file */
> @@ -529,9 +539,18 @@ int main(int argc, char *argv[])
>     if ( fd < 0 )
>     {
>         perror("failed to open file");
> -        return -1;
> +        return 2;
>     }
>
> +    /* ensure that if we get a signal, we'll do cleanup, then exit */
> +    act.sa_handler = close_handler;
> +    act.sa_flags = 0;
> +    sigemptyset(&act.sa_mask);
> +    sigaction(SIGHUP,  &act, NULL);
> +    sigaction(SIGTERM, &act, NULL);
> +    sigaction(SIGINT,  &act, NULL);
> +    sigaction(SIGALRM, &act, NULL);
> +
>     /* Evict pages */
>     memset(victims, 0, sizeof(xenpaging_victim_t) * num_pages);
>     for ( i = 0; i < num_pages; i++ )
> @@ -539,6 +558,8 @@ int main(int argc, char *argv[])
>         rc = evict_victim(xch, paging, domain_id, &victims[i], fd, i);
>         if ( rc == -ENOSPC )
>             break;
> +        if ( rc == -EINTR )
> +            break;
>         if ( i % 100 == 0 )
>             DPRINTF("%d pages evicted\n", i);
>     }
> @@ -546,7 +567,7 @@ int main(int argc, char *argv[])
>     DPRINTF("pages evicted\n");
>
>     /* Swap pages in and out */
> -    while ( 1 )
> +    while ( !interrupted )
>     {
>         /* Wait for Xen to signal that a page needs paged in */
>         rc = xc_wait_for_event_or_timeout(xch, paging->mem_event.xce_handle, 
> 100);
> @@ -637,8 +658,10 @@ int main(int argc, char *argv[])
>             }
>         }
>     }
> +    DPRINTF("xenpaging got signal %d\n", interrupted);
>
>  out:
> +    close(fd);
>     free(victims);
>
>     /* Tear down domain paging */
> @@ -651,6 +674,7 @@ int main(int argc, char *argv[])
>
>     xc_interface_close(xch);
>
> +    DPRINTF("xenpaging exit code %d\n", rc);
>     return rc;
>  }
>
>
>
> _______________________________________________
> 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®.