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

Re: [Xen-devel] [PATCH] libxc: free thread specific hypercall buffer on xc_interface_close



This patch prevents me from starting a guest until
the outstanding issue - namely why is hcall_buf_prep() never called -
is solved.

Christoph



On Wednesday 18 August 2010 17:01:07 Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1282143629 -3600
> # Node ID b1f4b4be1f94c0007794f86abd019f5c2629c59b
> # Parent  ddbd38da07397dca4760fb687551c3f6f9134700
> libxc: free thread specific hypercall buffer on xc_interface_close
>
> The per-thread hypercall buffer is usually cleaned up on pthread_exit
> by the destructor passed to pthread_key_create. However if the calling
> application is not threaded then the destructor is never called.
>
> This frees the data for the current thread only but that is OK since
> any other threads will be cleaned up by the destructor.
>
> Changed since v1:
>  * Ensure hcall_buf_pkey is initialised before use. Thanks to
>    Christoph Egger for his help diagnosing this issue on NetBSD.
>  * Remove redundant if (hcall_buf) from xc_clean_hcall_buf since
>    _xc_clean_hcall_buf includes the same check.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r ddbd38da0739 -r b1f4b4be1f94 tools/libxc/xc_private.c
> --- a/tools/libxc/xc_private.c        Wed Aug 18 13:14:57 2010 +0100
> +++ b/tools/libxc/xc_private.c        Wed Aug 18 16:00:29 2010 +0100
> @@ -57,6 +57,8 @@ xc_interface *xc_interface_open(xentooll
>      return 0;
>  }
>
> +static void xc_clean_hcall_buf(void);
> +
>  int xc_interface_close(xc_interface *xch)
>  {
>      int rc = 0;
> @@ -68,6 +70,9 @@ int xc_interface_close(xc_interface *xch
>          rc = xc_interface_close_core(xch, xch->fd);
>          if (rc) PERROR("Could not close hypervisor interface");
>      }
> +
> +    xc_clean_hcall_buf();
> +
>      free(xch);
>      return rc;
>  }
> @@ -180,6 +185,8 @@ int hcall_buf_prep(void **addr, size_t l
>  int hcall_buf_prep(void **addr, size_t len) { return 0; }
>  void hcall_buf_release(void **addr, size_t len) { }
>
> +static void xc_clean_hcall_buf(void) { }
> +
>  #else /* !__sun__ */
>
>  int lock_pages(void *addr, size_t len)
> @@ -228,6 +235,13 @@ static void _xc_init_hcall_buf(void)
>  static void _xc_init_hcall_buf(void)
>  {
>      pthread_key_create(&hcall_buf_pkey, _xc_clean_hcall_buf);
> +}
> +
> +static void xc_clean_hcall_buf(void)
> +{
> +    pthread_once(&hcall_buf_pkey_once, _xc_init_hcall_buf);
> +
> +    _xc_clean_hcall_buf(pthread_getspecific(hcall_buf_pkey));
>  }
>
>  int hcall_buf_prep(void **addr, size_t len)
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


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