qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paul Brook <paul@codesourcery.com>
To: qemu-devel@nongnu.org
Cc: "Chris Webb" <chris@arachsys.com>,
	Jernej@gnu.org, "Avi Kivity" <avi@redhat.com>,
	kvm@vger.kernel.org, Simončič <jernej's-kvm@eternallybored.org>
Subject: Re: [Qemu-devel] High CPU use of -usbdevice tablet (was Re: KVM usability)
Date: Sun, 4 Apr 2010 15:25:17 +0100	[thread overview]
Message-ID: <201004041525.18211.paul@codesourcery.com> (raw)
In-Reply-To: <20100404123116.GA19866@arachsys.com>

> > Looks like the tablet is set to 100 Hz polling rate.  We may be able
> > to get away with 30 Hz or even less (ep_bInterval, in ms, in
> > hw/usb-wacom.c).
>
> Changing the USB tablet polling interval from 10ms to 100ms in both
> hw/usb-wacom.c and hw/usb-hid.c made no difference except the an increase
>  in bInterval shown in lsusb -v in the guest and the hint of jerky mouse
>  movement I expected from setting this value so high. A similar change to
>  the polling interval for the keyboard and mouse also made no difference to
>  their performance impact.

The USB HID devices implement the SET_IDLE command, so the polling interval 
will have no real effect on performance.

My guess is that the overhead you're seeing is entirely from the USB host 
adapter having to wake up and check the transport descriptor lists. This will 
only result in the guest being woken if a device actually responds (as 
mentioned above it should not).

>Taking the FRAME_TIMER_FREQ down to 100 in hw/usb-uhci.c does seem to reduce
>the CPU load quite a bit, but at the expense of making the USB tablet (and
>presumably all other USB devices) very laggy.

The guest USB driver explicitly decides which devices to poll each frame. 
Slowing down the frame rate will effectively change the polling period by the 
same factor. e.g. the HID device requests a polling rate of 10ms, you slowed 
down frame rate by 10x, so you're efectively only polling every 100ms.

If you want a quick and nasty hack then you can probably make the device wake 
up less often, and process multiple frames every wakeup.  However this is 
probably going to do bad things (at best extremely poor performance) when 
using actual USB devices.

Fixing this properly is hard because the transport descriptor lists are stores 
in system RAM, and polled by the host adapter.  The first step is to read the 
whole table of descriptors, and calculate when the next event is due. However 
the guest will not explicitly notify the HBA when these tables are modified, 
so you also need some sort of MMU trap to trigger recalculation.

This only gets you down to the base polling interval requested by the device.  
Increasing this interval causes significant user visible latency, so 
increasing it is not an option. The guest is also likely to distribute polling 
events evenly, further reducing the effective sleep interval.  To fix this you 
need additional APIs so that a device can report when an endpoint will become 
unblocked, rather than just waiting to be polled and NAKing the request.

Paul

  reply	other threads:[~2010-04-04 14:25 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1267068445.1726.25.camel@localhost>
     [not found] ` <1267089644.12790.74.camel@laptop>
     [not found]   ` <1267152599.1726.76.camel@localhost>
     [not found]     ` <20100226090147.GH15885@elte.hu>
     [not found]       ` <4B879A2F.50203@redhat.com>
     [not found]         ` <20100226103545.GA7463@elte.hu>
     [not found]           ` <4B87A6BF.3090301@redhat.com>
     [not found]             ` <20100226111734.GE7463@elte.hu>
     [not found]               ` <4B8813F2.8090208@redhat.com>
     [not found]                 ` <20100227105643.GA17425@elte.hu>
2010-02-27 13:30                   ` [Qemu-devel] Re: KVM usability Jan Kiszka
     [not found]                   ` <d9c105ea1003011312s935c3c5haa1ec80aebe14d88@mail.gmail.com>
     [not found]                     ` <4B8C38B8.8010007@codemonkey.ws>
     [not found]                       ` <1267498953.2460.32.camel@x200>
     [not found]                         ` <20100302082118.GT1924@arachsys.com>
     [not found]                           ` <428008581.20100302103400@eternallybored.org>
     [not found]                             ` <4B938F9D.7010207@redhat.com>
2010-04-04 12:31                               ` [Qemu-devel] High CPU use of -usbdevice tablet (was Re: KVM usability) Chris Webb
2010-04-04 14:25                                 ` Paul Brook [this message]
2010-04-04 16:58                                   ` Avi Kivity
2010-04-04 21:03                                     ` Paul Brook
2010-04-04 21:53                                     ` Paul Brook
2010-04-05  8:22                                       ` Avi Kivity

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=201004041525.18211.paul@codesourcery.com \
    --to=paul@codesourcery.com \
    --cc=Jernej@gnu.org \
    --cc=avi@redhat.com \
    --cc=chris@arachsys.com \
    --cc=jernej's-kvm@eternallybored.org \
    --cc=kvm@vger.kernel.org \
    --cc=qemu-devel@nongnu.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).