From patchwork Mon Jul 17 13:06:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 107946 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp4495238qge; Mon, 17 Jul 2017 06:09:32 -0700 (PDT) X-Received: by 10.107.17.19 with SMTP id z19mr21220368ioi.35.1500296972241; Mon, 17 Jul 2017 06:09:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1500296972; cv=none; d=google.com; s=arc-20160816; b=Z753zeKbeGwxnb5Y6Pxc6CHDmiYl3/GtnVO5cQ3J65scC/riLIkHLCrX33bIDKUeux xvofokMMXm8wyGr3HlbfskmGK9jAbQ5bQyFv37RlGYfoZNI4Fsg3UCJzPhCWwgXKlX46 f8UPKzfr1gJfmv6IAjhtreIuZL+Ivi2D4IeN4EzzENZdpcWYAnemotB0Jz5oY4nPsobL XFO/CqgP5agW9GubnIxxvgHY+lg9ZarwVx6kRA79sNTtTKYVjdX+PeGG8AWb2rJNPUm/ 4kJiB/E4IdRxiuPC4u/5ekA8OoISbs3XIxB3TTVHMWJgmh8EqJ7kzlS7EYbJkpO5X4gH eQ1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:cc:references:in-reply-to:message-id:date:to :from:dkim-signature:arc-authentication-results; bh=f+WzRQ5K2Rj4DxXeNa8tVzBYuRVZC/VEyjGd7RSB54U=; b=GR8qsQ81za5WTFJd+8KAW/YY1f2WXLWC9Nds7HEqkShJZzSzDvsC1UWROwZCzwYd09 o+/D751V67DfOUYwEt1sm7purQVmtsvQig002gxanMKLmoTMDbwI2nRigqbIUzkREEgy x1Usy5UQL4WS+AFYScfrWUodKmg0z5Nzwpmf8A/lbZsHokXbdte6/Q4N1XzulvdBgPY0 BnpZrGvM3Ln+6lDxEz+g7x96vi2z42XzNlDM3CI7dFh+oq3ZbwTGiddKhduB1ANtU63S ACVGbqGeB7Wd+FCKufSSibMfl97Lq80ofqZ3n6jLKil32cwRbz5DPgErbEXWMBYiLoRk kRRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.b=WXvdsxS6; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id n15si5615159iti.0.2017.07.17.06.09.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 06:09:32 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.b=WXvdsxS6; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dX5kw-00054Z-2W; Mon, 17 Jul 2017 13:08:10 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dX5kv-00052t-LN for xen-devel@lists.xenproject.org; Mon, 17 Jul 2017 13:08:09 +0000 Received: from [85.158.139.211] by server-10.bemta-5.messagelabs.com id 82/8D-01732-8B6BC695; Mon, 17 Jul 2017 13:08:08 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGIsWRWlGSWpSXmKPExsXiVRusq7t9W06 kwdOLAhbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8bbl1NZC5Z5V7x98Y2pgbHLrouRi0NIYAaj xIGWhewgDovAPGaJzX17mUEcCYF+Vok7X64BZTiBnDSJ1V8nMkLYZRKdD06ygNhCAloSR0/NZ oUY1cokce71WaAGDg42AROJWR0SIDUiAkoS91ZNZgKpYRaYzyjRNKmXDSQhLBAl0Xd6ETNIPY uAqkTLWUOQMK+Aj8Syw/uYIHbJSdw818kMYnMCxc9sWM0Esddb4uaRiUwTGAUWMDKsYtQoTi0 qSy3SNbLUSyrKTM8oyU3MzNE1NDDVy00tLk5MT81JTCrWS87P3cQIDK16BgbGHYyXt/gdYpTk YFIS5b3Ilh0pxJeUn1KZkVicEV9UmpNafIhRhoNDSYLXfWtOpJBgUWp6akVaZg4wyGHSEhw8S iK81SBp3uKCxNzizHSI1ClGY45JB7Z/YeJ4NeH/NyYhlrz8vFQpcV49kFIBkNKM0jy4QbDou8 QoKyXMy8jAwCDEU5BalJtZgir/ilGcg1FJmDcTZApPZl4J3L5XQKcwAZ0i7At2SkkiQkqqgVH vd9iiJ4vm+79xfpXEFvM8WbGaTfdJ8Az7hNiuX+sNNk/Wmy3ccU17Ymd2Oc/vEy/UKiM0/NYn 223eI3/X8ckdPse0hgS3yHeHj0k69SbcsDs9Ve1ZcsSduoNLBHoN6xannvwyS3O/dupk6cmBT +/M7be8qjb7xvzq9Lq3d2bMCJL05tn3rFmJpTgj0VCLuag4EQA0FjswuQIAAA== X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-16.tower-206.messagelabs.com!1500296885!87352218!1 X-Originating-IP: [74.125.83.45] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 40267 invoked from network); 17 Jul 2017 13:08:06 -0000 Received: from mail-pg0-f45.google.com (HELO mail-pg0-f45.google.com) (74.125.83.45) by server-16.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 17 Jul 2017 13:08:06 -0000 Received: by mail-pg0-f45.google.com with SMTP id k14so79616263pgr.0 for ; Mon, 17 Jul 2017 06:08:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bLlwdLZyhIA8r8opV3rmI2mAwTLjPhffokI3TyD1a+8=; b=WXvdsxS6MpnBlDCPirkQSfsUZ3BCq0FWi/3X+htjeU/U5L6lviNI/3gV0e85hCG4D6 iwuQhIZM2ScMwec/BI5ZDFSf4Lm1THtG0kUKReHIWgX+Njk+4ZpwyRyGB5MaDXQ6/oBR 3vmiXyI4jbRTvzjdsztACyfDxL448IST6OAMY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bLlwdLZyhIA8r8opV3rmI2mAwTLjPhffokI3TyD1a+8=; b=PSookro3FWh+VZXG2sfew66h9LLOtM8aUSG+6YtxAmxGnm1Ep1AMALD2bpYA4mEBHB MojdHwxt8spfG68cZbonNr43Fbo6AWNSEMYvDKojMi/zyN4e7gZvsbmowlG9SDRMxpaT gXgJMjddUJ50TqM5WjCrwSwEudUAjZLPUOlmTHriHexyq9v0ySk83iulZFGPepBC96Y8 azn+qfKW8XWMYiLaZRAEr3VUNLrYgvHIICqiyE4G286WW9lUtmUHbiGaFviwPaoKf3ef BdVJKDNvwfHMH2LOTONfaiU+mw5N+AGCySwznF8Kvtzb9e86uSW6h6jGZYQt+Iri2Dxg ZP8g== X-Gm-Message-State: AIVw110b2DOWxK2GGOzeR2lgU2E6A4XyAJvvBArOBuNprxXAU4DvluBz 9u+f5D3kK8C7lQwwu1LYXg== X-Received: by 10.84.229.1 with SMTP id b1mr595529plk.273.1500296885217; Mon, 17 Jul 2017 06:08:05 -0700 (PDT) Received: from blr-ubuntu-linaro.wlan.qualcomm.com ([103.5.19.18]) by smtp.gmail.com with ESMTPSA id z69sm15705665pgz.42.2017.07.17.06.08.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 17 Jul 2017 06:08:04 -0700 (PDT) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Mon, 17 Jul 2017 18:36:51 +0530 Message-Id: <1500296815-10243-22-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1500296815-10243-1-git-send-email-bhupinder.thakur@linaro.org> References: <1500296815-10243-1-git-send-email-bhupinder.thakur@linaro.org> Cc: Wei Liu , Julien Grall , Stefano Stabellini , Ian Jackson Subject: [Xen-devel] [PATCH 21/25 v6] xen/arm: vpl011: Add support for multiple consoles in xenconsole 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" This patch adds the support for multiple consoles and introduces the iterator functions to operate on multiple consoles. This patch is in preparation to support a new vuart console. Signed-off-by: Bhupinder Thakur --- CC: Ian Jackson CC: Wei Liu CC: Stefano Stabellini CC: Julien Grall Changes since v5: - Split this patch in multiple smaller patches. Changes since v4: - Changes to make event channel handling per console rather than per domain. Changes since v3: - The changes in xenconsole have been split into four patches. This is the third patch. tools/console/daemon/io.c | 174 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 134 insertions(+), 40 deletions(-) diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index 54c91aa..49f085c 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -90,12 +90,14 @@ struct buffer { }; struct console { + const char *const ttyname; int master_fd; int master_pollfd_idx; int slave_fd; int log_fd; struct buffer buffer; - char *xspath; + const char *const xspath; + const char *const log_suffix; int ring_ref; xenevtchn_handle *xce_handle; int xce_pollfd_idx; @@ -107,21 +109,112 @@ struct console { struct domain *d; }; +struct console_data { + const char *const xsname; + const char *const ttyname; + const char *const log_suffix; +}; + +static struct console_data console_data[] = { + { + .xsname = "/console", + .ttyname = "tty", + .log_suffix = "", + }, +}; + +#define MAX_CONSOLE (sizeof(console_data)/sizeof(struct console_data)) + struct domain { int domid; bool is_dead; unsigned last_seen; struct domain *next; - struct console console; + struct console console[MAX_CONSOLE]; }; static struct domain *dom_head; +typedef void (*VOID_ITER_FUNC_ARG1)(struct console *); +typedef bool (*BOOL_ITER_FUNC_ARG1)(struct console *); +typedef int (*INT_ITER_FUNC_ARG1)(struct console *); +typedef void (*VOID_ITER_FUNC_ARG2)(struct console *, void *); +typedef int (*INT_ITER_FUNC_ARG3)(struct console *, + struct domain *dom, void **); + static inline bool console_enabled(struct console *con) { return con->local_port != -1; } +static inline void console_iter_void_arg1(struct domain *d, + VOID_ITER_FUNC_ARG1 iter_func) +{ + int i = 0; + struct console *con = &d->console[0]; + + for (i = 0; i < MAX_CONSOLE; i++, con++) + { + iter_func(con); + } +} + +static inline void console_iter_void_arg2(struct domain *d, + VOID_ITER_FUNC_ARG2 iter_func, + void *iter_data) +{ + int i = 0; + struct console *con = &d->console[0]; + + for (i = 0; i < MAX_CONSOLE; i++, con++) + { + iter_func(con, iter_data); + } +} + +static inline bool console_iter_bool_arg1(struct domain *d, + BOOL_ITER_FUNC_ARG1 iter_func) +{ + int i = 0; + struct console *con = &d->console[0]; + + for (i = 0; i < MAX_CONSOLE; i++, con++) + { + if (iter_func(con)) + return true; + } + return false; +} + +static inline int console_iter_int_arg1(struct domain *d, + INT_ITER_FUNC_ARG1 iter_func) +{ + int i = 0; + struct console *con = &d->console[0]; + + for (i = 0; i < MAX_CONSOLE; i++, con++) + { + if (iter_func(con)) + return 1; + } + return 0; +} + +static inline int console_iter_int_arg3(struct domain *d, + INT_ITER_FUNC_ARG3 iter_func, + void **iter_data) +{ + int i = 0; + struct console *con = &d->console[0]; + + for (i = 0; i < MAX_CONSOLE; i++, con++) + { + if (iter_func(con, d, iter_data)) + return 1; + } + return 0; +} + static int write_all(int fd, const char* buf, size_t len) { while (len) { @@ -336,7 +429,7 @@ static int create_console_log(struct console *con) return -1; } - snprintf(logfile, PATH_MAX-1, "%s/guest-%s.log", log_dir, data); + snprintf(logfile, PATH_MAX-1, "%s/guest-%s%s.log", log_dir, data, con->log_suffix); free(data); logfile[PATH_MAX-1] = '\0'; @@ -488,7 +581,7 @@ static int console_create_tty(struct console *con) } free(path); - success = (asprintf(&path, "%s/tty", con->xspath) != -1); + success = (asprintf(&path, "%s/%s", con->xspath, con->ttyname) != -1); if (!success) goto out; success = xs_write(xs, XBT_NULL, path, slave, strlen(slave)); @@ -654,13 +747,13 @@ static bool watch_domain(struct domain *dom, bool watch) { char domid_str[3 + MAX_STRLEN(dom->domid)]; bool success; - struct console *con = &dom->console; + struct console *con = &dom->console[0]; snprintf(domid_str, sizeof(domid_str), "dom%u", dom->domid); if (watch) { success = xs_watch(xs, con->xspath, domid_str); if (success) - console_create_ring(con); + console_iter_int_arg1(dom, console_create_ring); else xs_unwatch(xs, con->xspath, domid_str); } else { @@ -670,15 +763,18 @@ static bool watch_domain(struct domain *dom, bool watch) return success; } -static int console_init(struct console *con, struct domain *dom) +static int console_init(struct console *con, struct domain *dom, void **data) { char *s; + int err = -1; struct timespec ts; + struct console_data **con_data = (struct console_data **)data; + char *xsname, *xspath; if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) { dolog(LOG_ERR, "Cannot get time of day %s:%s:L%d", __FILE__, __FUNCTION__, __LINE__); - return NULL; + return err; } con->master_fd = -1; @@ -691,30 +787,37 @@ static int console_init(struct console *con, struct domain *dom) con->xce_pollfd_idx = -1; con->next_period = ((long long)ts.tv_sec * 1000) + (ts.tv_nsec / 1000000) + RATE_LIMIT_PERIOD; con->d = dom; - con->xspath = xs_get_domain_path(xs, dom->domid); - s = realloc(con->xspath, strlen(con->xspath) + - strlen("/console") + 1); + *(char **)&con->ttyname = (char *)(*con_data)->ttyname; + *(char **)&con->log_suffix = (char *)(*con_data)->log_suffix; + con->optional = (*con_data)->optional; + con->prefer_gnttab = (*con_data)->prefer_gnttab; + xsname = (char *)(*con_data)->xsname; + xspath = xs_get_domain_path(xs, dom->domid); + s = realloc(xspath, strlen(xspath) + + strlen(xsname) + 1); if (s) { - con->xspath = s; - strcat(con->xspath, "/console"); + xspath = s; + strcat(xspath, xsname); + *(char **)&con->xspath = xspath; err = 0; } + (*con_data)++; + return err; } static void console_free(struct console *con) { if (con->xspath) - free(con->xspath); + free((char *)con->xspath); } static struct domain *create_domain(int domid) { struct domain *dom; - char *s; - struct console *con; + struct console_data *con_data = &console_data[0]; dom = calloc(1, sizeof *dom); if (dom == NULL) { @@ -724,9 +827,8 @@ static struct domain *create_domain(int domid) } dom->domid = domid; - con = &dom->console; - if (console_init(con, dom)) + if (console_iter_int_arg3(dom, console_init, (void **)&con_data)) goto out; if (!watch_domain(dom, true)) @@ -739,7 +841,7 @@ static struct domain *create_domain(int domid) return dom; out: - console_free(con); + console_iter_void_arg1(dom, console_free); free(dom); return NULL; } @@ -784,18 +886,16 @@ static void console_cleanup(struct console *con) if (con->xspath) { - free(con->xspath); - con->xspath = NULL; + free((char *)con->xspath); + *(char **)&con->xspath = (char *)NULL; } } static void cleanup_domain(struct domain *d) { - struct console *con = &d->console; - - console_close_tty(con); + console_iter_void_arg1(d, console_close_tty); - console_cleanup(con); + console_iter_void_arg1(d, console_cleanup); remove_domain(d); } @@ -810,12 +910,10 @@ static void console_close_evtchn(struct console *con) static void shutdown_domain(struct domain *d) { - struct console *con = &d->console; - d->is_dead = true; watch_domain(d, false); - console_unmap_interface(con); - console_close_evtchn(con); + console_iter_void_arg1(d, console_unmap_interface); + console_iter_void_arg1(d, console_close_evtchn); } static unsigned enum_pass = 0; @@ -1011,7 +1109,7 @@ static void handle_xs(void) /* We may get watches firing for domains that have recently been removed, so dom may be NULL here. */ if (dom && dom->is_dead == false) - console_create_ring(&dom->console); + console_iter_int_arg1(dom, console_create_ring); } free(vec); @@ -1067,9 +1165,7 @@ static void handle_log_reload(void) if (log_guest) { struct domain *d; for (d = dom_head; d; d = d->next) { - struct console *con = &d->console; - - console_open_log(con); + console_iter_void_arg1(d, console_open_log); } } @@ -1233,13 +1329,12 @@ void handle_io(void) /* Re-calculate any event counter allowances & unblock domains with new allowance */ for (d = dom_head; d; d = d->next) { - struct console *con = &d->console; - console_evtchn_unmask(con, (void *)now); + console_iter_void_arg2(d, console_evtchn_unmask, (void *)now); - add_console_evtchn_fd(con, (void *)&next_timeout); + console_iter_void_arg2(d, add_console_evtchn_fd, (void *)&next_timeout); - add_console_tty_fd(con); + console_iter_void_arg1(d, add_console_tty_fd); } /* If any domain has been rate limited, we need to work @@ -1300,13 +1395,12 @@ void handle_io(void) } for (d = dom_head; d; d = n) { - struct console *con = &d->console; n = d->next; - handle_console_ring(con); + console_iter_void_arg1(d, handle_console_ring); - handle_console_tty(con); + console_iter_void_arg1(d, handle_console_tty); if (d->last_seen != enum_pass) shutdown_domain(d);