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

[PATCH v2 4/6] tools/xenstored: use atexit to close interfaces


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Roger Pau Monne <roger.pau@xxxxxxxxxx>
  • Date: Wed, 22 Sep 2021 10:21:21 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=cD1jNa1dkKGTraDhEkBrz9VgImKuoXQDqGBPFO2wT9s=; b=atl4Pw5LlfP8hZEjnz2dk2DPpuLtPAhtBwhHAV/EFOL8+NMf3vT6N05j5Sd9Q0F+E1SF0mWXAePPcRCSxgUhWUacOEps6IW/xWfGPk8FYXfh/FFFC8Dr8aM53s/n5+UGyhlVPU9Kiaxz7TkCRpjwSxaom7JL94O4yKsOMV0edM9GPqGz6flTPevje9NxUA5Bl211sOpPITxAcrItGpFV55HL2+EZaJsuP191Hkqf0SLaxMXpV7voZJT6nPbe7/Lobmjh4GqujEcLBPdkkGuFynccbU3fo9KoVbB9F3Af4ZOGX51wq26rbV/okdOOBLTe86K/n1Tg2Z4cQDCOXbz1fg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AdbyU0MLp3zipdElBXPzgnhh3vHdRo4xl/AEO8OELYlNS/vYbiEcmFCzAVZqRk826vBd1ji3OZcbQL52k2ZI1OgujG9VooVhaEvP1pZbrngAOqJx0wPyZeFCdvZQ4WFACYcEXYvZfsoEQ5gsrMWnUo3PRT2QdTEWVkK8NshssX6ARcEvHCnOznZIY9iX7SKo5bpIMJGt7dxcvqfSxRbS0kvDZRKiOAkdrrMy/7EVSzi7uZ4xs+/eLdczgvFfl+orEIknGpUppuAPwMEek3XZbHpetqHgNEgvc5CKjfHhj0dja3LT7Q0VzopYOdycQZAqZyJwInsCFok/UU9fqv0jEQ==
  • Authentication-results: esa5.hc3370-68.iphmx.com; dkim=pass (signature verified) header.i=@citrix.onmicrosoft.com
  • Cc: Roger Pau Monne <roger.pau@xxxxxxxxxx>, Ian Jackson <iwj@xxxxxxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, Juergen Gross <jgross@xxxxxxxx>, Julien Grall <julien@xxxxxxx>
  • Delivery-date: Wed, 22 Sep 2021 08:22:09 +0000
  • Ironport-data: A9a23:hauNmqJJUDqaEwGiFE+R6ZIlxSXFcZb7ZxGr2PjKsXjdYENS0GMFz TBMXGHUbP7eNmqkL4h3aI6ypE9S6JeEmNYwSlRlqX01Q3x08seUXt7xwmUcns+xwm8vaGo9s q3yv/GZdJhcokcxIn5BC5C5xZVG/fjgqoHUVaiUZ0ideSc+EH140UM5wbZj6mJVqYPR7z2l6 IuaT/L3YDdJ6xYsWo7Dw/vewP/HlK2aVAIw5jTSV9gS1LPtvyB94KYkDbOwNxPFrrx8RYZWc QphIIaRpQs19z91Yj+sfy2SnkciGtY+NiDW4pZatjTLbrGvaUXe345iXMfwZ3u7hB2EpIB22 IxClabrUChyGerisuomCCVXRnQW0a1uoNcrIFC6uM2XiUbHb2Ht07NlC0Re0Y8wo7gtRzsUr LpBdW5LPkvra+GemdpXTsF2gcsuNo/zNZ43sXB81zDJS/0hRPgvRo2Xv48JgG1o2qiiG974R 5UnTQpGay3uIBJrPE8IVc0/gOqR0yyXnzpw9wvO+PtfD3Lo5A5+yr/2K/LOZ8eHA85Smy6wp H/C/mn/KgEXMpqY0zXt2m2orv/Cm2X8Qo16PK218LtmjUOewkQXCQYKTh2rrP+hkEm8VtlDb UsO9UIGrLcw3FymSMHnWB+1q2LCuQQTM+e8CMVjtlvLkPCNpV/EWC5UFVatdeDKquc7fmwtx gaGv+myHBM0l/q7Y3ymrYub+Gba1TcuEYMSWcMVZVJbuIO68N9v1kunosVLS/Hu34ascd3k6 3XT9nFv2e9L5SIe//jjpTj6bySQSo8lp+Lfzj7eWH6spih9bZSsD2BDwQmGtascRGp1o1/og ZTlpyR8xLtVZX1uvHbUKAnoIF1Oz6zeWAAweXY1Q/EcG82FohZPh7y8BQ1DyLpBaJ5YKVcFn 3M/SSsOvcQObRNGnIdcYp6rCtRC8JUM4e/ND6iOBvIXO8AZXFbeoElGOB7Bt0iwwRNEufxuZ v+mnTOEUC9y5VJPl2HtGY/wENYDm0gD+I8kbcqql0j4ieXOOiH9pHVsGALmU93VJZis+W392 91eK9GL21NYVuj/aTPQ6okdMRYBKn1TOHw8g5U/mjerLlU0FWc/JeXWxL99KYVpk74MzrXD/ 22nW18ew1363CWVJQKPY3FlSbXuQZcg8i5rYX1yZQ6liyo5fIKizKYDbJ9rL7Mpw/NukKxvR P4fdsTeXvkWEmbb+y4QZIXWpZB5cEj5nhqHOieoOWBtf5NpSwHT1MXjew/jqHsHAiat7JNsq Ly8zALLB5EEQl06XsrRbfuuyXK3vGQcx70uDxeZfIELdRy1ooZwKiH3gvsmGO02KE3OlmmAy gKbIRYEvu2R8YU7x8bE2PKfpICzHuogQkcDRzvH7ay7PDXx93a4xdMSS/6BeD3QWT+m+KimY ukJnfjwPOdewQRPuot4Vb1q0bg/953koLoDllZoG3DCblKKDLJ8IybZgZkT5/MVnrIJ6xGrX k+v+8VBPeTbMczoJ1cdOQ45Y7nRzvoTgDTTsaw4LUiSCPWbJ1ZbvZG+5yWxtRE=
  • Ironport-hdrordr: A9a23:+A2wQqoFWjSaHv7dPBewOMwaV5u6L9V00zEX/kB9WHVpm5Oj+P xGzc526farslsssREb+OxpOMG7MBfhHPlOkPUs1NaZLXTbUQ6TQr2KgrGSpQEIdxeOlNK1kJ 0QCJSWa+eAfGSS7/yKmTVQeuxIqLLskNHK9JfjJjVWPHtXgslbnnlE422gYypLrWd9dP8E/M 323Ls5m9PsQwVbUu2LQl0+G8TTrdzCk5zrJTYAGh4c8QGLyRel8qTzHRS01goXF2on+8ZszU H11yjCoomzufCyzRHRk0fV8pRtgdPkjv9OHtaFhMQ5IijlziyoeINicbufuy1dmpDi1H8a1P 335zswNcV67H3cOkmzvBvWwgHllA0j7nfzoGXoyUfLkIjcfnYXGsBBjYVWfl/y8Ew7puxx16 pNwiawq4dXJQmoplW82/H4EzVR0makq3srluAey1ZFV5EFVbNXpYsDuGtIDZY7Gj7g4oxPKp guMCjl3ocVTbqmVQGdgoE2q+bcGkjbXy32DHTqg/blkAS/xxtCvgwlLM92pAZIyHtycegD2w xoWp4Y4I2mdfVmH56VMt1xN/dfOla9Mi4kD1jiVGgPbJt3Q04li6SHq4ndt9vaMqDh8vMJ6e P8uRVjxDcPR34=
  • Ironport-sdr: XFSfHGlrHY4bDoejpoN6A72iiDwFrWClWCBZ4OdBkv8r5pezev8lt8kCNR9IxlxCIF3tTSCXgW 0Rj6A9J7Jm+yLSCvFFhXiJJfUrefIvIKOTIZssBNQQQ7tGvuQmkEjuaoaqWinGP51wY5ZZKvaU E1rIhT4NTlg3aKefdW7YaNxDytvm6TPBmdOc869FJqt54AelI0fnkdFbaVF5S0f0ngn/Nie7D2 afGDxq5IwcUJ/8adbsJ4r+tLXX5VSURfp6Bp/bCTccTKqKgd3mKlU1f//uCByctcn1UVD/1vOB GTXCBIOf2b+yLYe5zZExwTeP
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Exploiting the talloc clean up routines to close the Xen interfaces
is cumbersome, specially when atexit can be used to the same effect.

Convert xc and gnttab to use atexit which allows to drop one
indirection from the storing variables. While there also close the
event channel interface.

No functional change intended.

Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
Changes since v1:
 - Fix minios xenstored build.
 - Also close event channel handle
---
 tools/xenstore/xenstored_core.h   |  2 +-
 tools/xenstore/xenstored_domain.c | 61 ++++++++++++++-----------------
 tools/xenstore/xenstored_minios.c |  4 +-
 3 files changed, 31 insertions(+), 36 deletions(-)

diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h
index 258f6ff382..a813bc5a8c 100644
--- a/tools/xenstore/xenstored_core.h
+++ b/tools/xenstore/xenstored_core.h
@@ -266,7 +266,7 @@ void init_pipe(int reopen_log_pipe[2]);
 #ifndef NO_SOCKETS
 extern const struct interface_funcs socket_funcs;
 #endif
-extern xengnttab_handle **xgt_handle;
+extern xengnttab_handle *xgt_handle;
 
 int remember_string(struct hashtable *hash, const char *str);
 
diff --git a/tools/xenstore/xenstored_domain.c 
b/tools/xenstore/xenstored_domain.c
index 47e9107c14..9fb78d5772 100644
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -35,8 +35,8 @@
 #include <xenctrl.h>
 #include <xen/grant_table.h>
 
-static xc_interface **xc_handle;
-xengnttab_handle **xgt_handle;
+static xc_interface *xc_handle;
+xengnttab_handle *xgt_handle;
 static evtchn_port_t virq_port;
 
 xenevtchn_handle *xce_handle = NULL;
@@ -198,14 +198,14 @@ static const struct interface_funcs domain_funcs = {
 
 static void *map_interface(domid_t domid)
 {
-       return xengnttab_map_grant_ref(*xgt_handle, domid,
+       return xengnttab_map_grant_ref(xgt_handle, domid,
                                       GNTTAB_RESERVED_XENSTORE,
                                       PROT_READ|PROT_WRITE);
 }
 
 static void unmap_interface(void *interface)
 {
-       xengnttab_unmap(*xgt_handle, interface, 1);
+       xengnttab_unmap(xgt_handle, interface, 1);
 }
 
 static int destroy_domain(void *_domain)
@@ -240,7 +240,7 @@ static int destroy_domain(void *_domain)
 
 static bool get_domain_info(unsigned int domid, xc_dominfo_t *dominfo)
 {
-       return xc_domain_getinfo(*xc_handle, domid, 1, dominfo) == 1 &&
+       return xc_domain_getinfo(xc_handle, domid, 1, dominfo) == 1 &&
               dominfo->domid == domid;
 }
 
@@ -648,18 +648,6 @@ int do_reset_watches(struct connection *conn, struct 
buffered_data *in)
        return 0;
 }
 
-static int close_xc_handle(void *_handle)
-{
-       xc_interface_close(*(xc_interface**)_handle);
-       return 0;
-}
-
-static int close_xgt_handle(void *_handle)
-{
-       xengnttab_close(*(xengnttab_handle **)_handle);
-       return 0;
-}
-
 /* Returns the implicit path of a connection (only domains have this) */
 const char *get_implicit_path(const struct connection *conn)
 {
@@ -737,35 +725,42 @@ void dom0_init(void)
        xenevtchn_notify(xce_handle, dom0->port);
 }
 
+void interface_cleanup(void)
+{
+       if (xc_handle) {
+               xc_interface_close(xc_handle);
+               xc_handle = NULL;
+       }
+       if (xgt_handle) {
+               xengnttab_close(xgt_handle);
+               xgt_handle = NULL;
+       }
+       if (xce_handle) {
+               xenevtchn_close(xce_handle);
+               xce_handle = NULL;
+       }
+}
+
 void domain_init(int evtfd)
 {
-       int rc;
+       int rc = atexit(interface_cleanup);
 
-       xc_handle = talloc(talloc_autofree_context(), xc_interface*);
-       if (!xc_handle)
-               barf_perror("Failed to allocate domain handle");
+       if (rc)
+               barf_perror("Unable to register cleanup handler");
 
-       *xc_handle = xc_interface_open(0,0,0);
-       if (!*xc_handle)
+       xc_handle = xc_interface_open(0,0,0);
+       if (!xc_handle)
                barf_perror("Failed to open connection to hypervisor");
 
-       talloc_set_destructor(xc_handle, close_xc_handle);
-
-       xgt_handle = talloc(talloc_autofree_context(), xengnttab_handle*);
+       xgt_handle = xengnttab_open(NULL, 0);
        if (!xgt_handle)
-               barf_perror("Failed to allocate domain gnttab handle");
-
-       *xgt_handle = xengnttab_open(NULL, 0);
-       if (*xgt_handle == NULL)
                barf_perror("Failed to open connection to gnttab");
 
        /*
         * Allow max number of domains for mappings. We allow one grant per
         * domain so the theoretical maximum is DOMID_FIRST_RESERVED.
         */
-       xengnttab_set_max_grants(*xgt_handle, DOMID_FIRST_RESERVED);
-
-       talloc_set_destructor(xgt_handle, close_xgt_handle);
+       xengnttab_set_max_grants(xgt_handle, DOMID_FIRST_RESERVED);
 
        if (evtfd < 0)
                xce_handle = xenevtchn_open(NULL, XENEVTCHN_NO_CLOEXEC);
diff --git a/tools/xenstore/xenstored_minios.c 
b/tools/xenstore/xenstored_minios.c
index c94493e52a..9b050c7e02 100644
--- a/tools/xenstore/xenstored_minios.c
+++ b/tools/xenstore/xenstored_minios.c
@@ -49,12 +49,12 @@ evtchn_port_t xenbus_evtchn(void)
 
 void *xenbus_map(void)
 {
-       return xengnttab_map_grant_ref(*xgt_handle, xenbus_master_domid(),
+       return xengnttab_map_grant_ref(xgt_handle, xenbus_master_domid(),
                        GNTTAB_RESERVED_XENSTORE, PROT_READ|PROT_WRITE);
 }
 
 void unmap_xenbus(void *interface)
 {
-       xengnttab_unmap(*xgt_handle, interface, 1);
+       xengnttab_unmap(xgt_handle, interface, 1);
 }
 
-- 
2.33.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.