From patchwork Fri Jul 15 04:57:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 9231161 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 24F7460868 for ; Fri, 15 Jul 2016 05:00:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1761828324 for ; Fri, 15 Jul 2016 05:00:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 091D228329; Fri, 15 Jul 2016 05:00:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DC97928324 for ; Fri, 15 Jul 2016 05:00:06 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bNvBl-0001Ab-9L; Fri, 15 Jul 2016 04:57:25 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bNvBj-0001AK-Du for xen-devel@lists.xen.org; Fri, 15 Jul 2016 04:57:23 +0000 Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id 3F/FE-27600-23D68875; Fri, 15 Jul 2016 04:57:22 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKLMWRWlGSWpSXmKPExsVyuP0Ov65hbke 4wbYNphZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8a/t5NZCn77VWzuvMrcwLjFuYuRk0NCwEji 7cR/TF2MXBxCAgsZJaZOWM8OkmATUJXYcP0UK4gtIiAtce3zZUYQm1kgVOLku3vMILawQJTEx 87fQDYHBwtQ/bk7/CBhXgF7if0bm9kh5stJXJ85nQnE5hRwkLg5tResVQio5uaXB2wTGLkXMD KsYtQoTi0qSy3SNTLRSyrKTM8oyU3MzNE1NDTRy00tLk5MT81JTCrWS87P3cQI9G49AwPjDsa fl/wOMUpyMCmJ8m5M6QgX4kvKT6nMSCzOiC8qzUktPsQow8GhJMG7PRsoJ1iUmp5akZaZAwwz mLQEB4+SCG8aSJq3uCAxtzgzHSJ1ilFRSpw3HSQhAJLIKM2Da4OF9iVGWSlhXkYGBgYhnoLUo tzMElT5V4ziHIxKwrxTQKbwZOaVwE1/BbSYCWixtXk7yOKSRISUVANjHmvSx7fTFm6+E1ejkn /54wOtDp4rh8Rf+nnM3XThcCeb0wmHxjNVCbtz7Nc1nXuzQNvjq8GB/u7sqfZz3m4tuLPqwsk Vvr+vBalx5gkVv1nmdnAnu76+/aVHdy+z2cz7trh6sf5Fj/srChtVN63rlGpQusjIUyVcOGEZ v7LRuUtMEZv3/mz9rsRSnJFoqMVcVJwIAKf9ETtoAgAA X-Env-Sender: jgross@suse.com X-Msg-Ref: server-2.tower-27.messagelabs.com!1468558641!1437977!1 X-Originating-IP: [195.135.220.15] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 41894 invoked from network); 15 Jul 2016 04:57:21 -0000 Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by server-2.tower-27.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 15 Jul 2016 04:57:21 -0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 768DCAC5D; Fri, 15 Jul 2016 04:57:20 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xen.org Date: Fri, 15 Jul 2016 06:57:15 +0200 Message-Id: <1468558636-17373-2-git-send-email-jgross@suse.com> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1468558636-17373-1-git-send-email-jgross@suse.com> References: <1468558636-17373-1-git-send-email-jgross@suse.com> Cc: Juergen Gross , wei.liu2@citrix.com, ian.jackson@eu.citrix.com Subject: [Xen-devel] [PATCH 1/2] xenstore: call each xenstored command function with temporary context X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP In order to be able to avoid leaving temporary memory allocated after processing of a command in xenstored call all command functions with the temporary "in" context. Each function can then make use of that temporary context for allocating temporary memory instead of either leaving that memory allocated until the connection is dropped (or even until end of xenstored) or freeing the memory itself. This requires to modify the interfaces of the functions taking only one argument from the connection. Signed-off-by: Juergen Gross --- tools/xenstore/xenstored_core.c | 39 +++++++++++++++++++--------------- tools/xenstore/xenstored_core.h | 3 +++ tools/xenstore/xenstored_domain.c | 14 +++++++----- tools/xenstore/xenstored_domain.h | 10 ++++----- tools/xenstore/xenstored_transaction.c | 3 ++- tools/xenstore/xenstored_transaction.h | 2 +- 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index 098865f..94c809c 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -713,7 +713,7 @@ bool is_valid_nodename(const char *node) /* We expect one arg in the input: return NULL otherwise. * The payload must contain exactly one nul, at the end. */ -static const char *onearg(struct buffered_data *in) +const char *onearg(struct buffered_data *in) { if (!in->used || get_string(in, 0) != in->used) return NULL; @@ -761,9 +761,10 @@ bool check_event_node(const char *node) return true; } -static void send_directory(struct connection *conn, const char *name) +static void send_directory(struct connection *conn, struct buffered_data *in) { struct node *node; + const char *name = onearg(in); name = canonicalize(conn, name); node = get_node(conn, name, XS_PERM_READ); @@ -775,9 +776,10 @@ static void send_directory(struct connection *conn, const char *name) send_reply(conn, XS_DIRECTORY, node->children, node->childlen); } -static void do_read(struct connection *conn, const char *name) +static void do_read(struct connection *conn, struct buffered_data *in) { struct node *node; + const char *name = onearg(in); name = canonicalize(conn, name); node = get_node(conn, name, XS_PERM_READ); @@ -943,9 +945,10 @@ static void do_write(struct connection *conn, struct buffered_data *in) send_ack(conn, XS_WRITE); } -static void do_mkdir(struct connection *conn, const char *name) +static void do_mkdir(struct connection *conn, struct buffered_data *in) { struct node *node; + const char *name = onearg(in); name = canonicalize(conn, name); node = get_node(conn, name, XS_PERM_WRITE); @@ -1060,9 +1063,10 @@ static void internal_rm(const char *name) } -static void do_rm(struct connection *conn, const char *name) +static void do_rm(struct connection *conn, struct buffered_data *in) { struct node *node; + const char *name = onearg(in); name = canonicalize(conn, name); node = get_node(conn, name, XS_PERM_WRITE); @@ -1094,9 +1098,10 @@ static void do_rm(struct connection *conn, const char *name) } -static void do_get_perms(struct connection *conn, const char *name) +static void do_get_perms(struct connection *conn, struct buffered_data *in) { struct node *node; + const char *name = onearg(in); char *strings; unsigned int len; @@ -1210,11 +1215,11 @@ static void process_message(struct connection *conn, struct buffered_data *in) switch (in->hdr.msg.type) { case XS_DIRECTORY: - send_directory(conn, onearg(in)); + send_directory(conn, in); break; case XS_READ: - do_read(conn, onearg(in)); + do_read(conn, in); break; case XS_WRITE: @@ -1222,15 +1227,15 @@ static void process_message(struct connection *conn, struct buffered_data *in) break; case XS_MKDIR: - do_mkdir(conn, onearg(in)); + do_mkdir(conn, in); break; case XS_RM: - do_rm(conn, onearg(in)); + do_rm(conn, in); break; case XS_GET_PERMS: - do_get_perms(conn, onearg(in)); + do_get_perms(conn, in); break; case XS_SET_PERMS: @@ -1254,7 +1259,7 @@ static void process_message(struct connection *conn, struct buffered_data *in) break; case XS_TRANSACTION_END: - do_transaction_end(conn, onearg(in)); + do_transaction_end(conn, in); break; case XS_INTRODUCE: @@ -1262,19 +1267,19 @@ static void process_message(struct connection *conn, struct buffered_data *in) break; case XS_IS_DOMAIN_INTRODUCED: - do_is_domain_introduced(conn, onearg(in)); + do_is_domain_introduced(conn, in); break; case XS_RELEASE: - do_release(conn, onearg(in)); + do_release(conn, in); break; case XS_GET_DOMAIN_PATH: - do_get_domain_path(conn, onearg(in)); + do_get_domain_path(conn, in); break; case XS_RESUME: - do_resume(conn, onearg(in)); + do_resume(conn, in); break; case XS_SET_TARGET: @@ -1282,7 +1287,7 @@ static void process_message(struct connection *conn, struct buffered_data *in) break; case XS_RESET_WATCHES: - do_reset_watches(conn); + do_reset_watches(conn, in); break; default: diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h index 3a497f7..5dbf9c8 100644 --- a/tools/xenstore/xenstored_core.h +++ b/tools/xenstore/xenstored_core.h @@ -122,6 +122,9 @@ struct node { char *children; }; +/* Return the only argument in the input. */ +const char *onearg(struct buffered_data *in); + /* Break input into vectors, return the number, fill in up to num of them. */ unsigned int get_strings(struct buffered_data *data, char *vec[], unsigned int num); diff --git a/tools/xenstore/xenstored_domain.c b/tools/xenstore/xenstored_domain.c index 47b4f03..c66539a 100644 --- a/tools/xenstore/xenstored_domain.c +++ b/tools/xenstore/xenstored_domain.c @@ -453,8 +453,9 @@ void do_set_target(struct connection *conn, struct buffered_data *in) } /* domid */ -void do_release(struct connection *conn, const char *domid_str) +void do_release(struct connection *conn, struct buffered_data *in) { + const char *domid_str = onearg(in); struct domain *domain; unsigned int domid; @@ -490,10 +491,11 @@ void do_release(struct connection *conn, const char *domid_str) send_ack(conn, XS_RELEASE); } -void do_resume(struct connection *conn, const char *domid_str) +void do_resume(struct connection *conn, struct buffered_data *in) { struct domain *domain; unsigned int domid; + const char *domid_str = onearg(in); if (!domid_str) { send_error(conn, EINVAL); @@ -527,9 +529,10 @@ void do_resume(struct connection *conn, const char *domid_str) send_ack(conn, XS_RESUME); } -void do_get_domain_path(struct connection *conn, const char *domid_str) +void do_get_domain_path(struct connection *conn, struct buffered_data *in) { char *path; + const char *domid_str = onearg(in); if (!domid_str) { send_error(conn, EINVAL); @@ -543,10 +546,11 @@ void do_get_domain_path(struct connection *conn, const char *domid_str) talloc_free(path); } -void do_is_domain_introduced(struct connection *conn, const char *domid_str) +void do_is_domain_introduced(struct connection *conn, struct buffered_data *in) { int result; unsigned int domid; + const char *domid_str = onearg(in); if (!domid_str) { send_error(conn, EINVAL); @@ -563,7 +567,7 @@ void do_is_domain_introduced(struct connection *conn, const char *domid_str) } /* Allow guest to reset all watches */ -void do_reset_watches(struct connection *conn) +void do_reset_watches(struct connection *conn, struct buffered_data *in) { conn_delete_all_watches(conn); conn_delete_all_transactions(conn); diff --git a/tools/xenstore/xenstored_domain.h b/tools/xenstore/xenstored_domain.h index 83488ed..2554423 100644 --- a/tools/xenstore/xenstored_domain.h +++ b/tools/xenstore/xenstored_domain.h @@ -25,22 +25,22 @@ void handle_event(void); void do_introduce(struct connection *conn, struct buffered_data *in); /* domid */ -void do_is_domain_introduced(struct connection *conn, const char *domid_str); +void do_is_domain_introduced(struct connection *conn, struct buffered_data *in); /* domid */ -void do_release(struct connection *conn, const char *domid_str); +void do_release(struct connection *conn, struct buffered_data *in); /* domid */ -void do_resume(struct connection *conn, const char *domid_str); +void do_resume(struct connection *conn, struct buffered_data *in); /* domid, target */ void do_set_target(struct connection *conn, struct buffered_data *in); /* domid */ -void do_get_domain_path(struct connection *conn, const char *domid_str); +void do_get_domain_path(struct connection *conn, struct buffered_data *in); /* Allow guest to reset all watches */ -void do_reset_watches(struct connection *conn); +void do_reset_watches(struct connection *conn, struct buffered_data *in); void domain_init(void); diff --git a/tools/xenstore/xenstored_transaction.c b/tools/xenstore/xenstored_transaction.c index d0e4739..3cde26e 100644 --- a/tools/xenstore/xenstored_transaction.c +++ b/tools/xenstore/xenstored_transaction.c @@ -184,8 +184,9 @@ void do_transaction_start(struct connection *conn, struct buffered_data *in) send_reply(conn, XS_TRANSACTION_START, id_str, strlen(id_str)+1); } -void do_transaction_end(struct connection *conn, const char *arg) +void do_transaction_end(struct connection *conn, struct buffered_data *in) { + const char *arg = onearg(in); struct changed_node *i; struct changed_domain *d; struct transaction *trans; diff --git a/tools/xenstore/xenstored_transaction.h b/tools/xenstore/xenstored_transaction.h index cfeeae1..0c868ee 100644 --- a/tools/xenstore/xenstored_transaction.h +++ b/tools/xenstore/xenstored_transaction.h @@ -22,7 +22,7 @@ struct transaction; void do_transaction_start(struct connection *conn, struct buffered_data *node); -void do_transaction_end(struct connection *conn, const char *arg); +void do_transaction_end(struct connection *conn, struct buffered_data *in); struct transaction *transaction_lookup(struct connection *conn, uint32_t id);