qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 27/38] ivshmem: Simplify how we cope with short


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH 27/38] ivshmem: Simplify how we cope with short reads from server
Date: Wed, 02 Mar 2016 20:38:11 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Marc-André Lureau <address@hidden> writes:

> Hi
>
> On Mon, Feb 29, 2016 at 7:40 PM, Markus Armbruster <address@hidden> wrote:
>> 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.
>>
>> Replace the convoluted code
>
> agreed
>
>>
>> Signed-off-by: Markus Armbruster <address@hidden>
>> ---
>>  hw/misc/ivshmem.c | 76 
>> ++++++++++++-------------------------------------------
>>  1 file changed, 16 insertions(+), 60 deletions(-)
>>
>> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
>> index e578b8a..fb8a4f7 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,8 +621,12 @@ static void ivshmem_read(void *opaque, const uint8_t 
>> *buf, int size)
>>      int incoming_fd;
>>      int64_t incoming_posn;
>>
>> -    if (!fifo_update_and_get_i64(s, buf, size, &incoming_posn)) {
>> -        return;
>> +    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)) {
>> +        incoming_posn = le64_to_cpu(s->msg_buf);
>> +        s->msg_buffered_bytes = 0;
>>      }
>>
>
> missing "else return" though.

Indeed.  Glad you caught my screwup.

>>      incoming_fd = qemu_chr_fe_get_msgfd(s->server_chr);
>> @@ -1019,8 +979,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'");
>> @@ -1033,8 +991,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
>>
>>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]