On Thu, Apr 01, 2021, Maxim Levitsky wrote: > Use 'pending_exception' and 'injected_exception' fields > to store the pending and the injected exceptions. > > After this patch still only one is active, but > in the next patch both could co-exist in some cases. Please explain _why_. > Signed-off-by: Maxim Levitsky <mlevitsk@xxxxxxxxxx> > --- > arch/x86/include/asm/kvm_host.h | 25 ++++-- > arch/x86/kvm/svm/nested.c | 26 +++--- > arch/x86/kvm/svm/svm.c | 6 +- > arch/x86/kvm/vmx/nested.c | 36 ++++---- > arch/x86/kvm/vmx/vmx.c | 12 +-- > arch/x86/kvm/x86.c | 145 ++++++++++++++++++-------------- > arch/x86/kvm/x86.h | 6 +- > 7 files changed, 143 insertions(+), 113 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index a52f973bdff6..3b2fd276e8d5 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -547,6 +547,14 @@ struct kvm_vcpu_xen { > u64 runstate_times[4]; > }; > > +struct kvm_queued_exception { > + bool valid; > + u8 nr; If we're refactoring all this code anyways, maybe change "nr" to something a bit more descriptive? E.g. vector. > + bool has_error_code; > + u32 error_code; > +}; > + > + > struct kvm_vcpu_arch { > /* > * rip and regs accesses must go through > @@ -645,16 +653,15 @@ struct kvm_vcpu_arch { > > u8 event_exit_inst_len; > > - struct kvm_queued_exception { > - bool pending; > - bool injected; > - bool has_error_code; > - u8 nr; > - u32 error_code; > - unsigned long payload; > - bool has_payload; > + struct kvm_queued_exception pending_exception; > + > + struct kvm_exception_payload { > + bool valid; > + unsigned long value; > u8 nested_apf; > - } exception; > + } exception_payload; Hmm, even if it's dead code at this time, I think the exception payload should be part of 'struct kvm_queued_exception'. The payload is very much tied to a single exception. > + > + struct kvm_queued_exception injected_exception; Any objection to keeping the current syntax, arch.exception.{pending,injected}? Maybe it's fear of change, but I like the current style, I think because the relevant info is condensed at the end, e.g. I can ignore "vcpu->arch.exception" and look at "pending.vector" or whatever. E.g. struct { struct kvm_queued_exception pending; struct kvm_queued_exception injected; } exception; > > struct kvm_queued_interrupt { > bool injected;