From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Scott <dave.scott@citrix.com>
Cc: xen-devel@lists.xenproject.org, stefano.stabellini@eu.citrix.com,
ian.jackson@eu.citrix.com, wei.liu2@citrix.com,
ian.campbell@citrix.com
Subject: Re: [PATCH v6 for-4.5 5/5] xl: add support for 'channels'
Date: Thu, 25 Sep 2014 15:11:02 -0400 [thread overview]
Message-ID: <20140925191102.GE29663@laptop.dumpdata.com> (raw)
In-Reply-To: <1411591685-25308-6-git-send-email-dave.scott@citrix.com>
On Wed, Sep 24, 2014 at 09:48:05PM +0100, David Scott wrote:
> This adds support for channel declarations of the form:
>
> channel = [ "name=...,connection=...[,path=...][,backend=...]" ]
>
> where 'name' is a label to identify the channel to the frontend.
>
> If 'connection = pty' then the channel is connected to a pty in the
> backend domain
> If 'connection = socket' then the channel is connected to a Unix domain
> socket given by 'path = ...' in the backend domain.
>
> This patch also adds the command:
>
> xl channel-list <domain>
>
> which allows the state of channels to be queried. In particular if
> 'connection=pty' this will show the path of the pty slave device.
>
> Signed-off-by: David Scott <dave.scott@citrix.com>
> ---
> docs/man/xl.cfg.pod.5 | 53 +++++++++++++++++++
> docs/man/xl.pod.1 | 10 ++++
> tools/libxl/xl.h | 1 +
> tools/libxl/xl_cmdimpl.c | 129 ++++++++++++++++++++++++++++++++++++++++++---
> tools/libxl/xl_cmdtable.c | 5 ++
> 5 files changed, 190 insertions(+), 8 deletions(-)
>
> diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
> index 517ae2f..6626323 100644
> --- a/docs/man/xl.cfg.pod.5
> +++ b/docs/man/xl.cfg.pod.5
> @@ -530,6 +530,59 @@ L<qemu(1)> manpage. The default is B<en-us>.
>
> =back
>
> +=item B<channel=[ "CHANNEL_SPEC_STRING", "CHANNEL_SPEC_STRING", ...]>
> +
> +Specifies the virtual channels to be provided to the guest. A
> +channel is a low-bandwidth, bidirectional byte stream, which resembles
> +a serial link. Typical uses for channels include transmitting VM
> +configuration after boot and signalling to in-guest agents. Please see
> +F<docs/misc/channels.txt> for more details.
> +
> +Each B<CHANNEL_SPEC_STRING> is a comma-separated list of C<KEY=VALUE>
> +seettings. Leading and trailing whitespace is ignored in both KEY and
> +VALUE. Neither KEY nor VALUE may contain ',', '=' or '"'. Defined values
> +are:
> +
> +=over 4
> +
> +=item C<backend=DOMAIN>
> +
> +Specify the backend domain name or id. This parameter is optional. If
> +this parameter is omitted then the toolstack domain will be assumed.
> +
> +=item C<name=NAME>
> +
> +Specify the string name for this device. This parameter is mandatory.
> +This should be a well-known name for the specific application (e.g.
> +guest agent) and should be used by the frontend to connect the
> +application to the right channel device. There is no formal registry
> +of channel names, so application authors are encouraged to make their
> +names unique by including domain name and version number in the string
> +(e.g. org.mydomain.guestagent.1).
> +
> +=item C<connection=CONNECTION>
> +
> +Specify how the backend will be implemented. This following options are
> +available:
> +
> +=over 4
> +
> +=item B<connection=SOCKET>:
> +
> +The backend will bind a Unix domain socket (at the path given by
> +B<path=PATH>), call listen and accept connections. The backend will proxy
> +data between the channel and the connected socket.
> +
> +=item B<connection=PTY>:
> +
> +The backend will create a pty and proxy data between the channel and the
> +master device. The command B<xl channel-list> can be used to discover the
> +assigned slave device.
> +
> +=back
> +
> +=back
> +
> =item B<pci=[ "PCI_SPEC_STRING", "PCI_SPEC_STRING", ... ]>
>
> Specifies the host PCI devices to passthrough to this guest. Each B<PCI_SPEC_STRING>
> diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
> index f1e95db..35aa3a4 100644
> --- a/docs/man/xl.pod.1
> +++ b/docs/man/xl.pod.1
> @@ -1215,6 +1215,16 @@ List virtual network interfaces for a domain.
>
> =back
>
> +=head2 CHANNEL DEVICES
> +
> +=over 4
> +
> +=item B<channel-list> I<domain-id>
> +
> +List virtual channel interfaces for a domain.
> +
> +=back
> +
> =head2 VTPM DEVICES
>
> =over 4
> diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
> index 10a2e66..afc5f8b 100644
> --- a/tools/libxl/xl.h
> +++ b/tools/libxl/xl.h
> @@ -78,6 +78,7 @@ int main_top(int argc, char **argv);
> int main_networkattach(int argc, char **argv);
> int main_networklist(int argc, char **argv);
> int main_networkdetach(int argc, char **argv);
> +int main_channellist(int argc, char **argv);
> int main_blockattach(int argc, char **argv);
> int main_blocklist(int argc, char **argv);
> int main_blockdetach(int argc, char **argv);
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index d6f311f..89a8697 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -530,7 +530,7 @@ static void split_string_into_string_list(const char *str,
>
> s = strdup(str);
> if (s == NULL) {
> - fprintf(stderr, "unable to allocate memory to parse bootloader args\n");
> + fprintf(stderr, "unable to allocate memory to split string\n");
> exit(-1);
> }
>
> @@ -546,7 +546,7 @@ static void split_string_into_string_list(const char *str,
>
> sl = malloc((nr+1) * sizeof (char *));
> if (sl == NULL) {
> - fprintf(stderr, "unable to allocate memory for bootloader args\n");
> + fprintf(stderr, "unable to allocate memory to split string\n");
> exit(-1);
> }
>
> @@ -567,7 +567,6 @@ static void split_string_into_string_list(const char *str,
> and look for CTYPE in libxl_internal.h */
> typedef int (*char_predicate_t)(const int c);
>
> -static void trim(char_predicate_t predicate, const char *input, char **output) __attribute__ ((unused));
> static void trim(char_predicate_t predicate, const char *input, char **output)
> {
> char *p, *q, *tmp;
> @@ -593,10 +592,6 @@ static void trim(char_predicate_t predicate, const char *input, char **output)
> static int split_string_into_pair(const char *str,
> const char *delim,
> char **a,
> - char **b) __attribute__ ((unused));
> -static int split_string_into_pair(const char *str,
> - const char *delim,
> - char **a,
> char **b)
> {
> char *s, *p, *saveptr, *aa = NULL, *bb = NULL;
> @@ -891,7 +886,7 @@ static void parse_config_data(const char *config_source,
> long l;
> XLU_Config *config;
> XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms;
> - XLU_ConfigList *ioports, *irqs, *iomem;
> + XLU_ConfigList *channels, *ioports, *irqs, *iomem;
> int num_ioports, num_irqs, num_iomem, num_cpus;
> int pci_power_mgmt = 0;
> int pci_msitranslate = 0;
> @@ -1376,6 +1371,79 @@ static void parse_config_data(const char *config_source,
> }
> }
>
> + if (!xlu_cfg_get_list (config, "channel", &channels, 0, 0)) {
> + d_config->num_channels = 0;
> + d_config->channels = NULL;
> + while ((buf = xlu_cfg_get_listitem (channels,
> + d_config->num_channels)) != NULL) {
> + libxl_device_channel *chn;
> + libxl_string_list pairs;
> + char *path = NULL;
> + int len;
> +
> + chn = ARRAY_EXTEND_INIT(d_config->channels, d_config->num_channels,
> + libxl_device_channel_init);
> +
> + split_string_into_string_list(buf, ",", &pairs);
> + len = libxl_string_list_length(&pairs);
> + for (i = 0; i < len; i++) {
> + char *key, *key_untrimmed, *value, *value_untrimmed;
> + int rc;
> + rc = split_string_into_pair(pairs[i], "=",
> + &key_untrimmed,
> + &value_untrimmed);
> + if (rc != 0) {
> + fprintf(stderr, "failed to parse channel configuration: %s",
> + pairs[i]);
> + exit(1);
> + }
> + trim(isspace, key_untrimmed, &key);
> + trim(isspace, value_untrimmed, &value);
> +
> + if (!strcmp(key, "backend")) {
> + replace_string(&chn->backend_domname, value);
> + } else if (!strcmp(key, "name")) {
> + replace_string(&chn->name, value);
> + } else if (!strcmp(key, "path")) {
> + replace_string(&path, value);
> + } else if (!strcmp(key, "connection")) {
> + if (!strcmp(value, "pty")) {
> + chn->connection = LIBXL_CHANNEL_CONNECTION_PTY;
> + } else if (!strcmp(value, "socket")) {
> + chn->connection = LIBXL_CHANNEL_CONNECTION_SOCKET;
> + } else {
> + fprintf(stderr, "unknown channel connection '%s'\n",
> + value);
> + exit(1);
> + }
> + } else {
> + fprintf(stderr, "unknown channel parameter '%s',"
> + " ignoring\n", key);
> + }
> + free(key);
> + free(key_untrimmed);
> + free(value);
> + free(value_untrimmed);
> + }
> + switch (chn->connection){
Your editor ate a space.
> + case LIBXL_CHANNEL_CONNECTION_UNKNOWN:
> + fprintf(stderr, "channel has unknown 'connection'\n");
> + exit(1);
> + case LIBXL_CHANNEL_CONNECTION_SOCKET:
> + if (!path) {
> + fprintf(stderr, "channel connection 'socket' requires path=..\n");
> + exit(1);
> + }
> + chn->u.socket.path = xstrdup(path);
> + break;
> + default:
> + break;
> + }
> + libxl_string_list_dispose(&pairs);
> + free(path);
> + }
> + }
> +
> if (!xlu_cfg_get_list (config, "vif", &nics, 0, 0)) {
> d_config->num_nics = 0;
> d_config->nics = NULL;
> @@ -6045,6 +6113,51 @@ int main_networkdetach(int argc, char **argv)
> return 0;
> }
>
> +int main_channellist(int argc, char **argv)
> +{
> + int opt;
> + libxl_device_channel *channels;
> + libxl_channelinfo channelinfo;
> + int nb, i;
> +
> + SWITCH_FOREACH_OPT(opt, "", NULL, "channel-list", 1) {
> + /* No options */
> + }
> +
> + /* Idx BE state evt-ch ring-ref connection params*/
> + printf("%-3s %-2s %-5s %-6s %8s %-10s %-30s\n",
> + "Idx", "BE", "state", "evt-ch", "ring-ref", "connection", "");
> + for (argv += optind, argc -= optind; argc > 0; --argc, ++argv) {
> + uint32_t domid = find_domain(*argv);
> + channels = libxl_device_channel_list(ctx, domid, &nb);
> + if (!channels) {
> + continue;
> + }
I think you can drop the '{}'.
> + for (i = 0; i < nb; ++i) {
> + if (!libxl_device_channel_getinfo(ctx, domid, &channels[i],
> + &channelinfo)) {
> + printf("%-3d %-2d ", channels[i].devid, channelinfo.backend_id);
> + printf("%-5d ", channelinfo.state);
> + printf("%-6d %-8d ", channelinfo.evtch, channelinfo.rref);
> + printf("%-10s ", libxl_channel_connection_to_string(
> + channels[i].connection));
> + switch (channels[i].connection) {
> + case LIBXL_CHANNEL_CONNECTION_PTY:
> + printf("%-30s ", channelinfo.u.pty.path);
> + break;
> + default:
> + break;
> + }
> + printf("\n");
> + libxl_channelinfo_dispose(&channelinfo);
> + }
> + libxl_device_channel_dispose(&channels[i]);
> + }
> + free(channels);
> + }
> + return 0;
> +}
> +
> int main_blockattach(int argc, char **argv)
> {
> int opt;
> diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
> index 35f02c4..a6df234 100644
> --- a/tools/libxl/xl_cmdtable.c
> +++ b/tools/libxl/xl_cmdtable.c
> @@ -337,6 +337,11 @@ struct cmd_spec cmd_table[] = {
> "Destroy a domain's virtual network device",
> "<Domain> <DevId|mac>",
> },
> + { "channel-list",
> + &main_channellist, 0, 0,
> + "List virtual channel devices for a domain",
> + "<Domain(s)>",
> + },
> { "block-attach",
> &main_blockattach, 1, 1,
> "Create a new virtual block device",
> --
> 1.7.10.4
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2014-09-25 19:11 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-24 20:48 xl, libxl: add support for 'channels' David Scott
2014-09-24 20:48 ` [PATCH v6 for-4.5 1/5] " David Scott
2014-09-25 18:56 ` Konrad Rzeszutek Wilk
2014-09-26 9:12 ` Wei Liu
2014-09-24 20:48 ` [PATCH v6 for-4.5 2/5] xl: move 'replace_string' further up the file David Scott
2014-09-25 19:06 ` Konrad Rzeszutek Wilk
2014-09-26 9:15 ` Wei Liu
2014-09-24 20:48 ` [PATCH v6 for-4.5 3/5] xl: add 'xstrdup' next to 'xrealloc' David Scott
2014-09-25 19:06 ` Konrad Rzeszutek Wilk
2014-09-26 9:22 ` Wei Liu
2014-09-24 20:48 ` [PATCH v6 for-4.5 4/5] xl: add 'trim' and 'split_string_into_pair' functions David Scott
2014-09-25 19:06 ` Konrad Rzeszutek Wilk
2014-09-26 10:09 ` Wei Liu
2014-09-26 15:45 ` Ian Jackson
2014-09-26 15:51 ` Wei Liu
2014-09-26 15:53 ` Ian Jackson
2014-09-24 20:48 ` [PATCH v6 for-4.5 5/5] xl: add support for 'channels' David Scott
2014-09-25 19:11 ` Konrad Rzeszutek Wilk [this message]
2014-09-26 10:22 ` Wei Liu
2014-09-25 19:13 ` xl, libxl: " Konrad Rzeszutek Wilk
2014-09-25 19:37 ` Dave Scott
2014-09-26 15:14 ` Ian Jackson
2014-09-26 19:20 ` Konrad Rzeszutek Wilk
2014-10-07 16:52 ` Dave Scott
2014-10-07 16:59 ` Konrad Rzeszutek Wilk
2014-10-08 11:06 ` Stefano Stabellini
2014-10-08 13:26 ` Ian Campbell
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=20140925191102.GE29663@laptop.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=dave.scott@citrix.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).