From: Juergen Gross <jgross@suse.com>
To: xen-devel@lists.xenproject.org
Cc: Juergen Gross <jgross@suse.com>, Ian Jackson <iwj@xenproject.org>,
Wei Liu <wl@xen.org>, Julien Grall <jgrall@amazon.com>
Subject: [PATCH v11 05/27] tools/libxenevtchn: add possibility to not close file descriptor on exec
Date: Thu, 14 Jan 2021 16:37:41 +0100 [thread overview]
Message-ID: <20210114153803.2591-6-jgross@suse.com> (raw)
In-Reply-To: <20210114153803.2591-1-jgross@suse.com>
Today the file descriptor for the access of the event channel driver
is being closed in case of exec(2). For the support of live update of
a daemon using libxenevtchn this can be problematic, so add a way to
keep that file descriptor open.
Add support of a flag XENEVTCHN_NO_CLOEXEC for xenevtchn_open() which
will result in _not_ setting O_CLOEXEC when opening the event channel
driver node.
The caller can then obtain the file descriptor via xenevtchn_fd().
Add an alternative open function xenevtchn_fdopen() which takes that
file descriptor as an additional parameter. This allows to allocate a
xenevtchn_handle and to associate it with that file descriptor.
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Wei Liu <wl@xen.org>
Reviewed-by: Julien Grall <jgrall@amazon.com>
---
V7:
- new patch
V8:
- some minor comments by Julien Grall addressed
V11:
- rename to xenevtchn_fdopen() (Andrew Cooper)
---
tools/include/xenevtchn.h | 16 +++++++-
tools/libs/evtchn/Makefile | 2 +-
tools/libs/evtchn/core.c | 64 ++++++++++++++++++++++--------
tools/libs/evtchn/freebsd.c | 6 ++-
tools/libs/evtchn/libxenevtchn.map | 4 ++
tools/libs/evtchn/linux.c | 6 ++-
tools/libs/evtchn/minios.c | 4 ++
7 files changed, 81 insertions(+), 21 deletions(-)
diff --git a/tools/include/xenevtchn.h b/tools/include/xenevtchn.h
index 3e9b6e7323..b6dd8f3186 100644
--- a/tools/include/xenevtchn.h
+++ b/tools/include/xenevtchn.h
@@ -64,11 +64,25 @@ struct xentoollog_logger;
*
* Calling xenevtchn_close() is the only safe operation on a
* xenevtchn_handle which has been inherited.
+ *
+ * Setting XENEVTCHN_NO_CLOEXEC allows to keep the file descriptor used
+ * for the event channel driver open across exec(2). In order to be able
+ * to use that file descriptor the new binary activated via exec(2) has
+ * to call xenevtchn_fdopen() with that file descriptor as parameter in
+ * order to associate it with a new handle. The file descriptor can be
+ * obtained via xenevtchn_fd() before calling exec(2).
*/
-/* Currently no flags are defined */
+
+/* Don't set O_CLOEXEC when opening event channel driver node. */
+#define XENEVTCHN_NO_CLOEXEC 0x01
+
xenevtchn_handle *xenevtchn_open(struct xentoollog_logger *logger,
unsigned int flags);
+/* Flag XENEVTCHN_NO_CLOEXEC is ignored by xenevtchn_fdopen(). */
+xenevtchn_handle *xenevtchn_fdopen(struct xentoollog_logger *logger,
+ int fd, unsigned open_flags);
+
/*
* Close a handle previously allocated with xenevtchn_open().
*/
diff --git a/tools/libs/evtchn/Makefile b/tools/libs/evtchn/Makefile
index ad01a17b3d..b8c37b5b97 100644
--- a/tools/libs/evtchn/Makefile
+++ b/tools/libs/evtchn/Makefile
@@ -2,7 +2,7 @@ XEN_ROOT = $(CURDIR)/../../..
include $(XEN_ROOT)/tools/Rules.mk
MAJOR = 1
-MINOR = 1
+MINOR = 2
SRCS-y += core.c
SRCS-$(CONFIG_Linux) += linux.c
diff --git a/tools/libs/evtchn/core.c b/tools/libs/evtchn/core.c
index c069d5da71..f2ab27384b 100644
--- a/tools/libs/evtchn/core.c
+++ b/tools/libs/evtchn/core.c
@@ -30,18 +30,10 @@ static int all_restrict_cb(Xentoolcore__Active_Handle *ah, domid_t domid)
return xenevtchn_restrict(xce, domid);
}
-xenevtchn_handle *xenevtchn_open(xentoollog_logger *logger, unsigned int flags)
+static xenevtchn_handle *xenevtchn_alloc_handle(xentoollog_logger *logger)
{
- xenevtchn_handle *xce;
- int rc;
-
- if ( flags )
- {
- errno = EINVAL;
- return NULL;
- }
+ xenevtchn_handle *xce = malloc(sizeof(*xce));
- xce = malloc(sizeof(*xce));
if ( !xce )
return NULL;
@@ -60,21 +52,59 @@ xenevtchn_handle *xenevtchn_open(xentoollog_logger *logger, unsigned int flags)
goto err;
}
+ return xce;
+
+err:
+ xenevtchn_close(xce);
+ return NULL;
+}
+
+xenevtchn_handle *xenevtchn_open(xentoollog_logger *logger, unsigned int flags)
+{
+ xenevtchn_handle *xce;
+ int rc;
+
+ if ( flags & ~XENEVTCHN_NO_CLOEXEC )
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ xce = xenevtchn_alloc_handle(logger);
+ if ( !xce )
+ return NULL;
+
rc = osdep_evtchn_open(xce, flags);
- if ( rc < 0 )
+ if ( rc < 0 )
goto err;
return xce;
- err:
- xentoolcore__deregister_active_handle(&xce->tc_ah);
- osdep_evtchn_close(xce);
- xtl_logger_destroy(xce->logger_tofree);
- free(xce);
-
+err:
+ xenevtchn_close(xce);
return NULL;
}
+xenevtchn_handle *xenevtchn_fdopen(struct xentoollog_logger *logger,
+ int fd, unsigned int flags)
+{
+ xenevtchn_handle *xce;
+
+ if ( flags & ~XENEVTCHN_NO_CLOEXEC )
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ xce = xenevtchn_alloc_handle(logger);
+ if ( !xce )
+ return NULL;
+
+ xce->fd = fd;
+
+ return xce;
+}
+
int xenevtchn_close(xenevtchn_handle *xce)
{
int rc;
diff --git a/tools/libs/evtchn/freebsd.c b/tools/libs/evtchn/freebsd.c
index bb601f350f..ed2baf3c95 100644
--- a/tools/libs/evtchn/freebsd.c
+++ b/tools/libs/evtchn/freebsd.c
@@ -33,8 +33,12 @@
int osdep_evtchn_open(xenevtchn_handle *xce, unsigned int flags)
{
- int fd = open(EVTCHN_DEV, O_RDWR|O_CLOEXEC);
+ int open_flags = O_RDWR;
+ int fd;
+ if ( !(flags & XENEVTCHN_NO_CLOEXEC) )
+ open_flags |= O_CLOEXEC;
+ fd = open(EVTCHN_DEV, open_flags);
if ( fd == -1 )
return -1;
diff --git a/tools/libs/evtchn/libxenevtchn.map b/tools/libs/evtchn/libxenevtchn.map
index 33a38f953a..4c180ea65d 100644
--- a/tools/libs/evtchn/libxenevtchn.map
+++ b/tools/libs/evtchn/libxenevtchn.map
@@ -21,3 +21,7 @@ VERS_1.1 {
global:
xenevtchn_restrict;
} VERS_1.0;
+VERS_1.2 {
+ global:
+ xenevtchn_fdopen;
+} VERS_1.1;
diff --git a/tools/libs/evtchn/linux.c b/tools/libs/evtchn/linux.c
index 62adc0e574..60bb75a791 100644
--- a/tools/libs/evtchn/linux.c
+++ b/tools/libs/evtchn/linux.c
@@ -36,8 +36,12 @@
int osdep_evtchn_open(xenevtchn_handle *xce, unsigned int flags)
{
- int fd = open("/dev/xen/evtchn", O_RDWR|O_CLOEXEC);
+ int open_flags = O_RDWR;
+ int fd;
+ if ( !(flags & XENEVTCHN_NO_CLOEXEC) )
+ open_flags |= O_CLOEXEC;
+ fd = open("/dev/xen/evtchn", open_flags);
if ( fd == -1 )
return -1;
diff --git a/tools/libs/evtchn/minios.c b/tools/libs/evtchn/minios.c
index 47c153c268..5728991cb8 100644
--- a/tools/libs/evtchn/minios.c
+++ b/tools/libs/evtchn/minios.c
@@ -69,6 +69,10 @@ static void port_dealloc(struct evtchn_port_info *port_info)
free(port_info);
}
+/*
+ * XENEVTCHN_NO_CLOEXEC is being ignored, as there is no exec() call supported
+ * in Mini-OS.
+ */
int osdep_evtchn_open(xenevtchn_handle *xce, unsigned int flags)
{
int fd = alloc_fd(FTYPE_EVTCHN);
--
2.26.2
next prev parent reply other threads:[~2021-01-14 15:38 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-14 15:37 [PATCH v11 00/27] tools/xenstore: support live update for xenstored Juergen Gross
2021-01-14 15:37 ` [PATCH v11 01/27] tools/libxenevtchn: switch to standard xen coding style Juergen Gross
2021-01-14 19:07 ` Andrew Cooper
2021-01-15 6:13 ` Jürgen Groß
2021-01-14 15:37 ` [PATCH v11 02/27] tools/libxenevtchn: rename open_flags to flags Juergen Gross
2021-01-14 19:22 ` Andrew Cooper
2021-01-15 6:14 ` Jürgen Groß
2021-01-14 15:37 ` [PATCH v11 03/27] tools/libxenevtchn: check xenevtchn_open() flags for not supported bits Juergen Gross
2021-01-14 19:24 ` Andrew Cooper
2021-01-15 6:19 ` Jürgen Groß
2021-01-14 15:37 ` [PATCH v11 04/27] tools/libxenevtchn: propagate xenevtchn_open() flags parameter Juergen Gross
2021-01-14 19:26 ` Andrew Cooper
2021-01-14 15:37 ` Juergen Gross [this message]
2021-01-15 1:01 ` [PATCH v11 05/27] tools/libxenevtchn: add possibility to not close file descriptor on exec Andrew Cooper
2021-01-15 7:11 ` Jürgen Groß
2021-01-14 15:37 ` [PATCH v11 06/27] tools/xenstore: refactor XS_CONTROL handling Juergen Gross
2021-01-14 15:37 ` [PATCH v11 07/27] tools/xenstore: add live update command to xenstore-control Juergen Gross
2021-01-14 15:37 ` [PATCH v11 08/27] tools/xenstore: add basic live-update command parsing Juergen Gross
2021-01-14 15:37 ` [PATCH v11 09/27] tools/xenstore: introduce live update status block Juergen Gross
2021-01-14 15:37 ` [PATCH v11 10/27] tools/xenstore: save new binary for live update Juergen Gross
2021-01-14 15:37 ` [PATCH v11 11/27] tools/xenstore: add command line handling " Juergen Gross
2021-01-14 15:37 ` [PATCH v11 12/27] tools/xenstore: add support for delaying execution of a xenstore request Juergen Gross
2021-01-14 15:37 ` [PATCH v11 13/27] tools/xenstore: add the basic framework for doing the live update Juergen Gross
2021-01-14 15:37 ` [PATCH v11 14/27] tools/xenstore: allow live update only with no transaction active Juergen Gross
2021-01-14 15:37 ` [PATCH v11 15/27] docs: update the xenstore migration stream documentation Juergen Gross
2021-01-14 15:37 ` [PATCH v11 16/27] tools/xenstore: add include file for state structure definitions Juergen Gross
2021-01-14 15:37 ` [PATCH v11 17/27] tools/xenstore: dump the xenstore state for live update Juergen Gross
2021-01-14 15:37 ` [PATCH v11 18/27] tools/xenstore: handle CLOEXEC flag for local files and pipes Juergen Gross
2021-01-14 15:37 ` [PATCH v11 19/27] tools/xenstore: split off domain introduction from do_introduce() Juergen Gross
2021-01-14 15:37 ` [PATCH v11 20/27] tools/xenstore: evaluate the live update flag when starting Juergen Gross
2021-01-14 15:37 ` [PATCH v11 21/27] tools/xenstore: read internal state when doing live upgrade Juergen Gross
2021-01-14 15:37 ` [PATCH v11 22/27] tools/xenstore: add reading global state for live update Juergen Gross
2021-01-14 15:37 ` [PATCH v11 23/27] tools/xenstore: add read connection " Juergen Gross
2021-01-14 15:38 ` [PATCH v11 24/27] tools/xenstore: add read node " Juergen Gross
2021-01-14 15:38 ` [PATCH v11 25/27] tools/xenstore: add read watch " Juergen Gross
2021-01-14 15:38 ` [PATCH v11 26/27] tools/xenstore: handle dying domains in " Juergen Gross
2021-01-14 15:38 ` [PATCH v11 27/27] tools/xenstore: activate new binary for " Juergen Gross
2021-01-14 16:48 ` [PATCH v11 00/27] tools/xenstore: support live update for xenstored Jürgen Groß
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210114153803.2591-6-jgross@suse.com \
--to=jgross@suse.com \
--cc=iwj@xenproject.org \
--cc=jgrall@amazon.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.