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>
Subject: [PATCH v11 12/27] tools/xenstore: add support for delaying execution of a xenstore request
Date: Thu, 14 Jan 2021 16:37:48 +0100 [thread overview]
Message-ID: <20210114153803.2591-13-jgross@suse.com> (raw)
In-Reply-To: <20210114153803.2591-1-jgross@suse.com>
Today a Xenstore request is processed as soon as it is seen by
xenstored. Add the framework for being able to delay processing of a
request if the right conditions aren't met.
Any delayed requests are executed at the end of the main processing
loop in xenstored. They can either delay themselves again or just do
their job. In order to enable the possibility of a timeout, the main
loop will be paused for max one second if any requests are delayed.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
V11:
- new patch
---
tools/xenstore/xenstored_core.c | 55 ++++++++++++++++++++++++++++++++-
tools/xenstore/xenstored_core.h | 21 +++++++++++++
2 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 0dddf24327..23da8dafde 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -69,6 +69,7 @@ static int xce_pollfd_idx = -1;
static struct pollfd *fds;
static unsigned int current_array_size;
static unsigned int nr_fds;
+static unsigned int delayed_requests;
static int sock = -1;
@@ -255,6 +256,46 @@ static bool write_messages(struct connection *conn)
return true;
}
+static int undelay_request(void *_req)
+{
+ struct delayed_request *req = _req;
+
+ list_del(&req->list);
+ delayed_requests--;
+
+ return 0;
+}
+
+static void call_delayed(struct delayed_request *req)
+{
+ if (req->func(req)) {
+ undelay_request(req);
+ talloc_set_destructor(req, NULL);
+ }
+}
+
+int delay_request(struct connection *conn, struct buffered_data *in,
+ bool (*func)(struct delayed_request *), void *data)
+{
+ struct delayed_request *req;
+
+ req = talloc(in, struct delayed_request);
+ if (!req)
+ return ENOMEM;
+
+ /* For the case of connection being closed. */
+ talloc_set_destructor(req, undelay_request);
+
+ req->in = in;
+ req->func = func;
+ req->data = data;
+
+ delayed_requests++;
+ list_add(&req->list, &conn->delayed);
+
+ return 0;
+}
+
static int destroy_conn(void *_conn)
{
struct connection *conn = _conn;
@@ -321,7 +362,8 @@ static void initialize_fds(int *p_sock_pollfd_idx, int *ptimeout)
memset(fds, 0, sizeof(struct pollfd) * current_array_size);
nr_fds = 0;
- *ptimeout = -1;
+ /* In case of delayed requests pause for max 1 second. */
+ *ptimeout = delayed_requests ? 1000 : -1;
if (sock != -1)
*p_sock_pollfd_idx = set_fd(sock, POLLIN|POLLPRI);
@@ -1524,6 +1566,7 @@ struct connection *new_connection(connwritefn_t *write, connreadfn_t *read)
INIT_LIST_HEAD(&new->out_list);
INIT_LIST_HEAD(&new->watches);
INIT_LIST_HEAD(&new->transaction_list);
+ INIT_LIST_HEAD(&new->delayed);
list_add_tail(&new->list, &connections);
talloc_set_destructor(new, destroy_conn);
@@ -2215,6 +2258,16 @@ int main(int argc, char *argv[])
}
}
+ if (delayed_requests) {
+ list_for_each_entry(conn, &connections, list) {
+ struct delayed_request *req, *tmp;
+
+ list_for_each_entry_safe(req, tmp,
+ &conn->delayed, list)
+ call_delayed(req);
+ }
+ }
+
initialize_fds(&sock_pollfd_idx, &timeout);
}
}
diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h
index 27826c125c..d5cdf17160 100644
--- a/tools/xenstore/xenstored_core.h
+++ b/tools/xenstore/xenstored_core.h
@@ -61,6 +61,20 @@ struct buffered_data
char default_buffer[DEFAULT_BUFFER_SIZE];
};
+struct delayed_request {
+ /* Next delayed request. */
+ struct list_head list;
+
+ /* The delayed request. */
+ struct buffered_data *in;
+
+ /* Function to call. */
+ bool (*func)(struct delayed_request *req);
+
+ /* Further data. */
+ void *data;
+};
+
struct connection;
typedef int connwritefn_t(struct connection *, const void *, unsigned int);
typedef int connreadfn_t(struct connection *, void *, unsigned int);
@@ -94,6 +108,9 @@ struct connection
uint32_t next_transaction_id;
unsigned int transaction_started;
+ /* List of delayed requests. */
+ struct list_head delayed;
+
/* The domain I'm associated with, if any. */
struct domain *domain;
@@ -177,6 +194,10 @@ bool is_valid_nodename(const char *node);
/* Get name of parent node. */
char *get_parent(const void *ctx, const char *node);
+/* Delay a request. */
+int delay_request(struct connection *conn, struct buffered_data *in,
+ bool (*func)(struct delayed_request *), void *data);
+
/* Tracing infrastructure. */
void trace_create(const void *data, const char *type);
void trace_destroy(const void *data, const char *type);
--
2.26.2
next prev parent reply other threads:[~2021-01-14 15:39 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 ` [PATCH v11 05/27] tools/libxenevtchn: add possibility to not close file descriptor on exec Juergen Gross
2021-01-15 1:01 ` 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 ` Juergen Gross [this message]
2021-01-14 15:37 ` [PATCH v11 13/27] tools/xenstore: add the basic framework for doing the " 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-13-jgross@suse.com \
--to=jgross@suse.com \
--cc=iwj@xenproject.org \
--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.