|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v3] x86/HVM: more consistently set I/O completion
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: 07 September 2020 10:43
> To: paul@xxxxxxx
> Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx; 'Andrew Cooper'
> <andrew.cooper3@xxxxxxxxxx>; 'Wei Liu'
> <wl@xxxxxxx>; 'Roger Pau Monné' <roger.pau@xxxxxxxxxx>; 'Jun Nakajima'
> <jun.nakajima@xxxxxxxxx>;
> 'Kevin Tian' <kevin.tian@xxxxxxxxx>; 'George Dunlap'
> <George.Dunlap@xxxxxxxxxxxxx>
> Subject: Re: [PATCH v3] x86/HVM: more consistently set I/O completion
>
> On 04.09.2020 18:17, Paul Durrant wrote:
> >> @@ -2610,8 +2612,13 @@ static const struct x86_emulate_ops hvm_
> >> .vmfunc = hvmemul_vmfunc,
> >> };
> >>
> >> +/*
> >> + * Note that passing HVMIO_no_completion into this function serves as kind
> >> + * of (but not fully) an "auto select completion" indicator.
> >> + */
> >> static int _hvm_emulate_one(struct hvm_emulate_ctxt *hvmemul_ctxt,
> >> - const struct x86_emulate_ops *ops)
> >> + const struct x86_emulate_ops *ops,
> >> + enum hvm_io_completion completion)
> >> {
> >> const struct cpu_user_regs *regs = hvmemul_ctxt->ctxt.regs;
> >> struct vcpu *curr = current;
> >> @@ -2642,16 +2649,31 @@ static int _hvm_emulate_one(struct hvm_e
> >> rc = X86EMUL_RETRY;
> >>
> >> if ( !hvm_ioreq_needs_completion(&vio->io_req) )
> >> + completion = HVMIO_no_completion;
> >
> > The comment doesn't mention that passing in something other than
> > HVMIO_no_completion could get overridden. Is that intentional?
>
> Well, it was, but since you seem to be asking for it I've added
> "When there's no completion needed, the passed in value will be
> ignored in any case."
That sounds ok.
>
> >> + else if ( completion == HVMIO_no_completion )
> >> + completion = (vio->io_req.type != IOREQ_TYPE_PIO ||
> >> + hvmemul_ctxt->is_mem_access) ? HVMIO_mmio_completion
> >> + : HVMIO_pio_completion;
> >> +
> >> + switch ( vio->io_completion = completion )
> >
> > I thought we tended to avoid assignments in control flow statements.
>
> In if() we do, because of the ambiguity whether == might have
> been meant instead. But in switch() there's imo no such
> ambiguity - if == was really meant, if() would better be used
> anyway. We have quite a few cases of this elsewhere, and I think
> some of them are reasonably recent introductions. As you're the
> maintainer of the file, if you strongly think I shouldn't do so,
> I'll switch of course.
No, that's ok; I was just seeking clarification of when this style is
acceptable.
>
> >> @@ -2727,8 +2752,8 @@ int hvm_emulate_one_mmio(unsigned long m
> >> hvm_emulate_init_once(&ctxt, x86_insn_is_mem_write,
> >> guest_cpu_user_regs());
> >> ctxt.ctxt.data = &mmio_ro_ctxt;
> >> - rc = _hvm_emulate_one(&ctxt, ops);
> >> - switch ( rc )
> >> +
> >> + switch ( rc = _hvm_emulate_one(&ctxt, ops, HVMIO_no_completion) )
> >
> > Again, why move the assignment into the switch statement?
>
> For consistency with the other cases where this gets introduced
> in this patch, at least. I for one consider this the more concise
> way of writing such code.
>
> >> --- a/xen/arch/x86/hvm/vmx/realmode.c
> >> +++ b/xen/arch/x86/hvm/vmx/realmode.c
> >> @@ -97,15 +97,11 @@ static void realmode_deliver_exception(
> >> void vmx_realmode_emulate_one(struct hvm_emulate_ctxt *hvmemul_ctxt)
> >> {
> >> struct vcpu *curr = current;
> >> - struct hvm_vcpu_io *vio = &curr->arch.hvm.hvm_io;
> >> int rc;
> >>
> >> perfc_incr(realmode_emulations);
> >>
> >> - rc = hvm_emulate_one(hvmemul_ctxt);
> >> -
> >> - if ( hvm_ioreq_needs_completion(&vio->io_req) )
> >> - vio->io_completion = HVMIO_realmode_completion;
> >> + rc = hvm_emulate_one(hvmemul_ctxt, HVMIO_realmode_completion);
> >
> > Ok, I guess the override of completion is intentional to deal with
> > this case. Perhaps expand the comment above _hvm_emulate_one() then.
>
> Right, done as per above. Let me know whether the text still isn't
> sufficient.
>
> >> --- a/xen/include/asm-x86/hvm/emulate.h
> >> +++ b/xen/include/asm-x86/hvm/emulate.h
> >> @@ -48,6 +48,8 @@ struct hvm_emulate_ctxt {
> >>
> >> uint32_t intr_shadow;
> >>
> >> + bool is_mem_access;
> >> +
> >
> > Whilst you mention in the commit comment why this is added, I don't
> > see any consumer if it in this patch. Will the come later?
>
> hvmemul_validate() sets the field, and _hvm_emulate_one() consumes
> it.
>
Oh yes, I see it now.
With the comment addition...
Reviewed-by: Paul Durrant <paul@xxxxxxx>
> Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |