On 02/08/19 10:43, Anup Patel wrote: >> A possible optimization: if these cannot change while Linux runs (I am >> thinking especially of STVEC and HSTATUS, but perhaps SSCRATCH can be >> saved on kvm_arch_vcpu_load too) you can avoid the csrr and store. > Actual exception vector of Host Linux is different so we switch STVEC > every time. > > HSTATUS.SPV is set whenever we come back from Guest world so > while we are in in-kernel run loop with interrupts enabled we can get > external interrupt and HSTATUS.SPV bit can affect SRET of interrupt > handler. To handle this we switch HSTATUS every time. > > The world switch code uses SSCRATCH to save vcpu->arch pointer > which is later used on return path. Now, I did not want to restrict Host > Linux from using SSCRATCH for some other purpose hence we > switch SSCRATCH every time. Right, I'm not saying not to save these registers. I'm saying not to read the host value on every world switch, instead load it in hardware_enable (if it's the same for all physical CPUs) or kvm_arch_vcpu_load (if it's different for every physical CPU). IIUC Linux does not use SSCRATCH while in the kernel (it must be zero while handling an exception, but handle_exception takes care of that). I think it's okay if you make this assumption, but if you don't want to make it, you can still save it in kvm_arch_vcpu_load rather than here since you "own" the thread while in KVM_RUN. Paolo