On 05/23/2012 05:08 PM, Gleb Natapov wrote: > "rep ins" emulation is going through emulator now. This is slow because > emulator knows how to write back only one datum at a time. This patch > provides fast path for the instruction in certain conditions. The > conditions are: DF flag is not set, destination memory is RAM and single > datum does not cross page boundary. If fast path code fails it falls > back to emulation. > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index f75af40..20e3fb0 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -1887,21 +1887,31 @@ static int io_interception(struct vcpu_svm *svm) > { > struct kvm_vcpu *vcpu = &svm->vcpu; > u32 io_info = svm->vmcb->control.exit_info_1; /* address size bug? */ > - int size, in, string; > + int size, in, string, rep; > unsigned port; > > ++svm->vcpu.stat.io_exits; > string = (io_info & SVM_IOIO_STR_MASK) != 0; > + rep = (io_info & SVM_IOIO_REP_MASK) != 0; > in = (io_info & SVM_IOIO_TYPE_MASK) != 0; > - if (string || in) > - return emulate_instruction(vcpu, 0) == EMULATE_DONE; > If decode assists are not available, we still need to emulate, see 15.33.5. > port = io_info >> 16; > size = (io_info & SVM_IOIO_SIZE_MASK) >> SVM_IOIO_SIZE_SHIFT; > svm->next_rip = svm->vmcb->control.exit_info_2; > - skip_emulated_instruction(&svm->vcpu); > > - return kvm_fast_pio_out(vcpu, size, port); > + if (!string && !in) { > + skip_emulated_instruction(&svm->vcpu); > + return kvm_fast_pio_out(vcpu, size, port); > + } else if (string && in && rep) { > + int addr_size = (io_info & SVM_IOIO_ASIZE_MASK) >> > + SVM_IOIO_ASIZE_SHIFT; > + int r = kvm_fast_string_pio_in(vcpu, size, port, > + ffs(addr_size) - 1); > + if (r != EMULATE_FAIL) > + return r == EMULATE_DONE; > + } > + > + return emulate_instruction(vcpu, 0) == EMULATE_DONE; > } > -- error compiling committee.c: too many arguments to function -- 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