KVM: mark requests that do not need a wakeup
Some operations must ensure that the guest is not running with stale data, but if the guest is halted, then the update can wait until another event happens. kvm_make_all_requests() currently doesn't wake up, so we can mark all requests used with it. First 8 bits were arbitrarily reserved for request numbers. Most uses of requests have the request type as a constant, so a compiler will optimize the '&'. An alternative would be to have an inline function that would return whether the request needs a wake-up or not, but I like this one better even though it might produce worse assembly. Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> Reviewed-by: Andrew Jones <drjones@redhat.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
75aaafb79f
commit
930f7fd6da
@ -44,7 +44,7 @@
|
||||
#define KVM_MAX_VCPUS VGIC_V2_MAX_CPUS
|
||||
#endif
|
||||
|
||||
#define KVM_REQ_VCPU_EXIT 8
|
||||
#define KVM_REQ_VCPU_EXIT (8 | KVM_REQUEST_NO_WAKEUP)
|
||||
|
||||
u32 *kvm_vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num, u32 mode);
|
||||
int __attribute_const__ kvm_target_cpu(void);
|
||||
|
@ -41,7 +41,7 @@
|
||||
|
||||
#define KVM_VCPU_MAX_FEATURES 4
|
||||
|
||||
#define KVM_REQ_VCPU_EXIT 8
|
||||
#define KVM_REQ_VCPU_EXIT (8 | KVM_REQUEST_NO_WAKEUP)
|
||||
|
||||
int __attribute_const__ kvm_target_cpu(void);
|
||||
int kvm_reset_vcpu(struct kvm_vcpu *vcpu);
|
||||
|
@ -61,10 +61,10 @@
|
||||
#define KVM_REQ_PMI 19
|
||||
#define KVM_REQ_SMI 20
|
||||
#define KVM_REQ_MASTERCLOCK_UPDATE 21
|
||||
#define KVM_REQ_MCLOCK_INPROGRESS 22
|
||||
#define KVM_REQ_SCAN_IOAPIC 23
|
||||
#define KVM_REQ_MCLOCK_INPROGRESS (22 | KVM_REQUEST_NO_WAKEUP)
|
||||
#define KVM_REQ_SCAN_IOAPIC (23 | KVM_REQUEST_NO_WAKEUP)
|
||||
#define KVM_REQ_GLOBAL_CLOCK_UPDATE 24
|
||||
#define KVM_REQ_APIC_PAGE_RELOAD 25
|
||||
#define KVM_REQ_APIC_PAGE_RELOAD (25 | KVM_REQUEST_NO_WAKEUP)
|
||||
#define KVM_REQ_HV_CRASH 26
|
||||
#define KVM_REQ_IOAPIC_EOI_EXIT 27
|
||||
#define KVM_REQ_HV_RESET 28
|
||||
|
@ -115,12 +115,14 @@ static inline bool is_error_page(struct page *page)
|
||||
return IS_ERR(page);
|
||||
}
|
||||
|
||||
#define KVM_REQUEST_MASK GENMASK(7,0)
|
||||
#define KVM_REQUEST_NO_WAKEUP BIT(8)
|
||||
/*
|
||||
* Architecture-independent vcpu->requests bit members
|
||||
* Bits 4-7 are reserved for more arch-independent bits.
|
||||
*/
|
||||
#define KVM_REQ_TLB_FLUSH 0
|
||||
#define KVM_REQ_MMU_RELOAD 1
|
||||
#define KVM_REQ_TLB_FLUSH (0 | KVM_REQUEST_NO_WAKEUP)
|
||||
#define KVM_REQ_MMU_RELOAD (1 | KVM_REQUEST_NO_WAKEUP)
|
||||
#define KVM_REQ_PENDING_TIMER 2
|
||||
#define KVM_REQ_UNHALT 3
|
||||
|
||||
@ -1076,17 +1078,17 @@ static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
|
||||
* caller. Paired with the smp_mb__after_atomic in kvm_check_request.
|
||||
*/
|
||||
smp_wmb();
|
||||
set_bit(req, &vcpu->requests);
|
||||
set_bit(req & KVM_REQUEST_MASK, &vcpu->requests);
|
||||
}
|
||||
|
||||
static inline bool kvm_test_request(int req, struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return test_bit(req, &vcpu->requests);
|
||||
return test_bit(req & KVM_REQUEST_MASK, &vcpu->requests);
|
||||
}
|
||||
|
||||
static inline void kvm_clear_request(int req, struct kvm_vcpu *vcpu)
|
||||
{
|
||||
clear_bit(req, &vcpu->requests);
|
||||
clear_bit(req & KVM_REQUEST_MASK, &vcpu->requests);
|
||||
}
|
||||
|
||||
static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu)
|
||||
|
Loading…
Reference in New Issue
Block a user