|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 12/17] x86/hvm: split I/O completion handling from state model
>>> On 24.06.15 at 13:24, <paul.durrant@xxxxxxxxxx> wrote:
> @@ -428,26 +429,12 @@ static void hvm_io_assist(ioreq_t *p)
> vio->io_state = HVMIO_completed;
> vio->io_data = p->data;
> break;
> - case HVMIO_handle_mmio_awaiting_completion:
> - vio->io_state = HVMIO_completed;
> - vio->io_data = p->data;
> - (void)handle_mmio();
> - break;
> - case HVMIO_handle_pio_awaiting_completion:
> - if ( vio->io_size == 4 ) /* Needs zero extension. */
> - guest_cpu_user_regs()->rax = (uint32_t)p->data;
> - else
> - memcpy(&guest_cpu_user_regs()->rax, &p->data, vio->io_size);
> - break;
> default:
> break;
> }
>
> - if ( p->state == STATE_IOREQ_NONE )
> - {
> - msix_write_completion(curr);
> - vcpu_end_shutdown_deferral(curr);
> - }
> + msix_write_completion(curr);
> + vcpu_end_shutdown_deferral(curr);
> }
Doesn't this mean that these can now potentially be called more than
once for a single instruction (due to retries)? That's presumably not a
problem for vcpu_end_shutdown_deferral(), but I'm uncertain about
msix_write_completion().
> @@ -508,8 +496,36 @@ void hvm_do_resume(struct vcpu *v)
> }
> }
>
> - if ( vio->mmio_retry )
> + io_completion = vio->io_completion;
> + vio->io_completion = HVMIO_no_completion;
> +
> + switch ( io_completion )
> + {
> + case HVMIO_no_completion:
> + break;
> + case HVMIO_mmio_completion:
> (void)handle_mmio();
> + break;
> + case HVMIO_pio_completion:
> + if ( vio->io_size == 4 ) /* Needs zero extension. */
> + guest_cpu_user_regs()->rax = (uint32_t)vio->io_data;
> + else
> + memcpy(&guest_cpu_user_regs()->rax, &vio->io_data, vio->io_size);
> + vio->io_state = HVMIO_none;
> + break;
> + case HVMIO_realmode_completion:
> + {
> + struct hvm_emulate_ctxt ctxt;
> +
> + hvm_emulate_prepare(&ctxt, guest_cpu_user_regs());
> + vmx_realmode_emulate_one(&ctxt);
> + hvm_emulate_writeback(&ctxt);
> +
> + break;
> + }
> + default:
> + BUG();
I'd prefer such to be ASSERT_UNREACHABLE(), as I don't see
getting here to be a reason to crash the hypervisor (and the
guest would likely crash in such a case anyway). Or maybe
fold in the first case and make this
ASSERT(io_completion == HVMIO_no_completion).
> @@ -46,9 +51,10 @@ struct hvm_vcpu_asid {
>
> struct hvm_vcpu_io {
> /* I/O request in flight to device model. */
> - enum hvm_io_state io_state;
> - unsigned long io_data;
> - int io_size;
> + enum hvm_io_state io_state;
> + unsigned long io_data;
> + int io_size;
Unless this can validly be negative, please make this unsigned int
if you already touch it.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |