Re: [PATCH v3] KVM: nVMX: Improve I/O exit handling

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

 



On 2013-02-18 09:44, Gleb Natapov wrote:
> On Mon, Feb 18, 2013 at 07:32:53AM +0100, Jan Kiszka wrote:
>> On 2013-02-14 19:46, Jan Kiszka wrote:
>>> This prevents trapping L2 I/O exits if L1 has neither unconditional nor
>>> bitmap-based exiting enabled. Furthermore, it implements basic I/O
>>> bitmap handling. Repeated string accesses are still reported to L1
>>> unconditionally for now.
>>>
>>> Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx>
>>> ---
>>>
>>> Changes in v3:
>>>  - trap unconditionally if bitmap access fails
>>>
>>>  arch/x86/kvm/vmx.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++-
>>>  1 files changed, 53 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>>> index 6667042..2633199 100644
>>> --- a/arch/x86/kvm/vmx.c
>>> +++ b/arch/x86/kvm/vmx.c
>>> @@ -5908,6 +5908,58 @@ static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = {
>>>  static const int kvm_vmx_max_exit_handlers =
>>>  	ARRAY_SIZE(kvm_vmx_exit_handlers);
>>>  
>>> +static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu,
>>> +				       struct vmcs12 *vmcs12)
>>> +{
>>> +	unsigned long exit_qualification;
>>> +	gpa_t bitmap, last_bitmap;
>>> +	bool string, rep;
>>> +	u16 port;
>>> +	int size;
>>> +	u8 b;
>>> +
>>> +	if (nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING))
>>> +		return 1;
>>> +
>>> +	if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS))
>>> +		return 0;
>>> +
>>> +	exit_qualification = vmcs_readl(EXIT_QUALIFICATION);
>>> +
>>> +	string = exit_qualification & 16;
>>> +	rep = exit_qualification & 32;
>>> +
>>> +	/* TODO: interpret instruction and check range against bitmap */
>>> +	if (string && rep)
>>> +		return 1;
>>
>> Nonsense, rep ins/outs always works against the same port. We can simply
>> drop this check and be done with the feature. I'll come up with v4.
>>
> Actually this reminds me that we should check range of ports depending
> on operand size, not one port. But here is a catch, older cpus do not
> provide operand size as part of exit information.

You mean what bit 54 in VMX_BASIC is telling us? Too bad. OK, will write
v5 which takes this into account.

Jan


Attachment: signature.asc
Description: OpenPGP digital signature


[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