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 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.