From: Paul Brook <paul@codesourcery.com>
To: qemu-devel@nongnu.org
Cc: Amit Shah <amit.shah@redhat.com>,
Gerd Hoffmann <kraxel@redhat.com>,
Juan Quintela <quintela@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data
Date: Thu, 2 Dec 2010 17:31:36 +0000 [thread overview]
Message-ID: <201012021731.36291.paul@codesourcery.com> (raw)
In-Reply-To: <20101202092100.GD3313@amit-x200.redhat.com>
> > > when there's a partial write, it tries to do a write again, which will
> > > fail with -EAGAIN.
> >
> > Doesn't that cause the first partial chunk to be incorrectly transmitted
> > twice? You may only return EAGAIN if no data was transmitted.
>
> Except for the fact that no caller of qemu_chr_write() resubmits (or
> even checks) partial writes.
I don't buy this argument. The current implementation of qemu_chr_write never
generates transient failures, so they don't need to.
If any data has been written then you must not return -EAGAIN. Doing so will
cause data corruption - the device will retry the transmit later (e.g. when
the socket becomes unblocked) and duplicate data will be output.
Once data has been transmitted, we have three options:
a) Block until the write completes. This makes the whole patch fairly
pointless as host and guest block boundaries are unlikely to align.
b) Store the data on the side somewhere. Tell the device all data has been
sent, and arrange for this data to be flushed before accepting any more data.
This is bad because it allows the guest to allocate arbitrarily large[1]
buffers on the host. i.e. a fairly easily exploitable DoS attack.
c) Return a partial write to the guest. The guest already has to handle
retries due to EAGAIN, and DMA capable devices already have to handle partial
mappings, so this doesn't seem too onerous a requirement. This is not a new
concept, it's the same as the unix write(2)/send(2) functions.
Paul
[1] At least as large as guest RAM, per port.
next prev parent reply other threads:[~2010-12-02 17:34 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-01 9:54 [Qemu-devel] [PATCH v8 0/7] char: non-blocking writes, virtio-console flow control Amit Shah
2010-12-01 9:54 ` [Qemu-devel] [PATCH v8 1/7] virtio-console: Factor out common init between console and generic ports Amit Shah
2010-12-01 9:54 ` [Qemu-devel] [PATCH v8 2/7] char: Add a QemuChrHandlers struct to initialise chardev handlers Amit Shah
2010-12-01 9:54 ` [Qemu-devel] [PATCH v8 3/7] char: Introduce char_set/remove_fd_handlers() Amit Shah
2010-12-01 9:54 ` [Qemu-devel] [PATCH v8 4/7] char: Add framework for a 'write unblocked' callback Amit Shah
2010-12-01 9:54 ` [Qemu-devel] [PATCH v8 5/7] char: Update send_all() to handle nonblocking chardev write requests Amit Shah
2010-12-01 9:54 ` [Qemu-devel] [PATCH v8 6/7] char: Equip the unix/tcp backend to handle nonblocking writes Amit Shah
2010-12-01 9:54 ` [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data Amit Shah
2010-12-01 11:30 ` Paul Brook
2010-12-01 11:48 ` Amit Shah
2010-12-01 11:59 ` Paul Brook
2010-12-01 12:12 ` Amit Shah
2010-12-01 13:08 ` Paul Brook
2010-12-02 9:21 ` Amit Shah
2010-12-02 17:31 ` Paul Brook [this message]
2010-12-06 6:55 ` Amit Shah
2010-12-06 9:35 ` Paul Brook
2010-12-06 10:11 ` Amit Shah
2010-12-06 13:23 ` Paul Brook
2010-12-07 7:11 ` Amit Shah
2010-12-08 12:56 ` Paul Brook
2010-12-08 14:25 ` Amit Shah
2010-12-08 16:54 ` Paul Brook
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=201012021731.36291.paul@codesourcery.com \
--to=paul@codesourcery.com \
--cc=amit.shah@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@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).