* [Qemu-devel] [PATCH] ide-test: fix failure for test_flush @ 2013-06-10 18:23 Michael Roth 2013-06-11 7:38 ` Kevin Wolf ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Michael Roth @ 2013-06-10 18:23 UTC (permalink / raw) To: qemu-devel; +Cc: kwolf, afaerber, stefanha bd07684aacfb61668ae2c25b7dd00b64f3d7c7f3 added a test to ensure BSY flag is set when a flush request is in flight. It does this by setting a blkdebug breakpoint on flush_to_os before issuing a CMD_FLUSH_CACHE. It then resumes CMD_FLUSH_CACHE operation and checks that BSY is unset. The actual unsetting of BSY does not occur until ide_flush_cb gets called in a bh, however, so in some cases this check will race with the actual completion. Fix this by polling the ide status register until BSY flag gets unset before we do our final sanity checks. According to f68ec8379e88502b4841a110c070e9b118d3151c this is in line with how a guest would determine whether or not the device is still busy. Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> --- tests/ide-test.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/ide-test.c b/tests/ide-test.c index 828e71a..7e2eb94 100644 --- a/tests/ide-test.c +++ b/tests/ide-test.c @@ -455,7 +455,10 @@ static void test_flush(void) data = inb(IDE_BASE + reg_device); g_assert_cmpint(data & DEV, ==, 0); - data = inb(IDE_BASE + reg_status); + do { + data = inb(IDE_BASE + reg_status); + } while (data & BSY); + assert_bit_set(data, DRDY); assert_bit_clear(data, BSY | DF | ERR | DRQ); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH] ide-test: fix failure for test_flush 2013-06-10 18:23 [Qemu-devel] [PATCH] ide-test: fix failure for test_flush Michael Roth @ 2013-06-11 7:38 ` Kevin Wolf 2013-06-11 10:05 ` Andreas Färber 2013-06-17 21:06 ` Anthony Liguori 2 siblings, 0 replies; 6+ messages in thread From: Kevin Wolf @ 2013-06-11 7:38 UTC (permalink / raw) To: Michael Roth; +Cc: qemu-devel, stefanha, afaerber Am 10.06.2013 um 20:23 hat Michael Roth geschrieben: > bd07684aacfb61668ae2c25b7dd00b64f3d7c7f3 added a test to ensure BSY > flag is set when a flush request is in flight. It does this by setting > a blkdebug breakpoint on flush_to_os before issuing a CMD_FLUSH_CACHE. > It then resumes CMD_FLUSH_CACHE operation and checks that BSY is unset. > > The actual unsetting of BSY does not occur until ide_flush_cb gets > called in a bh, however, so in some cases this check will race with > the actual completion. > > Fix this by polling the ide status register until BSY flag gets unset > before we do our final sanity checks. According to > f68ec8379e88502b4841a110c070e9b118d3151c this is in line with how a guest > would determine whether or not the device is still busy. > > Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> Thanks, applied to the block branch. Kevin ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH] ide-test: fix failure for test_flush 2013-06-10 18:23 [Qemu-devel] [PATCH] ide-test: fix failure for test_flush Michael Roth 2013-06-11 7:38 ` Kevin Wolf @ 2013-06-11 10:05 ` Andreas Färber 2013-06-11 12:13 ` Kevin Wolf 2013-06-11 15:45 ` mdroth 2013-06-17 21:06 ` Anthony Liguori 2 siblings, 2 replies; 6+ messages in thread From: Andreas Färber @ 2013-06-11 10:05 UTC (permalink / raw) To: Michael Roth, Kevin Wolf; +Cc: Anthony Liguori, qemu-devel, stefanha Am 10.06.2013 20:23, schrieb Michael Roth: > bd07684aacfb61668ae2c25b7dd00b64f3d7c7f3 added a test to ensure BSY > flag is set when a flush request is in flight. It does this by setting > a blkdebug breakpoint on flush_to_os before issuing a CMD_FLUSH_CACHE. > It then resumes CMD_FLUSH_CACHE operation and checks that BSY is unset. > > The actual unsetting of BSY does not occur until ide_flush_cb gets > called in a bh, however, so in some cases this check will race with > the actual completion. > > Fix this by polling the ide status register until BSY flag gets unset > before we do our final sanity checks. According to > f68ec8379e88502b4841a110c070e9b118d3151c this is in line with how a guest > would determine whether or not the device is still busy. > > Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> > --- > tests/ide-test.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/tests/ide-test.c b/tests/ide-test.c > index 828e71a..7e2eb94 100644 > --- a/tests/ide-test.c > +++ b/tests/ide-test.c > @@ -455,7 +455,10 @@ static void test_flush(void) > data = inb(IDE_BASE + reg_device); > g_assert_cmpint(data & DEV, ==, 0); > > - data = inb(IDE_BASE + reg_status); > + do { > + data = inb(IDE_BASE + reg_status); > + } while (data & BSY); Is a busy loop really a good idea for a qtest? CC'ing Anthony. For the theoretical case that BSY is not cleared it might be better to terminate the loop with some timeout to get an assertion failure or at least use some form of sleep() to yield the thread while waiting? > + > assert_bit_set(data, DRDY); > assert_bit_clear(data, BSY | DF | ERR | DRQ); This BSY clear assertion will always be true now due to the above while condition; it won't if we change it though. Regards, Andreas > -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH] ide-test: fix failure for test_flush 2013-06-11 10:05 ` Andreas Färber @ 2013-06-11 12:13 ` Kevin Wolf 2013-06-11 15:45 ` mdroth 1 sibling, 0 replies; 6+ messages in thread From: Kevin Wolf @ 2013-06-11 12:13 UTC (permalink / raw) To: Andreas Färber; +Cc: stefanha, Michael Roth, Anthony Liguori, qemu-devel Am 11.06.2013 um 12:05 hat Andreas Färber geschrieben: > Am 10.06.2013 20:23, schrieb Michael Roth: > > bd07684aacfb61668ae2c25b7dd00b64f3d7c7f3 added a test to ensure BSY > > flag is set when a flush request is in flight. It does this by setting > > a blkdebug breakpoint on flush_to_os before issuing a CMD_FLUSH_CACHE. > > It then resumes CMD_FLUSH_CACHE operation and checks that BSY is unset. > > > > The actual unsetting of BSY does not occur until ide_flush_cb gets > > called in a bh, however, so in some cases this check will race with > > the actual completion. > > > > Fix this by polling the ide status register until BSY flag gets unset > > before we do our final sanity checks. According to > > f68ec8379e88502b4841a110c070e9b118d3151c this is in line with how a guest > > would determine whether or not the device is still busy. > > > > Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> > > --- > > tests/ide-test.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/tests/ide-test.c b/tests/ide-test.c > > index 828e71a..7e2eb94 100644 > > --- a/tests/ide-test.c > > +++ b/tests/ide-test.c > > @@ -455,7 +455,10 @@ static void test_flush(void) > > data = inb(IDE_BASE + reg_device); > > g_assert_cmpint(data & DEV, ==, 0); > > > > - data = inb(IDE_BASE + reg_status); > > + do { > > + data = inb(IDE_BASE + reg_status); > > + } while (data & BSY); > > Is a busy loop really a good idea for a qtest? CC'ing Anthony. > For the theoretical case that BSY is not cleared it might be better to > terminate the loop with some timeout to get an assertion failure or at > least use some form of sleep() to yield the thread while waiting? FWIW, the floppy test already has a busy wait for IRQs, which results in the same failure mode. I think it's okay for a test case, but if someone felt like implementing timeouts, that would be great and we could apply them on top. Kevin ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH] ide-test: fix failure for test_flush 2013-06-11 10:05 ` Andreas Färber 2013-06-11 12:13 ` Kevin Wolf @ 2013-06-11 15:45 ` mdroth 1 sibling, 0 replies; 6+ messages in thread From: mdroth @ 2013-06-11 15:45 UTC (permalink / raw) To: Andreas Färber; +Cc: Kevin Wolf, Anthony Liguori, qemu-devel, stefanha On Tue, Jun 11, 2013 at 12:05:20PM +0200, Andreas Färber wrote: > Am 10.06.2013 20:23, schrieb Michael Roth: > > bd07684aacfb61668ae2c25b7dd00b64f3d7c7f3 added a test to ensure BSY > > flag is set when a flush request is in flight. It does this by setting > > a blkdebug breakpoint on flush_to_os before issuing a CMD_FLUSH_CACHE. > > It then resumes CMD_FLUSH_CACHE operation and checks that BSY is unset. > > > > The actual unsetting of BSY does not occur until ide_flush_cb gets > > called in a bh, however, so in some cases this check will race with > > the actual completion. > > > > Fix this by polling the ide status register until BSY flag gets unset > > before we do our final sanity checks. According to > > f68ec8379e88502b4841a110c070e9b118d3151c this is in line with how a guest > > would determine whether or not the device is still busy. > > > > Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> > > --- > > tests/ide-test.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/tests/ide-test.c b/tests/ide-test.c > > index 828e71a..7e2eb94 100644 > > --- a/tests/ide-test.c > > +++ b/tests/ide-test.c > > @@ -455,7 +455,10 @@ static void test_flush(void) > > data = inb(IDE_BASE + reg_device); > > g_assert_cmpint(data & DEV, ==, 0); > > > > - data = inb(IDE_BASE + reg_status); > > + do { > > + data = inb(IDE_BASE + reg_status); > > + } while (data & BSY); > > Is a busy loop really a good idea for a qtest? CC'ing Anthony. I'm not sure, my main justification was simply that we currently do it in ide-test for send_dma_request() > For the theoretical case that BSY is not cleared it might be better to > terminate the loop with some timeout to get an assertion failure or at > least use some form of sleep() to yield the thread while waiting? > I don't think yielding/sleeping is too big a deal since we do a blocking read() on each iteration which i assume will result in a yield while the inb is being processed by qemu. Timeouts might be nice thing to add later though. What about something like this? inb_wait(addr, testfn, opaque, timeout) { while (timeout == -1 || timeout-- > 0) { val = inb(addr); if (testfn(val, opaque)) { return val; } usleep(1000); } abort() } It's not particularly precise, but for imposing a rough limit it should work. > > + > > assert_bit_set(data, DRDY); > > assert_bit_clear(data, BSY | DF | ERR | DRQ); > > This BSY clear assertion will always be true now due to the above while > condition; it won't if we change it though. > > Regards, > Andreas > > > > > -- > SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany > GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH] ide-test: fix failure for test_flush 2013-06-10 18:23 [Qemu-devel] [PATCH] ide-test: fix failure for test_flush Michael Roth 2013-06-11 7:38 ` Kevin Wolf 2013-06-11 10:05 ` Andreas Färber @ 2013-06-17 21:06 ` Anthony Liguori 2 siblings, 0 replies; 6+ messages in thread From: Anthony Liguori @ 2013-06-17 21:06 UTC (permalink / raw) To: Michael Roth, qemu-devel; +Cc: stefanha, Anthony Liguori Applied. Thanks. Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-06-17 21:06 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-06-10 18:23 [Qemu-devel] [PATCH] ide-test: fix failure for test_flush Michael Roth 2013-06-11 7:38 ` Kevin Wolf 2013-06-11 10:05 ` Andreas Färber 2013-06-11 12:13 ` Kevin Wolf 2013-06-11 15:45 ` mdroth 2013-06-17 21:06 ` Anthony Liguori
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).