All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <marc.zyngier@arm.com>
To: Jonathan Austin <Jonathan.Austin@arm.com>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"penberg@kernel.org" <penberg@kernel.org>,
	Will Deacon <Will.Deacon@arm.com>,
	Matt Evans <Matt.Evans@arm.com>
Subject: Re: [PATCH 2/3] kvm tools: remove periodic tick in favour of a polling thread
Date: Wed, 04 Sep 2013 10:48:59 +0100	[thread overview]
Message-ID: <5227020B.6030209@arm.com> (raw)
In-Reply-To: <1378231855-13834-3-git-send-email-jonathan.austin@arm.com>

Hi Jonny,

Just a couple of nits, see below:

On 03/09/13 19:10, Jonathan Austin wrote:
> Currently the only use of the periodic timer tick in kvmtool is to
> handle reading from stdin. Though functional, this periodic tick can be
> problematic on slow (eg FPGA) platforms and can cause low interactivity or
> even stop the execution from progressing at all.
> 
> This patch removes the periodic tick in favour of a dedicated thread blocked
> waiting for input from the console. In order to reflect the new behaviour,
> the old 'kvm__arch_periodic_tick' function is renamed to 'kvm__arm_read_term'.

s/kvm__arm_read_term/kvm__arch_read_term/

> Signed-off-by: Jonathan Austin <jonathan.austin@arm.com>
> ---
>  tools/kvm/arm/kvm.c         |    2 +-
>  tools/kvm/builtin-run.c     |   13 -----------
>  tools/kvm/include/kvm/kvm.h |    2 +-
>  tools/kvm/kvm.c             |   50 -------------------------------------------
>  tools/kvm/powerpc/kvm.c     |    2 +-
>  tools/kvm/term.c            |   31 +++++++++++++++++++++++++++
>  tools/kvm/x86/kvm.c         |    2 +-
>  7 files changed, 35 insertions(+), 67 deletions(-)
> 
> diff --git a/tools/kvm/arm/kvm.c b/tools/kvm/arm/kvm.c
> index 27e6cf4..008b7fe 100644
> --- a/tools/kvm/arm/kvm.c
> +++ b/tools/kvm/arm/kvm.c
> @@ -46,7 +46,7 @@ void kvm__arch_delete_ram(struct kvm *kvm)
>  	munmap(kvm->arch.ram_alloc_start, kvm->arch.ram_alloc_size);
>  }
>  
> -void kvm__arch_periodic_poll(struct kvm *kvm)
> +void kvm__arch_read_term(struct kvm *kvm)
>  {
>  	if (term_readable(0)) {
>  		serial8250__update_consoles(kvm);
> diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c
> index 4d7fbf9d..da95d71 100644
> --- a/tools/kvm/builtin-run.c
> +++ b/tools/kvm/builtin-run.c
> @@ -165,13 +165,6 @@ void kvm_run_set_wrapper_sandbox(void)
>  	OPT_END()							\
>  	};
>  
> -static void handle_sigalrm(int sig, siginfo_t *si, void *uc)
> -{
> -	struct kvm *kvm = si->si_value.sival_ptr;
> -
> -	kvm__arch_periodic_poll(kvm);
> -}
> -
>  static void *kvm_cpu_thread(void *arg)
>  {
>  	char name[16];
> @@ -487,17 +480,11 @@ static struct kvm *kvm_cmd_run_init(int argc, const char **argv)
>  {
>  	static char real_cmdline[2048], default_name[20];
>  	unsigned int nr_online_cpus;
> -	struct sigaction sa;
>  	struct kvm *kvm = kvm__new();
>  
>  	if (IS_ERR(kvm))
>  		return kvm;
>  
> -	sa.sa_flags = SA_SIGINFO;
> -	sa.sa_sigaction = handle_sigalrm;
> -	sigemptyset(&sa.sa_mask);
> -	sigaction(SIGALRM, &sa, NULL);
> -
>  	nr_online_cpus = sysconf(_SC_NPROCESSORS_ONLN);
>  	kvm->cfg.custom_rootfs_name = "default";
>  
> diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h
> index ad53ca7..d05b936 100644
> --- a/tools/kvm/include/kvm/kvm.h
> +++ b/tools/kvm/include/kvm/kvm.h
> @@ -103,7 +103,7 @@ void kvm__arch_delete_ram(struct kvm *kvm);
>  int kvm__arch_setup_firmware(struct kvm *kvm);
>  int kvm__arch_free_firmware(struct kvm *kvm);
>  bool kvm__arch_cpu_supports_vm(void);
> -void kvm__arch_periodic_poll(struct kvm *kvm);
> +void kvm__arch_read_term(struct kvm *kvm);
>  
>  void *guest_flat_to_host(struct kvm *kvm, u64 offset);
>  u64 host_to_guest_flat(struct kvm *kvm, void *ptr);
> diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c
> index cfd30dd..d7d2e84 100644
> --- a/tools/kvm/kvm.c
> +++ b/tools/kvm/kvm.c
> @@ -393,56 +393,6 @@ found_kernel:
>  	return ret;
>  }
>  
> -#define TIMER_INTERVAL_NS 1000000	/* 1 msec */
> -
> -/*
> - * This function sets up a timer that's used to inject interrupts from the
> - * userspace hypervisor into the guest at periodical intervals. Please note
> - * that clock interrupt, for example, is not handled here.
> - */
> -int kvm_timer__init(struct kvm *kvm)
> -{
> -	struct itimerspec its;
> -	struct sigevent sev;
> -	int r;
> -
> -	memset(&sev, 0, sizeof(struct sigevent));
> -	sev.sigev_value.sival_int	= 0;
> -	sev.sigev_notify		= SIGEV_THREAD_ID;
> -	sev.sigev_signo			= SIGALRM;
> -	sev.sigev_value.sival_ptr	= kvm;
> -	sev._sigev_un._tid		= syscall(__NR_gettid);
> -
> -	r = timer_create(CLOCK_REALTIME, &sev, &kvm->timerid);
> -	if (r < 0)
> -		return r;
> -
> -	its.it_value.tv_sec		= TIMER_INTERVAL_NS / 1000000000;
> -	its.it_value.tv_nsec		= TIMER_INTERVAL_NS % 1000000000;
> -	its.it_interval.tv_sec		= its.it_value.tv_sec;
> -	its.it_interval.tv_nsec		= its.it_value.tv_nsec;
> -
> -	r = timer_settime(kvm->timerid, 0, &its, NULL);
> -	if (r < 0) {
> -		timer_delete(kvm->timerid);
> -		return r;
> -	}
> -
> -	return 0;
> -}
> -firmware_init(kvm_timer__init);
> -
> -int kvm_timer__exit(struct kvm *kvm)
> -{
> -	if (kvm->timerid)
> -		if (timer_delete(kvm->timerid) < 0)
> -			die("timer_delete()");
> -
> -	kvm->timerid = 0;
> -
> -	return 0;
> -}
> -firmware_exit(kvm_timer__exit);
>  
>  void kvm__dump_mem(struct kvm *kvm, unsigned long addr, unsigned long size, int debug_fd)
>  {
> diff --git a/tools/kvm/powerpc/kvm.c b/tools/kvm/powerpc/kvm.c
> index b4b9f82..c1712cf 100644
> --- a/tools/kvm/powerpc/kvm.c
> +++ b/tools/kvm/powerpc/kvm.c
> @@ -151,7 +151,7 @@ void kvm__irq_trigger(struct kvm *kvm, int irq)
>  	kvm__irq_line(kvm, irq, 0);
>  }
>  
> -void kvm__arch_periodic_poll(struct kvm *kvm)
> +void kvm__arch_read_term(struct kvm *kvm)
>  {
>  	/* FIXME: Should register callbacks to platform-specific polls */
>  	spapr_hvcons_poll(kvm);
> diff --git a/tools/kvm/term.c b/tools/kvm/term.c
> index ac9c7cc..935503f 100644
> --- a/tools/kvm/term.c
> +++ b/tools/kvm/term.c
> @@ -25,6 +25,8 @@ bool term_got_escape	= false;
>  
>  int term_fds[TERM_MAX_DEVS][2];
>  
> +pthread_t term_poll_thread;
> +

Can't this be made static?

>  int term_getc(struct kvm *kvm, int term)
>  {
>  	unsigned char c;
> @@ -91,6 +93,30 @@ bool term_readable(int term)
>  	return poll(&pollfd, 1, 0) > 0;
>  }
>  
> +static void *term_poll_thread_loop(void *param)
> +{
> +	struct pollfd fds[TERM_MAX_DEVS];
> +	struct kvm *kvm = (struct kvm *) param;
> +
> +	int i;
> +
> +	for (i = 0; i < TERM_MAX_DEVS; i++) {
> +		fds[i].fd = term_fds[i][TERM_FD_IN];
> +		fds[i].events = POLLIN;
> +		fds[i].revents = 0;
> +	}
> +
> +	while (1) {
> +		/* Poll with infinite timeout */
> +		if(poll(fds, TERM_MAX_DEVS, -1) < 1)
> +			break;
> +		kvm__arch_read_term(kvm);
> +	}
> +
> +	die("term_poll_thread_loop: error polling device fds %d\n", errno);
> +	return NULL;
> +}
> +
>  static void term_cleanup(void)
>  {
>  	int i;
> @@ -161,6 +187,11 @@ int term_init(struct kvm *kvm)
>  	term.c_lflag &= ~(ICANON | ECHO | ISIG);
>  	tcsetattr(STDIN_FILENO, TCSANOW, &term);
>  
> +
> +	/* Use our own blocking thread to read stdin, don't require a tick */
> +	if(pthread_create(&term_poll_thread, NULL, term_poll_thread_loop,kvm))
> +		die("Unable to create console input poll thread\n");
> +
>  	signal(SIGTERM, term_sig_cleanup);
>  	atexit(term_cleanup);
>  
> diff --git a/tools/kvm/x86/kvm.c b/tools/kvm/x86/kvm.c
> index 9b46772..d285d1d 100644
> --- a/tools/kvm/x86/kvm.c
> +++ b/tools/kvm/x86/kvm.c
> @@ -374,7 +374,7 @@ int kvm__arch_free_firmware(struct kvm *kvm)
>  	return 0;
>  }
>  
> -void kvm__arch_periodic_poll(struct kvm *kvm)
> +void kvm__arch_read_term(struct kvm *kvm)
>  {
>  	serial8250__update_consoles(kvm);
>  	virtio_console__inject_interrupt(kvm);
> 

Otherwise, looks good to me.

	M.
-- 
Jazz is not dead. It just smells funny...


  reply	other threads:[~2013-09-04  9:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-03 18:10 [PATCH 0/3] kvm tools: remove periodic tick Jonathan Austin
2013-09-03 18:10 ` [PATCH 1/3] kvm tools: use #define for maximum number of terminal devices Jonathan Austin
2013-09-03 18:10 ` [PATCH 2/3] kvm tools: remove periodic tick in favour of a polling thread Jonathan Austin
2013-09-04  9:48   ` Marc Zyngier [this message]
2013-09-03 18:10 ` [PATCH 3/3] kvm tools: stop virtio console doing unnecessary input handling Jonathan Austin
2013-09-04  9:23 ` [PATCH 0/3] kvm tools: remove periodic tick Pekka Enberg
2013-09-04  9:58   ` Marc Zyngier

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=5227020B.6030209@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=Jonathan.Austin@arm.com \
    --cc=Matt.Evans@arm.com \
    --cc=Will.Deacon@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=penberg@kernel.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.