diff options
author | Sasha Levin <levinsasha928@gmail.com> | 2011-07-27 09:00:48 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-09-25 12:17:59 -0400 |
commit | 743eeb0b01d2fbf4154bf87bff1ebb6fb18aeb7a (patch) | |
tree | 5392464930f7e77131d65f32ba96ce4665307629 /arch/x86/kvm/x86.c | |
parent | 0d460ffc0956d2dbe12ca9f5f6aa0f8701ea9d73 (diff) |
KVM: Intelligent device lookup on I/O bus
Currently the method of dealing with an IO operation on a bus (PIO/MMIO)
is to call the read or write callback for each device registered
on the bus until we find a device which handles it.
Since the number of devices on a bus can be significant due to ioeventfds
and coalesced MMIO zones, this leads to a lot of overhead on each IO
operation.
Instead of registering devices, we now register ranges which points to
a device. Lookup is done using an efficient bsearch instead of a linear
search.
Performance test was conducted by comparing exit count per second with
200 ioeventfds created on one byte and the guest is trying to access a
different byte continuously (triggering usermode exits).
Before the patch the guest has achieved 259k exits per second, after the
patch the guest does 274k exits per second.
Cc: Avi Kivity <avi@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 6cb353c83a12..d28dff749dfd 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -3562,7 +3562,11 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
3562 | if (r) { | 3562 | if (r) { |
3563 | mutex_lock(&kvm->slots_lock); | 3563 | mutex_lock(&kvm->slots_lock); |
3564 | kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, | 3564 | kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, |
3565 | &vpic->dev); | 3565 | &vpic->dev_master); |
3566 | kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, | ||
3567 | &vpic->dev_slave); | ||
3568 | kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, | ||
3569 | &vpic->dev_eclr); | ||
3566 | mutex_unlock(&kvm->slots_lock); | 3570 | mutex_unlock(&kvm->slots_lock); |
3567 | kfree(vpic); | 3571 | kfree(vpic); |
3568 | goto create_irqchip_unlock; | 3572 | goto create_irqchip_unlock; |