* [Qemu-devel] [PATCH] ahci fix: windows boots fine. need to review with kwolf
@ 2013-10-28 19:00 Michael S. Tsirkin
2013-10-28 19:02 ` Michael S. Tsirkin
0 siblings, 1 reply; 2+ messages in thread
From: Michael S. Tsirkin @ 2013-10-28 19:00 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, Paolo Bonzini, Andreas Färber, Anthony Liguori,
agraf
From: Alexander Graf <agraf@suse.de>
When AHCI executes an asynchronous IDE command, it checked DRDY without
checking either DRQ or BSY. This sometimes caused interrupt to be sent
before command is actually completed.
This resulted in a race condition: if guest then managed to access the
device before command has completed, it would hang waiting for an
interrupt.
This was observed with windows 7 guests.
To fix, check for DRQ or BSY in additiona to DRDY, if set,
the command is asynchronous so delay the interrupt until
asynchronous done callback is invoked.
Reported-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/ide/ahci.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index a8be62c..fbea9e8 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -961,7 +961,8 @@ static int handle_cmd(AHCIState *s, int port, int slot)
/* We're ready to process the command in FIS byte 2. */
ide_exec_cmd(&s->dev[port].port, cmd_fis[2]);
- if (s->dev[port].port.ifs[0].status & READY_STAT) {
+ if ((s->dev[port].port.ifs[0].status & (READY_STAT|DRQ_STAT|BUSY_STAT)) ==
+ READY_STAT) {
ahci_write_fis_d2h(&s->dev[port], cmd_fis);
}
}
--
MST
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] ahci fix: windows boots fine. need to review with kwolf
2013-10-28 19:00 [Qemu-devel] [PATCH] ahci fix: windows boots fine. need to review with kwolf Michael S. Tsirkin
@ 2013-10-28 19:02 ` Michael S. Tsirkin
0 siblings, 0 replies; 2+ messages in thread
From: Michael S. Tsirkin @ 2013-10-28 19:02 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, Paolo Bonzini, Andreas Färber, Anthony Liguori,
agraf
On Mon, Oct 28, 2013 at 09:00:15PM +0200, Michael S. Tsirkin wrote:
> From: Alexander Graf <agraf@suse.de>
>
> When AHCI executes an asynchronous IDE command, it checked DRDY without
> checking either DRQ or BSY. This sometimes caused interrupt to be sent
> before command is actually completed.
>
> This resulted in a race condition: if guest then managed to access the
> device before command has completed, it would hang waiting for an
> interrupt.
> This was observed with windows 7 guests.
>
> To fix, check for DRQ or BSY in additiona to DRDY, if set,
> the command is asynchronous so delay the interrupt until
> asynchronous done callback is invoked.
>
> Reported-by: Michael S. Tsirkin <mst@redhat.com>
> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> Tested-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Sorry about the subject, forgot to update it.
I reposted with a fixed subject.
> ---
> hw/ide/ahci.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
> index a8be62c..fbea9e8 100644
> --- a/hw/ide/ahci.c
> +++ b/hw/ide/ahci.c
> @@ -961,7 +961,8 @@ static int handle_cmd(AHCIState *s, int port, int slot)
> /* We're ready to process the command in FIS byte 2. */
> ide_exec_cmd(&s->dev[port].port, cmd_fis[2]);
>
> - if (s->dev[port].port.ifs[0].status & READY_STAT) {
> + if ((s->dev[port].port.ifs[0].status & (READY_STAT|DRQ_STAT|BUSY_STAT)) ==
> + READY_STAT) {
> ahci_write_fis_d2h(&s->dev[port], cmd_fis);
> }
> }
> --
> MST
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-10-28 18:59 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-28 19:00 [Qemu-devel] [PATCH] ahci fix: windows boots fine. need to review with kwolf Michael S. Tsirkin
2013-10-28 19:02 ` Michael S. Tsirkin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).