From: Kevin Wolf <kwolf@redhat.com>
To: Anton Nefedov <anton.nefedov@virtuozzo.com>
Cc: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"qemu-block@nongnu.org" <qemu-block@nongnu.org>,
"mreitz@redhat.com" <mreitz@redhat.com>,
"armbru@redhat.com" <armbru@redhat.com>,
"jsnow@redhat.com" <jsnow@redhat.com>,
"pbonzini@redhat.com" <pbonzini@redhat.com>,
"famz@redhat.com" <famz@redhat.com>,
"eblake@redhat.com" <eblake@redhat.com>,
Denis Lunev <den@virtuozzo.com>,
"berto@igalia.com" <berto@igalia.com>
Subject: Re: [Qemu-devel] [PATCH v4 3/8] ide: account UNMAP (TRIM) operations
Date: Mon, 8 Oct 2018 17:03:16 +0200 [thread overview]
Message-ID: <20181008150316.GB4604@localhost.localdomain> (raw)
In-Reply-To: <956674d6-0cb9-f68c-15e2-89d39cfac049@virtuozzo.com>
Am 08.10.2018 um 16:38 hat Anton Nefedov geschrieben:
> On 4/10/2018 6:33 PM, Kevin Wolf wrote:
> > Am 21.08.2018 um 11:46 hat Anton Nefedov geschrieben:
> >> Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
> >> Reviewed-by: Alberto Garcia <berto@igalia.com>
> >> ---
> >> hw/ide/core.c | 12 ++++++++++++
> >> 1 file changed, 12 insertions(+)
> >>
> >> diff --git a/hw/ide/core.c b/hw/ide/core.c
> >> index 2c62efc..352429b 100644
> >> --- a/hw/ide/core.c
> >> +++ b/hw/ide/core.c
> >> @@ -440,6 +440,14 @@ static void ide_issue_trim_cb(void *opaque, int ret)
> >> TrimAIOCB *iocb = opaque;
> >> IDEState *s = iocb->s;
> >>
> >> + if (iocb->i >= 0) {
> >> + if (ret >= 0) {
> >> + block_acct_done(blk_get_stats(s->blk), &s->acct);
> >> + } else {
> >> + block_acct_failed(blk_get_stats(s->blk), &s->acct);
> >> + }
> >> + }
> >> +
> >> if (ret >= 0) {
> >> while (iocb->j < iocb->qiov->niov) {
> >> int j = iocb->j;
> >> @@ -461,6 +469,9 @@ static void ide_issue_trim_cb(void *opaque, int ret)
> >> goto done;
> >> }
> >>
> >> + block_acct_start(blk_get_stats(s->blk), &s->acct,
> >> + count << BDRV_SECTOR_BITS, BLOCK_ACCT_UNMAP);
> >> +
> >> /* Got an entry! Submit and exit. */
> >> iocb->aiocb = blk_aio_pdiscard(s->blk,
> >> sector << BDRV_SECTOR_BITS,
> >> @@ -845,6 +856,7 @@ static void ide_dma_cb(void *opaque, int ret)
> >> }
> >>
> >> if (ret == -EINVAL) {
> >> + block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_UNMAP);
> >
> > This looks wrong to me, ide_dma_cb() is not only called for unmap, but
> > also for reads and writes, and each of them could return -EINVAL.
> >
>
> Stating here BLOCK_ACCT_UNMAP is definitely a blunder :(
>
> > Also, -EINVAL doesn't necessarily mean that the guest driver did
> > something wrong, it could also be the result of a host problem.
> > Therefore, it isn't right to call block_acct_invalid() here - especially
> > since the request may already have been accounted for as either done or
> > failed in ide_issue_trim_cb().
> >
>
> Couldn't be accounted done with such retcode;
> and it seems I shouldnt do block_acct_failed() there anyway - or it's
> accounted twice: there and in ide_dma_cb()->ide_handle_rw_error()
>
> But if EINVAL (from further layers) should not be accounted as an
> invalid op, then it should be accounted failed instead, the thing that
> current code does not do.
> (and which brings us back to possible double-accounting if we account
> invalid in ide_issue_trim_cb() )
Yes, commit caeadbc8ba4 was already wrong in assuming that there is
only one possible source for -EINVAL.
> > Instead, I think it would be better to immediately account for invalid
> > requests in ide_issue_trim_cb() where iocb->ret = -EINVAL is set and we
> > know for sure that indeed !ide_sect_range_ok() is the cause for the
> > -EINVAL return code.
> >
> So I guess yes, move acct_invalid in ide_issue_trim_cb() and leave
> acct_failed there, and filter off TRIM commands in the common
> accounting.
blk_aio_discard() can fail with -EINVAL, too, so getting this error code
from a TRIM command doesn't mean anything. It can still have multiple
possible sources.
Maybe we just need to remember somewhere whether we already accounted
for a request (maybe an additional field in BlockAcctCookie? Or change
the type to BLOCK_ACCT_ALREADY_ACCOUNTED?) and then make an additional
block_account_one_io() call a no-op for such requests.
Kevin
next prev parent reply other threads:[~2018-10-08 15:03 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-21 9:46 [Qemu-devel] [PATCH v4 0/8] discard blockstats Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 1/8] qapi: group BlockDeviceStats fields Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 2/8] qapi: add unmap to BlockDeviceStats Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 3/8] ide: account UNMAP (TRIM) operations Anton Nefedov
2018-10-04 15:33 ` Kevin Wolf
2018-10-08 14:38 ` Anton Nefedov
2018-10-08 15:03 ` Kevin Wolf [this message]
2018-10-08 15:25 ` Anton Nefedov
2018-10-08 15:46 ` Kevin Wolf
2018-10-08 16:04 ` Anton Nefedov
2018-10-08 16:43 ` Kevin Wolf
2018-10-17 15:32 ` Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 4/8] scsi: store unmap offset and nb_sectors in request struct Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 5/8] scsi: move unmap error checking to the complete callback Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 6/8] scsi: account unmap operations Anton Nefedov
2018-10-04 15:47 ` Kevin Wolf
2018-10-08 14:43 ` Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 7/8] file-posix: account discard operations Anton Nefedov
2018-10-04 15:52 ` Kevin Wolf
2018-10-08 13:47 ` Anton Nefedov
2018-08-21 9:46 ` [Qemu-devel] [PATCH v4 8/8] qapi: query-blockstat: add driver specific file-posix stats Anton Nefedov
[not found] ` <6d0b2d5b-f0a4-b62c-3dc4-e8d92eeb76b2@virtuozzo.com>
2018-10-04 14:04 ` [Qemu-devel] [PATCH v4 0/8] discard blockstats Anton Nefedov
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=20181008150316.GB4604@localhost.localdomain \
--to=kwolf@redhat.com \
--cc=anton.nefedov@virtuozzo.com \
--cc=armbru@redhat.com \
--cc=berto@igalia.com \
--cc=den@virtuozzo.com \
--cc=eblake@redhat.com \
--cc=famz@redhat.com \
--cc=jsnow@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.