From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: claudio.fontana@huawei.com, cam@cs.ualberta.ca,
mlureau@redhat.com, david.marchand@6wind.com,
pbonzini@redhat.com
Subject: [Qemu-devel] [PATCH v3 29/40] ivshmem: Simplify how we cope with short reads from server
Date: Tue, 15 Mar 2016 19:34:44 +0100 [thread overview]
Message-ID: <1458066895-20632-30-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1458066895-20632-1-git-send-email-armbru@redhat.com>
Short reads from a UNIX domain sockets are exceedingly unlikely when
the other side always sends eight bytes and we always read eight
bytes. We cope with them anyway. However, the code doing that is
rather convoluted. Dumb it down radically.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
hw/misc/ivshmem.c | 75 ++++++++++++-------------------------------------------
1 file changed, 16 insertions(+), 59 deletions(-)
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index c1a75db..7b9e769 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -26,7 +26,6 @@
#include "migration/migration.h"
#include "qemu/error-report.h"
#include "qemu/event_notifier.h"
-#include "qemu/fifo8.h"
#include "sysemu/char.h"
#include "sysemu/hostmem.h"
#include "qapi/visitor.h"
@@ -80,7 +79,6 @@ typedef struct IVShmemState {
uint32_t intrstatus;
CharDriverState *server_chr;
- Fifo8 incoming_fifo;
MemoryRegion ivshmem_mmio;
/* We might need to register the BAR before we actually have the memory.
@@ -99,6 +97,8 @@ typedef struct IVShmemState {
uint32_t vectors;
uint32_t features;
MSIVector *msi_vectors;
+ uint64_t msg_buf; /* buffer for receiving server messages */
+ int msg_buffered_bytes; /* #bytes in @msg_buf */
Error *migration_blocker;
@@ -255,11 +255,6 @@ static const MemoryRegionOps ivshmem_mmio_ops = {
},
};
-static int ivshmem_can_receive(void * opaque)
-{
- return sizeof(int64_t);
-}
-
static void ivshmem_vector_notify(void *opaque)
{
MSIVector *entry = opaque;
@@ -459,53 +454,6 @@ static void resize_peers(IVShmemState *s, int nb_peers)
}
}
-static bool fifo_update_and_get(IVShmemState *s, const uint8_t *buf, int size,
- void *data, size_t len)
-{
- const uint8_t *p;
- uint32_t num;
-
- assert(len <= sizeof(int64_t)); /* limitation of the fifo */
- if (fifo8_is_empty(&s->incoming_fifo) && size == len) {
- memcpy(data, buf, size);
- return true;
- }
-
- IVSHMEM_DPRINTF("short read of %d bytes\n", size);
-
- num = MIN(size, sizeof(int64_t) - fifo8_num_used(&s->incoming_fifo));
- fifo8_push_all(&s->incoming_fifo, buf, num);
-
- if (fifo8_num_used(&s->incoming_fifo) < len) {
- assert(num == 0);
- return false;
- }
-
- size -= num;
- buf += num;
- p = fifo8_pop_buf(&s->incoming_fifo, len, &num);
- assert(num == len);
-
- memcpy(data, p, len);
-
- if (size > 0) {
- fifo8_push_all(&s->incoming_fifo, buf, size);
- }
-
- return true;
-}
-
-static bool fifo_update_and_get_i64(IVShmemState *s,
- const uint8_t *buf, int size, int64_t *i64)
-{
- if (fifo_update_and_get(s, buf, size, i64, sizeof(*i64))) {
- *i64 = GINT64_FROM_LE(*i64);
- return true;
- }
-
- return false;
-}
-
static void ivshmem_add_kvm_msi_virq(IVShmemState *s, int vector,
Error **errp)
{
@@ -658,6 +606,14 @@ static void process_msg(IVShmemState *s, int64_t msg, int fd, Error **errp)
}
}
+static int ivshmem_can_receive(void *opaque)
+{
+ IVShmemState *s = opaque;
+
+ assert(s->msg_buffered_bytes < sizeof(s->msg_buf));
+ return sizeof(s->msg_buf) - s->msg_buffered_bytes;
+}
+
static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
{
IVShmemState *s = opaque;
@@ -665,9 +621,14 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
int fd;
int64_t msg;
- if (!fifo_update_and_get_i64(s, buf, size, &msg)) {
+ assert(size >= 0 && s->msg_buffered_bytes + size <= sizeof(s->msg_buf));
+ memcpy((unsigned char *)&s->msg_buf + s->msg_buffered_bytes, buf, size);
+ s->msg_buffered_bytes += size;
+ if (s->msg_buffered_bytes < sizeof(s->msg_buf)) {
return;
}
+ msg = le64_to_cpu(s->msg_buf);
+ s->msg_buffered_bytes = 0;
fd = qemu_chr_fe_get_msgfd(s->server_chr);
IVSHMEM_DPRINTF("posn is %" PRId64 ", fd is %d\n", msg, fd);
@@ -1022,8 +983,6 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp)
}
}
- fifo8_create(&s->incoming_fifo, sizeof(int64_t));
-
if (s->role_val == IVSHMEM_PEER) {
error_setg(&s->migration_blocker,
"Migration is disabled when using feature 'peer mode' in device 'ivshmem'");
@@ -1036,8 +995,6 @@ static void pci_ivshmem_exit(PCIDevice *dev)
IVShmemState *s = IVSHMEM(dev);
int i;
- fifo8_destroy(&s->incoming_fifo);
-
if (s->migration_blocker) {
migrate_del_blocker(s->migration_blocker);
error_free(s->migration_blocker);
--
2.4.3
next prev parent reply other threads:[~2016-03-15 18:35 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-15 18:34 [Qemu-devel] [PATCH v3 00/40] ivshmem: Fixes, cleanups, device model split Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 01/40] target-ppc: Document TOCTTOU in hugepage support Markus Armbruster
2016-03-18 15:04 ` Marc-André Lureau
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 02/40] ivshmem-server: Fix and clean up command line help Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 03/40] ivshmem-server: Don't overload POSIX shmem and file name Markus Armbruster
2016-03-18 15:04 ` Marc-André Lureau
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 04/40] qemu-doc: Fix ivshmem huge page example Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 05/40] event_notifier: Make event_notifier_init_fd() #ifdef CONFIG_EVENTFD Markus Armbruster
2016-03-21 12:48 ` Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 06/40] tests/libqos/pci-pc: Fix qpci_pc_iomap() to map BARs aligned Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 07/40] ivshmem-test: Improve test case /ivshmem/single Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 08/40] ivshmem-test: Clean up wait for devices to become operational Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 09/40] ivshmem-test: Improve test cases /ivshmem/server-* Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 10/40] ivshmem: Rewrite specification document Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 11/40] ivshmem: Add missing newlines to debug printfs Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 12/40] ivshmem: Compile debug prints unconditionally to prevent bit-rot Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 13/40] ivshmem: Clean up after commit 9940c32 Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 14/40] ivshmem: Drop ivshmem_event() stub Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 15/40] ivshmem: Don't destroy the chardev on version mismatch Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 16/40] ivshmem: Fix harmless misuse of Error Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 17/40] ivshmem: Failed realize() can leave migration blocker behind Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 18/40] ivshmem: Clean up register callbacks Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 19/40] ivshmem: Clean up MSI-X conditions Markus Armbruster
2016-03-18 15:04 ` Marc-André Lureau
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 20/40] ivshmem: Leave INTx alone when using MSI-X Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 21/40] ivshmem: Assert interrupts are set up once Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 22/40] ivshmem: Simplify rejection of invalid peer ID from server Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 23/40] ivshmem: Disentangle ivshmem_read() Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 24/40] ivshmem: Plug leaks on unplug, fix peer disconnect Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 25/40] ivshmem: Receive shared memory synchronously in realize() Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 26/40] ivshmem: Propagate errors through ivshmem_recv_setup() Markus Armbruster
2016-03-18 15:04 ` Marc-André Lureau
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 27/40] ivshmem: Rely on server sending the ID right after the version Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 28/40] ivshmem: Drop the hackish test for UNIX domain chardev Markus Armbruster
2016-03-15 18:34 ` Markus Armbruster [this message]
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 30/40] ivshmem: Tighten check of property "size" Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 31/40] ivshmem: Implement shm=... with a memory backend Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 32/40] ivshmem: Simplify memory regions for BAR 2 (shared memory) Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 33/40] ivshmem: Inline check_shm_size() into its only caller Markus Armbruster
2016-03-18 15:04 ` Marc-André Lureau
2016-03-18 16:50 ` Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 34/40] qdev: New DEFINE_PROP_ON_OFF_AUTO Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 35/40] ivshmem: Replace int role_val by OnOffAuto master Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 36/40] ivshmem: Split ivshmem-plain, ivshmem-doorbell off ivshmem Markus Armbruster
2016-03-21 12:32 ` Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 37/40] ivshmem: Clean up after the previous commit Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 38/40] ivshmem: Drop ivshmem property x-memdev Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 39/40] ivshmem: Require master to have ID zero Markus Armbruster
2016-03-15 18:34 ` [Qemu-devel] [PATCH v3 40/40] contrib/ivshmem-server: Print "not for production" warning Markus Armbruster
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=1458066895-20632-30-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=cam@cs.ualberta.ca \
--cc=claudio.fontana@huawei.com \
--cc=david.marchand@6wind.com \
--cc=mlureau@redhat.com \
--cc=pbonzini@redhat.com \
--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 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).