* [PATCH] tools/xl: Allow callers of `xl info` to select specific information
@ 2016-06-30 16:40 Andrew Cooper
2016-07-07 11:52 ` Wei Liu
0 siblings, 1 reply; 2+ messages in thread
From: Andrew Cooper @ 2016-06-30 16:40 UTC (permalink / raw)
To: Xen-devel; +Cc: Andrew Cooper, Ian Jackson, Wei Liu
When scripting, it is much more convenient to use:
[root@fusebot ~]# xl info xen_version
4.8-unstable
than to construct some sed/awk/other to parse:
[root@fusebot ~]# xl info
...
xen_version : 4.8-unstable
...
This works by wrapping all printf() calls in main_info() with maybe_printf(),
which formats its arguments, compares the resulting string to the provided
restriction, and discards it if no match is found.
A restriction like this doesn't make sense in combination with --numa, so is
excluded in that case.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
Embarrassingly, this has been kicking around in the XenServer patch queue since
Xen 4.4. It is high time it got sent upstream.
This patch is far more easily reviewed with `git diff --color-words`
---
tools/libxl/xl_cmdimpl.c | 118 +++++++++++++++++++++++++++++++----------------
1 file changed, 77 insertions(+), 41 deletions(-)
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 6459eec..d1fcfa4 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -5928,6 +5928,33 @@ int main_vcpuset(int argc, char **argv)
return EXIT_SUCCESS;
}
+/* Possibly select a specific piece of `xl info` to print. */
+static const char *info_name;
+static int maybe_printf(const char *fmt, ...) __attribute__((format(printf,1,2)));
+static int maybe_printf(const char *fmt, ...)
+{
+ va_list ap;
+ char *str;
+ int count = 0;
+
+ va_start(ap, fmt);
+ if (vasprintf(&str, fmt, ap) != -1) {
+ if (info_name) {
+ char *s;
+
+ if (!strncmp(str, info_name, strlen(info_name)) &&
+ (s = strchr(str, ':')) && s[1] == ' ')
+ count = fputs(&s[2], stdout);
+ } else
+ count = fputs(str, stdout);
+
+ free(str);
+ }
+ va_end(ap);
+
+ return count;
+}
+
static void output_xeninfo(void)
{
const libxl_version_info *info;
@@ -5946,22 +5973,22 @@ static void output_xeninfo(void)
}
sched = rc;
- printf("xen_major : %d\n", info->xen_version_major);
- printf("xen_minor : %d\n", info->xen_version_minor);
- printf("xen_extra : %s\n", info->xen_version_extra);
- printf("xen_version : %d.%d%s\n", info->xen_version_major,
+ maybe_printf("xen_major : %d\n", info->xen_version_major);
+ maybe_printf("xen_minor : %d\n", info->xen_version_minor);
+ maybe_printf("xen_extra : %s\n", info->xen_version_extra);
+ maybe_printf("xen_version : %d.%d%s\n", info->xen_version_major,
info->xen_version_minor, info->xen_version_extra);
- printf("xen_caps : %s\n", info->capabilities);
- printf("xen_scheduler : %s\n", libxl_scheduler_to_string(sched));
- printf("xen_pagesize : %u\n", info->pagesize);
- printf("platform_params : virt_start=0x%"PRIx64"\n", info->virt_start);
- printf("xen_changeset : %s\n", info->changeset);
- printf("xen_commandline : %s\n", info->commandline);
- printf("cc_compiler : %s\n", info->compiler);
- printf("cc_compile_by : %s\n", info->compile_by);
- printf("cc_compile_domain : %s\n", info->compile_domain);
- printf("cc_compile_date : %s\n", info->compile_date);
- printf("build_id : %s\n", info->build_id);
+ maybe_printf("xen_caps : %s\n", info->capabilities);
+ maybe_printf("xen_scheduler : %s\n", libxl_scheduler_to_string(sched));
+ maybe_printf("xen_pagesize : %u\n", info->pagesize);
+ maybe_printf("platform_params : virt_start=0x%"PRIx64"\n", info->virt_start);
+ maybe_printf("xen_changeset : %s\n", info->changeset);
+ maybe_printf("xen_commandline : %s\n", info->commandline);
+ maybe_printf("cc_compiler : %s\n", info->compiler);
+ maybe_printf("cc_compile_by : %s\n", info->compile_by);
+ maybe_printf("cc_compile_domain : %s\n", info->compile_domain);
+ maybe_printf("cc_compile_date : %s\n", info->compile_date);
+ maybe_printf("build_id : %s\n", info->build_id);
return;
}
@@ -5973,10 +6000,10 @@ static void output_nodeinfo(void)
if (uname(&utsbuf) < 0)
return;
- printf("host : %s\n", utsbuf.nodename);
- printf("release : %s\n", utsbuf.release);
- printf("version : %s\n", utsbuf.version);
- printf("machine : %s\n", utsbuf.machine);
+ maybe_printf("host : %s\n", utsbuf.nodename);
+ maybe_printf("release : %s\n", utsbuf.release);
+ maybe_printf("version : %s\n", utsbuf.version);
+ maybe_printf("machine : %s\n", utsbuf.machine);
}
static void output_physinfo(void)
@@ -5991,35 +6018,37 @@ static void output_physinfo(void)
fprintf(stderr, "libxl_physinfo failed.\n");
return;
}
- printf("nr_cpus : %d\n", info.nr_cpus);
- printf("max_cpu_id : %d\n", info.max_cpu_id);
- printf("nr_nodes : %d\n", info.nr_nodes);
- printf("cores_per_socket : %d\n", info.cores_per_socket);
- printf("threads_per_core : %d\n", info.threads_per_core);
- printf("cpu_mhz : %d\n", info.cpu_khz / 1000);
- printf("hw_caps : ");
- for (i = 0; i < 8; i++)
- printf("%08x%c", info.hw_cap[i], i < 7 ? ':' : '\n');
- printf("virt_caps :");
- if (info.cap_hvm)
- printf(" hvm");
- if (info.cap_hvm_directio)
- printf(" hvm_directio");
- printf("\n");
+ maybe_printf("nr_cpus : %d\n", info.nr_cpus);
+ maybe_printf("max_cpu_id : %d\n", info.max_cpu_id);
+ maybe_printf("nr_nodes : %d\n", info.nr_nodes);
+ maybe_printf("cores_per_socket : %d\n", info.cores_per_socket);
+ maybe_printf("threads_per_core : %d\n", info.threads_per_core);
+ maybe_printf("cpu_mhz : %d\n", info.cpu_khz / 1000);
+
+ maybe_printf("hw_caps : %08x:%08x:%08x:%08x:%08x:%08x:%08x:%08x\n",
+ info.hw_cap[0], info.hw_cap[1], info.hw_cap[2], info.hw_cap[3],
+ info.hw_cap[4], info.hw_cap[5], info.hw_cap[6], info.hw_cap[7]
+ );
+
+ maybe_printf("virt_caps :%s%s\n",
+ info.cap_hvm ? " hvm" : "",
+ info.cap_hvm_directio ? " hvm_directio" : ""
+ );
+
vinfo = libxl_get_version_info(ctx);
if (vinfo) {
i = (1 << 20) / vinfo->pagesize;
- printf("total_memory : %"PRIu64"\n", info.total_pages / i);
- printf("free_memory : %"PRIu64"\n", (info.free_pages - info.outstanding_pages) / i);
- printf("sharing_freed_memory : %"PRIu64"\n", info.sharing_freed_pages / i);
- printf("sharing_used_memory : %"PRIu64"\n", info.sharing_used_frames / i);
- printf("outstanding_claims : %"PRIu64"\n", info.outstanding_pages / i);
+ maybe_printf("total_memory : %"PRIu64"\n", info.total_pages / i);
+ maybe_printf("free_memory : %"PRIu64"\n", (info.free_pages - info.outstanding_pages) / i);
+ maybe_printf("sharing_freed_memory : %"PRIu64"\n", info.sharing_freed_pages / i);
+ maybe_printf("sharing_used_memory : %"PRIu64"\n", info.sharing_used_frames / i);
+ maybe_printf("outstanding_claims : %"PRIu64"\n", info.outstanding_pages / i);
}
if (!libxl_get_freecpus(ctx, &cpumap)) {
libxl_for_each_bit(i, cpumap)
if (libxl_bitmap_test(&cpumap, i))
n++;
- printf("free_cpus : %d\n", n);
+ maybe_printf("free_cpus : %d\n", n);
free(cpumap.map);
}
libxl_physinfo_dispose(&info);
@@ -6119,7 +6148,7 @@ static void print_info(int numa)
}
output_xeninfo();
- printf("xend_config_format : 4\n");
+ maybe_printf("xend_config_format : 4\n");
return;
}
@@ -6139,6 +6168,13 @@ int main_info(int argc, char **argv)
break;
}
+ /*
+ * If an extra argument is provided, filter out a specific piece of
+ * information.
+ */
+ if (numa == 0 && argc > optind)
+ info_name = argv[optind];
+
print_info(numa);
return 0;
}
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] tools/xl: Allow callers of `xl info` to select specific information
2016-06-30 16:40 [PATCH] tools/xl: Allow callers of `xl info` to select specific information Andrew Cooper
@ 2016-07-07 11:52 ` Wei Liu
0 siblings, 0 replies; 2+ messages in thread
From: Wei Liu @ 2016-07-07 11:52 UTC (permalink / raw)
To: Andrew Cooper; +Cc: Wei Liu, Ian Jackson, Xen-devel
On Thu, Jun 30, 2016 at 05:40:23PM +0100, Andrew Cooper wrote:
> When scripting, it is much more convenient to use:
>
> [root@fusebot ~]# xl info xen_version
> 4.8-unstable
>
> than to construct some sed/awk/other to parse:
>
> [root@fusebot ~]# xl info
> ...
> xen_version : 4.8-unstable
> ...
>
> This works by wrapping all printf() calls in main_info() with maybe_printf(),
> which formats its arguments, compares the resulting string to the provided
> restriction, and discards it if no match is found.
>
> A restriction like this doesn't make sense in combination with --numa, so is
> excluded in that case.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
I only skim the code. It looks reasonable.
Wei.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2016-07-07 11:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-30 16:40 [PATCH] tools/xl: Allow callers of `xl info` to select specific information Andrew Cooper
2016-07-07 11:52 ` Wei Liu
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).