|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/5] hvmemul_do_io: If the send to the ioreq server failed do not retry.
On 01/30/15 05:23, Jan Beulich wrote:
>>>> On 30.01.15 at 01:52, <dslutz@xxxxxxxxxxx> wrote:
>> I.E. do just what no backing DM does.
>
> _If_ this is correct, the if() modified here should be folded with the
> one a few lines up.
Ok, will fold with the one a few lines up. As expected without this
change the guest will hang (more details below).
> But looking at the description of the commit that
> introduced this (bac0999325 "x86 hvm: Do not incorrectly retire an
> instruction emulation...", almost immediately modified by f20f3c8ece
> "x86 hvm: On failed hvm_send_assist_req(), io emulation...") I doubt
> this is really what we want, or at the very least your change
> description should explain what was wrong with the original commit.
>
Looking at these 2 commits, it looks to me like I need to handle these
cases also. So it looks like having hvm_send_assist_req() return an int
0, 1, & 2 is the simpler way. V2 on the way soon.
Which is the better codding style:
1) Add #defines for the return values?
2) Just use numbers?
3) Invert the sense 0 means worked, 1 is shutdown_deferral or
domain_crash, 2 is hvm_complete_assist_req()?
I.E. (for just adding 2):
diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c
index 2ed4344..c565151 100644
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -227,10 +227,19 @@ static int hvmemul_do_io(
else
{
rc = X86EMUL_RETRY;
- if ( !hvm_send_assist_req(&p) )
- vio->io_state = HVMIO_none;
- else if ( p_data == NULL )
+ switch ( hvm_send_assist_req(&p) )
+ {
+ case 2:
rc = X86EMUL_OKAY;
+ /* fall through */
+ case 0:
+ vio->io_state = HVMIO_none;
+ break;
+ case 1:
+ if ( p_data == NULL )
+ rc = X86EMUL_OKAY;
+ break;
+ }
}
???
I would think it would be good for the code using hvm_has_dm()
to also call on hvm_complete_assist_req(). hvm_has_dm() is a subset of
the cases that hvm_select_ioreq_server() checks for.
Based on this, I think it would be better to remove the call on
hvm_has_dm() instead of adding a call to hvm_complete_assist_req().
-Don Slutz
P.S. Details for hang:
Using:
static bool_t hvm_complete_assist_req(ioreq_t *p)
{
+ HVMTRACE_1D(COMPLETE_ASSIST, p->type);
...
):
I get the trace:
CPU1 745455716325 (+ 1362) VMEXIT [ exitcode = 0x0000001e, rIP
= 0x00101581 ]
CPU1 0 (+ 0) COMPLETE_ASSIST [ type = 0 ]
CPU1 0 (+ 0) HANDLE_PIO [ port = 0x0cfe size = 2 dir = 1
io_state = 0 ret = 0 ]
CPU1 745455717846 (+ 1521) vlapic_accept_pic_intr [ i8259_target =
1, accept_pic_int = 1 ]
CPU1 745455718209 (+ 363) VMENTRY
CPU1 745455719568 (+ 1359) VMEXIT [ exitcode = 0x0000001e, rIP
= 0x00101581 ]
CPU1 0 (+ 0) COMPLETE_ASSIST [ type = 0 ]
CPU1 0 (+ 0) HANDLE_PIO [ port = 0x0cfe size = 2 dir = 1
io_state = 0 ret = 0 ]
CPU1 745455721083 (+ 1515) vlapic_accept_pic_intr [ i8259_target =
1, accept_pic_int = 1 ]
CPU1 745455721422 (+ 339) VMENTRY
CPU1 745455722781 (+ 1359) VMEXIT [ exitcode = 0x0000001e, rIP
= 0x00101581 ]
CPU1 0 (+ 0) COMPLETE_ASSIST [ type = 0 ]
CPU1 0 (+ 0) HANDLE_PIO [ port = 0x0cfe size = 2 dir = 1
io_state = 0 ret = 0 ]
CPU1 745455724299 (+ 1518) vlapic_accept_pic_intr [ i8259_target =
1, accept_pic_int = 1 ]
CPU1 745455724656 (+ 357) VMENTRY
CPU1 745455726009 (+ 1353) VMEXIT [ exitcode = 0x0000001e, rIP
= 0x00101581 ]
CPU1 0 (+ 0) COMPLETE_ASSIST [ type = 0 ]
CPU1 0 (+ 0) HANDLE_PIO [ port = 0x0cfe size = 2 dir = 1
io_state = 0 ret = 0 ]
CPU1 745455727539 (+ 1530) vlapic_accept_pic_intr [ i8259_target =
1, accept_pic_int = 1 ]
CPU1 745455727899 (+ 360) VMENTRY
CPU1 745455729276 (+ 1377) VMEXIT [ exitcode = 0x0000001e, rIP
= 0x00101581 ]
CPU1 0 (+ 0) COMPLETE_ASSIST [ type = 0 ]
CPU1 0 (+ 0) HANDLE_PIO [ port = 0x0cfe size = 2 dir = 1
io_state = 0 ret = 0 ]
CPU1 745455730803 (+ 1527) vlapic_accept_pic_intr [ i8259_target =
1, accept_pic_int = 1 ]
CPU1 745455731163 (+ 360) VMENTRY
CPU1 745455732525 (+ 1362) VMEXIT [ exitcode = 0x0000001e, rIP
= 0x00101581 ]
CPU1 0 (+ 0) COMPLETE_ASSIST [ type = 0 ]
CPU1 0 (+ 0) HANDLE_PIO [ port = 0x0cfe size = 2 dir = 1
io_state = 0 ret = 0 ]
CPU1 745455734049 (+ 1524) vlapic_accept_pic_intr [ i8259_target =
1, accept_pic_int = 1 ]
CPU1 745455734385 (+ 336) VMENTRY
...
> Jan
>
>> --- a/xen/arch/x86/hvm/emulate.c
>> +++ b/xen/arch/x86/hvm/emulate.c
>> @@ -228,7 +228,11 @@ static int hvmemul_do_io(
>> {
>> rc = X86EMUL_RETRY;
>> if ( !hvm_send_assist_req(&p) )
>> + {
>> + /* Since the send failed, do not retry */
>> + rc = X86EMUL_OKAY;
>> vio->io_state = HVMIO_none;
>> + }
>> else if ( p_data == NULL )
>> rc = X86EMUL_OKAY;
>> }
>> --
>> 1.8.4
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |