Re: [PATCH] kvm tools: Allow retrieval about PTY redirection in 'kvm stat'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2011-11-01 at 18:34 +0200, Sasha Levin wrote:
> This patch adds an option to provide information about redirection
> of terminal redirection to a PTY device within 'kvm stat'.
> 
> Usage:
> 	'kvm stat -p [term] -n [instance_name]'
> 
> Will print information about redirection of terminal 'term' int instance
> 'instance_name'.
> 
> Cc: Osier Yang <jyang@xxxxxxxxxx>
> Signed-off-by: Sasha Levin <levinsasha928@xxxxxxxxx>

Ping? Should I apply this patch? Is it actually useful for libvirt?

> ---
>  tools/kvm/Documentation/kvm-stat.txt |    2 +
>  tools/kvm/builtin-stat.c             |   39 ++++++++++++++++++++++++++++++---
>  tools/kvm/include/kvm/kvm-ipc.h      |    1 +
>  tools/kvm/include/kvm/term.h         |    7 ++++++
>  tools/kvm/term.c                     |   25 ++++++++++++++++++++-
>  5 files changed, 69 insertions(+), 5 deletions(-)
> 
> diff --git a/tools/kvm/Documentation/kvm-stat.txt b/tools/kvm/Documentation/kvm-stat.txt
> index ce5ab54..5284aa9 100644
> --- a/tools/kvm/Documentation/kvm-stat.txt
> +++ b/tools/kvm/Documentation/kvm-stat.txt
> @@ -17,3 +17,5 @@ For a list of running instances see 'kvm list'.
>  
>  Commands:
>   --memory, -m	Display memory statistics
> + --pty, -p	Display information about terminal's pty
> +		device.
> diff --git a/tools/kvm/builtin-stat.c b/tools/kvm/builtin-stat.c
> index e28eb5b..2a46900 100644
> --- a/tools/kvm/builtin-stat.c
> +++ b/tools/kvm/builtin-stat.c
> @@ -4,6 +4,8 @@
>  #include <kvm/kvm.h>
>  #include <kvm/parse-options.h>
>  #include <kvm/kvm-ipc.h>
> +#include <kvm/term.h>
> +#include <kvm/read-write.h>
>  
>  #include <sys/select.h>
>  #include <stdio.h>
> @@ -18,6 +20,7 @@ struct stat_cmd {
>  };
>  
>  static bool mem;
> +static int pty = -1;
>  static bool all;
>  static int instance;
>  static const char *instance_name;
> @@ -30,6 +33,7 @@ static const char * const stat_usage[] = {
>  static const struct option stat_options[] = {
>  	OPT_GROUP("Commands options:"),
>  	OPT_BOOLEAN('m', "memory", &mem, "Display memory statistics"),
> +	OPT_INTEGER('p', "PTY info", &pty, "Display PTY path for given terminal"),
>  	OPT_GROUP("Instance options:"),
>  	OPT_BOOLEAN('a', "all", &all, "All instances"),
>  	OPT_STRING('n', "name", &instance_name, "name", "Instance name"),
> @@ -104,15 +108,40 @@ static int do_memstat(const char *name, int sock)
>  	return 0;
>  }
>  
> +static int do_pty(const char *name, int sock)
> +{
> +	struct pty_cmd cmd = {KVM_IPC_TRM_PTY, 0, pty};
> +	int r;
> +	char pty_path[PATH_MAX] = {0};
> +
> +	r = xwrite(sock, &cmd, sizeof(cmd));
> +	if (r < 0)
> +		return r;
> +
> +	r = xread(sock, pty_path, PATH_MAX);
> +	if (r < 0)
> +		return r;
> +
> +	printf("Instance %s mapped term %d to: %s\n", name, pty, pty_path);
> +
> +	return 0;
> +}
> +
>  int kvm_cmd_stat(int argc, const char **argv, const char *prefix)
>  {
>  	parse_stat_options(argc, argv);
>  
> -	if (!mem)
> +	if (!mem && pty == -1)
>  		usage_with_options(stat_usage, stat_options);
>  
> -	if (mem && all)
> -		return kvm__enumerate_instances(do_memstat);
> +	if (all) {
> +		if (mem)
> +			kvm__enumerate_instances(do_memstat);
> +		if (pty != -1)
> +			kvm__enumerate_instances(do_pty);
> +
> +		return 0;
> +	}
>  
>  	if (instance_name == NULL &&
>  	    instance == 0)
> @@ -125,7 +154,9 @@ int kvm_cmd_stat(int argc, const char **argv, const char *prefix)
>  		die("Failed locating instance");
>  
>  	if (mem)
> -		return do_memstat(instance_name, instance);
> +		do_memstat(instance_name, instance);
> +	if (pty != -1)
> +		do_pty(instance_name, instance);
>  
>  	return 0;
>  }
> diff --git a/tools/kvm/include/kvm/kvm-ipc.h b/tools/kvm/include/kvm/kvm-ipc.h
> index 731767f..1d9599b 100644
> --- a/tools/kvm/include/kvm/kvm-ipc.h
> +++ b/tools/kvm/include/kvm/kvm-ipc.h
> @@ -17,6 +17,7 @@ enum {
>  	KVM_IPC_RESUME	= 5,
>  	KVM_IPC_STOP	= 6,
>  	KVM_IPC_PID	= 7,
> +	KVM_IPC_TRM_PTY	= 8,
>  };
>  
>  int kvm_ipc__register_handler(u32 type, void (*cb)(int fd, u32 type, u32 len, u8 *msg));
> diff --git a/tools/kvm/include/kvm/term.h b/tools/kvm/include/kvm/term.h
> index 37ec731..06d5b4e 100644
> --- a/tools/kvm/include/kvm/term.h
> +++ b/tools/kvm/include/kvm/term.h
> @@ -2,10 +2,17 @@
>  #define KVM__TERM_H
>  
>  #include <sys/uio.h>
> +#include <linux/types.h>
>  
>  #define CONSOLE_8250	1
>  #define CONSOLE_VIRTIO	2
>  
> +struct pty_cmd {
> +	u32 type;
> +	u32 len;
> +	int pty;
> +};
> +
>  int term_putc_iov(int who, struct iovec *iov, int iovcnt, int term);
>  int term_getc_iov(int who, struct iovec *iov, int iovcnt, int term);
>  int term_putc(int who, char *addr, int cnt, int term);
> diff --git a/tools/kvm/term.c b/tools/kvm/term.c
> index fb5d71c..4e0d946 100644
> --- a/tools/kvm/term.c
> +++ b/tools/kvm/term.c
> @@ -13,7 +13,7 @@
>  #include "kvm/util.h"
>  #include "kvm/kvm.h"
>  #include "kvm/kvm-cpu.h"
> -
> +#include "kvm/kvm-ipc.h"
>  
>  #define TERM_FD_IN      0
>  #define TERM_FD_OUT     1
> @@ -27,6 +27,7 @@ bool term_got_escape	= false;
>  int active_console;
>  
>  int term_fds[4][2];
> +char *term_names[4];
>  
>  int term_getc(int who, int term)
>  {
> @@ -142,11 +143,31 @@ void term_set_tty(int term)
>  
>  	close(slave);
>  
> +	term_names[term] = strdup(new_pty);
> +
>  	pr_info("Assigned terminal %d to pty %s\n", term, new_pty);
>  
>  	term_fds[term][TERM_FD_IN] = term_fds[term][TERM_FD_OUT] = master;
>  }
>  
> +static void term_info(int fd, u32 type, u32 len, u8 *msg)
> +{
> +	int r, id;
> +	const char *res = "[none]";
> +
> +	r = read(fd, &id, sizeof(id));
> +	if (r < 0)
> +		pr_warning("Failed reading term");
> +
> +	if (term_names[id])
> +		res = term_names[id];
> +
> +	r = write(fd, res, strlen(res) + 1);
> +
> +	if (r < 0)
> +		pr_warning("Failed sending term info");
> +}
> +
>  void term_init(void)
>  {
>  	struct termios term;
> @@ -165,6 +186,8 @@ void term_init(void)
>  			term_fds[i][TERM_FD_OUT] = STDOUT_FILENO;
>  		}
>  
> +	kvm_ipc__register_handler(KVM_IPC_TRM_PTY, term_info);
> +
>  	signal(SIGTERM, term_sig_cleanup);
>  	atexit(term_cleanup);
>  }


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux