qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Denis V. Lunev" <den@openvz.org>
To: John Snow <jsnow@redhat.com>,
	qemu-block@nongnu.org, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
	Evgeny Yakovlev <eyakovlev@virtuozzo.com>,
	Max Reitz <mreitz@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 3/3] tests: in IDE and AHCI tests perform DMA write before flushing
Date: Tue, 28 Jun 2016 12:11:10 +0300	[thread overview]
Message-ID: <57723F2E.50201@openvz.org> (raw)
In-Reply-To: <ff399224-f811-ae1e-1ea0-df4f8c192c1d@redhat.com>

On 06/28/2016 02:19 AM, John Snow wrote:
>
> On 06/27/2016 10:47 AM, Denis V. Lunev wrote:
>> From: Evgeny Yakovlev <eyakovlev@virtuozzo.com>
>>
>> Due to changes in flush behaviour clean disks stopped generating
>> flush_to_disk events and IDE and AHCI tests that test flush commands
>> started to fail.
>>
>> This change adds additional DMA writes to affected tests before sending
>> flush commands so that bdrv_flush actually generates flush_to_disk event.
>>
>> Signed-off-by: Evgeny Yakovlev <eyakovlev@virtuozzo.com>
>> Signed-off-by: Denis V. Lunev <den@openvz.org>
>> CC: Kevin Wolf <kwolf@redhat.com>
>> CC: Max Reitz <mreitz@redhat.com>
>> CC: Stefan Hajnoczi <stefanha@redhat.com>
>> CC: Fam Zheng <famz@redhat.com>
>> CC: John Snow <jsnow@redhat.com>
>> ---
>>   tests/ahci-test.c | 34 ++++++++++++++++++++++++++++++++--
>>   tests/ide-test.c  | 43 +++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 75 insertions(+), 2 deletions(-)
>>
>> diff --git a/tests/ahci-test.c b/tests/ahci-test.c
>> index 57dc44c..d707714 100644
>> --- a/tests/ahci-test.c
>> +++ b/tests/ahci-test.c
>> @@ -1063,11 +1063,34 @@ static void test_dma_fragmented(void)
>>       g_free(tx);
>>   }
>>   
>> +/*
>> + * Write sector 0 with random data to make AHCI storage dirty
>> + * Needed for flush tests so that flushes actually go though the block layer
>> + */
>> +static void make_dirty(AHCIQState* ahci, uint8_t port)
>> +{
>> +    uint64_t ptr;
>> +    unsigned bufsize = 512;
>> +
>> +    ptr = ahci_alloc(ahci, bufsize);
>> +    g_assert(ptr);
>> +
>> +    ahci_guest_io(ahci, port, CMD_WRITE_DMA, ptr, bufsize, 0);
>> +    ahci_free(ahci, ptr);
>> +}
>> +
>>   static void test_flush(void)
>>   {
>>       AHCIQState *ahci;
>> +    uint8_t port;
>>   
>>       ahci = ahci_boot_and_enable(NULL);
>> +
>> +    port = ahci_port_select(ahci);
>> +    ahci_port_clear(ahci, port);
>> +
>> +    make_dirty(ahci, port);
>> +
>>       ahci_test_flush(ahci);
>>       ahci_shutdown(ahci);
>>   }
>> @@ -1087,10 +1110,13 @@ static void test_flush_retry(void)
>>                                   debug_path,
>>                                   tmp_path, imgfmt);
>>   
>> -    /* Issue Flush Command and wait for error */
>>       port = ahci_port_select(ahci);
>>       ahci_port_clear(ahci, port);
>>   
>> +    /* Issue write so that flush actually goes to disk */
>> +    make_dirty(ahci, port);
>> +
>> +    /* Issue Flush Command and wait for error */
>>       cmd = ahci_guest_io_halt(ahci, port, CMD_FLUSH_CACHE, 0, 0, 0);
>>       ahci_guest_io_resume(ahci, cmd);
>>   
>> @@ -1343,9 +1369,13 @@ static void test_flush_migrate(void)
>>   
>>       set_context(src->parent);
>>   
>> -    /* Issue Flush Command */
>>       px = ahci_port_select(src);
>>       ahci_port_clear(src, px);
>> +
>> +    /* Dirty device so that flush reaches disk */
>> +    make_dirty(src, px);
>> +
>> +    /* Issue Flush Command */
>>       cmd = ahci_command_create(CMD_FLUSH_CACHE);
>>       ahci_command_commit(src, cmd, px);
>>       ahci_command_issue_async(src, cmd);
>> diff --git a/tests/ide-test.c b/tests/ide-test.c
>> index fed1b2e..8466d0f 100644
>> --- a/tests/ide-test.c
>> +++ b/tests/ide-test.c
>> @@ -499,6 +499,39 @@ static void test_identify(void)
>>       ide_test_quit();
>>   }
>>   
>> +/*
>> + * Write sector 0 with random data to make IDE storage dirty
>> + * Needed for flush tests so that flushes actually go though the block layer
>> + */
>> +static void make_dirty(uint8_t device)
>> +{
>> +    uint8_t status;
>> +    size_t len = 512;
>> +    uintptr_t guest_buf;
>> +    void* buf;
>> +
>> +    guest_buf = guest_alloc(guest_malloc, len);
>> +    buf = g_malloc(len);
>> +    g_assert(guest_buf);
>> +    g_assert(buf);
>> +
>> +    memwrite(guest_buf, buf, len);
>> +
>> +    PrdtEntry prdt[] = {
>> +        {
>> +            .addr = cpu_to_le32(guest_buf),
>> +            .size = cpu_to_le32(len | PRDT_EOT),
>> +        },
>> +    };
>> +
>> +    status = send_dma_request(CMD_WRITE_DMA, 0, 1, prdt,
>> +                              ARRAY_SIZE(prdt), NULL);
>> +    g_assert_cmphex(status, ==, BM_STS_INTR);
>> +    assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR);
>> +
>> +    g_free(buf);
>> +}
>> +
>>   static void test_flush(void)
>>   {
>>       uint8_t data;
>> @@ -507,6 +540,11 @@ static void test_flush(void)
>>           "-drive file=blkdebug::%s,if=ide,cache=writeback,format=raw",
>>           tmp_path);
>>   
>> +    qtest_irq_intercept_in(global_qtest, "ioapic");
>> +
>> +    /* Dirty media so that CMD_FLUSH_CACHE will actually go to disk */
>> +    make_dirty(0);
>> +
>>       /* Delay the completion of the flush request until we explicitly do it */
>>       g_free(hmp("qemu-io ide0-hd0 \"break flush_to_os A\""));
>>   
>> @@ -549,6 +587,11 @@ static void test_retry_flush(const char *machine)
>>           "rerror=stop,werror=stop",
>>           debug_path, tmp_path);
>>   
>> +    qtest_irq_intercept_in(global_qtest, "ioapic");
>> +
>> +    /* Dirty media so that CMD_FLUSH_CACHE will actually go to disk */
>> +    make_dirty(0);
>> +
>>       /* FLUSH CACHE command on device 0*/
>>       outb(IDE_BASE + reg_device, 0);
>>       outb(IDE_BASE + reg_command, CMD_FLUSH_CACHE);
>>
> Reviewed-by: John Snow <jsnow@redhat.com>
>
> However, the patch-set needs to be re-ordered as 3-1-2. Intermediate
> patch commits cannot have failing tests.
ok

  reply	other threads:[~2016-06-28  9:11 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-27 14:47 [Qemu-devel] [PATCH v4 0/3] block: ignore flush requests when storage is clean Denis V. Lunev
2016-06-27 14:47 ` [Qemu-devel] [PATCH v4 1/3] " Denis V. Lunev
2016-06-28  1:27   ` Fam Zheng
2016-06-28  9:10     ` Denis V. Lunev
2016-06-29  1:12       ` Fam Zheng
2016-06-29  8:30         ` Denis V. Lunev
2016-06-29  9:09         ` Stefan Hajnoczi
2016-06-27 14:47 ` [Qemu-devel] [PATCH v4 2/3] ide: ignore retry_unit check for non-retry operation Denis V. Lunev
2016-06-27 14:47 ` [Qemu-devel] [PATCH v4 3/3] tests: in IDE and AHCI tests perform DMA write before flushing Denis V. Lunev
2016-06-27 23:19   ` John Snow
2016-06-28  9:11     ` Denis V. Lunev [this message]
2016-06-28  9:21     ` Evgeny Yakovlev
2016-06-28 16:37       ` John Snow
2016-06-29 17:40         ` John Snow

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=57723F2E.50201@openvz.org \
    --to=den@openvz.org \
    --cc=eyakovlev@virtuozzo.com \
    --cc=famz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).