WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: Olaf Hering <olaf@xxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 05/21] xenpaging: add signal handling
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
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=subtIO0CXwWHD2Wh4QkglncjjjgPFB0nz5hLMXrgcUU=; b=SzPnretDAobsXfbWUPs7h9xVu2NIHWLeJLk8eHwMey62N+mzWi2FwTaC3zzIq53UKI xRcdpYTxmGpNw3w9D19fwWoDJdsrYpHHVxIC0N961dIvJO5feSZWkpthGjuA8tF8Is5H MDKhEQymPqtEqaLKxqOHzgj25DLS13ksXJL3c=
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=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20101126134903.163026660@xxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20101126134901.384130351@xxxxxxxxx> <20101126134903.163026660@xxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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

<Prev in Thread] Current Thread [Next in Thread>