qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v1 16/22] migration: delete QEMUSizedBuffer stru


From: Dr. David Alan Gilbert
Subject: Re: [Qemu-devel] [PATCH v1 16/22] migration: delete QEMUSizedBuffer struct
Date: Wed, 3 Feb 2016 09:55:33 +0000
User-agent: Mutt/1.5.24 (2015-08-30)

* Daniel P. Berrange (address@hidden) wrote:
> Now that we don't have have a buffer based QemuFile
> implementation, the QEMUSizedBuffer code is also
> unused and can be deleted. A simpler buffer class
> also exists in util/buffer.c which other code can
> used as needed.
> 
> Signed-off-by: Daniel P. Berrange <address@hidden>

Reviewed-by: Dr. David Alan Gilbert <address@hidden>

> ---
>  include/migration/qemu-file.h |  16 --
>  include/qemu/typedefs.h       |   1 -
>  migration/Makefile.objs       |   2 +-
>  migration/qemu-file-buf.c     | 367 
> ------------------------------------------
>  4 files changed, 1 insertion(+), 385 deletions(-)
>  delete mode 100644 migration/qemu-file-buf.c
> 
> diff --git a/include/migration/qemu-file.h b/include/migration/qemu-file.h
> index 6b12960..da67931 100644
> --- a/include/migration/qemu-file.h
> +++ b/include/migration/qemu-file.h
> @@ -127,13 +127,6 @@ typedef struct QEMUFileHooks {
>      QEMURamSaveFunc *save_page;
>  } QEMUFileHooks;
>  
> -struct QEMUSizedBuffer {
> -    struct iovec *iov;
> -    size_t n_iov;
> -    size_t size; /* total allocated size in all iov's */
> -    size_t used; /* number of used bytes */
> -};
> -
>  QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops);
>  QEMUFile *qemu_fopen(const char *filename, const char *mode);
>  QEMUFile *qemu_fdopen(int fd, const char *mode);
> @@ -156,15 +149,6 @@ void qemu_put_buffer_async(QEMUFile *f, const uint8_t 
> *buf, size_t size);
>  bool qemu_file_mode_is_not_valid(const char *mode);
>  bool qemu_file_is_writable(QEMUFile *f);
>  
> -QEMUSizedBuffer *qsb_create(const uint8_t *buffer, size_t len);
> -void qsb_free(QEMUSizedBuffer *);
> -size_t qsb_set_length(QEMUSizedBuffer *qsb, size_t length);
> -size_t qsb_get_length(const QEMUSizedBuffer *qsb);
> -ssize_t qsb_get_buffer(const QEMUSizedBuffer *, off_t start, size_t count,
> -                       uint8_t *buf);
> -ssize_t qsb_write_at(QEMUSizedBuffer *qsb, const uint8_t *buf,
> -                     off_t pos, size_t count);
> -
>  
>  static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
>  {
> diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
> index 78fe6e8..3f8dfbf 100644
> --- a/include/qemu/typedefs.h
> +++ b/include/qemu/typedefs.h
> @@ -77,7 +77,6 @@ typedef struct QemuOpt QemuOpt;
>  typedef struct QemuOpts QemuOpts;
>  typedef struct QemuOptsList QemuOptsList;
>  typedef struct QEMUSGList QEMUSGList;
> -typedef struct QEMUSizedBuffer QEMUSizedBuffer;
>  typedef struct QEMUTimer QEMUTimer;
>  typedef struct QEMUTimerListGroup QEMUTimerListGroup;
>  typedef struct QObject QObject;
> diff --git a/migration/Makefile.objs b/migration/Makefile.objs
> index 3c90c44..8ecb941 100644
> --- a/migration/Makefile.objs
> +++ b/migration/Makefile.objs
> @@ -1,6 +1,6 @@
>  common-obj-y += migration.o tcp.o unix.o fd.o exec.o
>  common-obj-y += vmstate.o
> -common-obj-y += qemu-file.o qemu-file-buf.o qemu-file-unix.o 
> qemu-file-stdio.o
> +common-obj-y += qemu-file.o qemu-file-unix.o qemu-file-stdio.o
>  common-obj-y += qemu-file-channel.o
>  common-obj-y += xbzrle.o postcopy-ram.o
>  
> diff --git a/migration/qemu-file-buf.c b/migration/qemu-file-buf.c
> deleted file mode 100644
> index c0bc38c..0000000
> --- a/migration/qemu-file-buf.c
> +++ /dev/null
> @@ -1,367 +0,0 @@
> -/*
> - * QEMU System Emulator
> - *
> - * Copyright (c) 2003-2008 Fabrice Bellard
> - * Copyright (c) 2014 IBM Corp.
> - *
> - * Authors:
> - *  Stefan Berger <address@hidden>
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a 
> copy
> - * of this software and associated documentation files (the "Software"), to 
> deal
> - * in the Software without restriction, including without limitation the 
> rights
> - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> - * copies of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be included in
> - * all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
> FROM,
> - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> - * THE SOFTWARE.
> - */
> -#include "qemu-common.h"
> -#include "qemu/error-report.h"
> -#include "qemu/iov.h"
> -#include "qemu/sockets.h"
> -#include "qemu/coroutine.h"
> -#include "migration/migration.h"
> -#include "migration/qemu-file.h"
> -#include "migration/qemu-file-internal.h"
> -#include "trace.h"
> -
> -#define QSB_CHUNK_SIZE      (1 << 10)
> -#define QSB_MAX_CHUNK_SIZE  (16 * QSB_CHUNK_SIZE)
> -
> -/**
> - * Create a QEMUSizedBuffer
> - * This type of buffer uses scatter-gather lists internally and
> - * can grow to any size. Any data array in the scatter-gather list
> - * can hold different amount of bytes.
> - *
> - * @buffer: Optional buffer to copy into the QSB
> - * @len: size of initial buffer; if @buffer is given, buffer must
> - *       hold at least len bytes
> - *
> - * Returns a pointer to a QEMUSizedBuffer or NULL on allocation failure
> - */
> -QEMUSizedBuffer *qsb_create(const uint8_t *buffer, size_t len)
> -{
> -    QEMUSizedBuffer *qsb;
> -    size_t alloc_len, num_chunks, i, to_copy;
> -    size_t chunk_size = (len > QSB_MAX_CHUNK_SIZE)
> -                        ? QSB_MAX_CHUNK_SIZE
> -                        : QSB_CHUNK_SIZE;
> -
> -    num_chunks = DIV_ROUND_UP(len ? len : QSB_CHUNK_SIZE, chunk_size);
> -    alloc_len = num_chunks * chunk_size;
> -
> -    qsb = g_try_new0(QEMUSizedBuffer, 1);
> -    if (!qsb) {
> -        return NULL;
> -    }
> -
> -    qsb->iov = g_try_new0(struct iovec, num_chunks);
> -    if (!qsb->iov) {
> -        g_free(qsb);
> -        return NULL;
> -    }
> -
> -    qsb->n_iov = num_chunks;
> -
> -    for (i = 0; i < num_chunks; i++) {
> -        qsb->iov[i].iov_base = g_try_malloc0(chunk_size);
> -        if (!qsb->iov[i].iov_base) {
> -            /* qsb_free is safe since g_free can cope with NULL */
> -            qsb_free(qsb);
> -            return NULL;
> -        }
> -
> -        qsb->iov[i].iov_len = chunk_size;
> -        if (buffer) {
> -            to_copy = (len - qsb->used) > chunk_size
> -                      ? chunk_size : (len - qsb->used);
> -            memcpy(qsb->iov[i].iov_base, &buffer[qsb->used], to_copy);
> -            qsb->used += to_copy;
> -        }
> -    }
> -
> -    qsb->size = alloc_len;
> -
> -    return qsb;
> -}
> -
> -/**
> - * Free the QEMUSizedBuffer
> - *
> - * @qsb: The QEMUSizedBuffer to free
> - */
> -void qsb_free(QEMUSizedBuffer *qsb)
> -{
> -    size_t i;
> -
> -    if (!qsb) {
> -        return;
> -    }
> -
> -    for (i = 0; i < qsb->n_iov; i++) {
> -        g_free(qsb->iov[i].iov_base);
> -    }
> -    g_free(qsb->iov);
> -    g_free(qsb);
> -}
> -
> -/**
> - * Get the number of used bytes in the QEMUSizedBuffer
> - *
> - * @qsb: A QEMUSizedBuffer
> - *
> - * Returns the number of bytes currently used in this buffer
> - */
> -size_t qsb_get_length(const QEMUSizedBuffer *qsb)
> -{
> -    return qsb->used;
> -}
> -
> -/**
> - * Set the length of the buffer; the primary usage of this
> - * function is to truncate the number of used bytes in the buffer.
> - * The size will not be extended beyond the current number of
> - * allocated bytes in the QEMUSizedBuffer.
> - *
> - * @qsb: A QEMUSizedBuffer
> - * @new_len: The new length of bytes in the buffer
> - *
> - * Returns the number of bytes the buffer was truncated or extended
> - * to.
> - */
> -size_t qsb_set_length(QEMUSizedBuffer *qsb, size_t new_len)
> -{
> -    if (new_len <= qsb->size) {
> -        qsb->used = new_len;
> -    } else {
> -        qsb->used = qsb->size;
> -    }
> -    return qsb->used;
> -}
> -
> -/**
> - * Get the iovec that holds the data for a given position @pos.
> - *
> - * @qsb: A QEMUSizedBuffer
> - * @pos: The index of a byte in the buffer
> - * @d_off: Pointer to an offset that this function will indicate
> - *         at what position within the returned iovec the byte
> - *         is to be found
> - *
> - * Returns the index of the iovec that holds the byte at the given
> - * index @pos in the byte stream; a negative number if the iovec
> - * for the given position @pos does not exist.
> - */
> -static ssize_t qsb_get_iovec(const QEMUSizedBuffer *qsb,
> -                             off_t pos, off_t *d_off)
> -{
> -    ssize_t i;
> -    off_t curr = 0;
> -
> -    if (pos > qsb->used) {
> -        return -1;
> -    }
> -
> -    for (i = 0; i < qsb->n_iov; i++) {
> -        if (curr + qsb->iov[i].iov_len > pos) {
> -            *d_off = pos - curr;
> -            return i;
> -        }
> -        curr += qsb->iov[i].iov_len;
> -    }
> -    return -1;
> -}
> -
> -/*
> - * Convert the QEMUSizedBuffer into a flat buffer.
> - *
> - * Note: If at all possible, try to avoid this function since it
> - *       may unnecessarily copy memory around.
> - *
> - * @qsb: pointer to QEMUSizedBuffer
> - * @start: offset to start at
> - * @count: number of bytes to copy
> - * @buf: a pointer to a buffer to write into (at least @count bytes)
> - *
> - * Returns the number of bytes copied into the output buffer
> - */
> -ssize_t qsb_get_buffer(const QEMUSizedBuffer *qsb, off_t start,
> -                       size_t count, uint8_t *buffer)
> -{
> -    const struct iovec *iov;
> -    size_t to_copy, all_copy;
> -    ssize_t index;
> -    off_t s_off;
> -    off_t d_off = 0;
> -    char *s;
> -
> -    if (start > qsb->used) {
> -        return 0;
> -    }
> -
> -    all_copy = qsb->used - start;
> -    if (all_copy > count) {
> -        all_copy = count;
> -    } else {
> -        count = all_copy;
> -    }
> -
> -    index = qsb_get_iovec(qsb, start, &s_off);
> -    if (index < 0) {
> -        return 0;
> -    }
> -
> -    while (all_copy > 0) {
> -        iov = &qsb->iov[index];
> -
> -        s = iov->iov_base;
> -
> -        to_copy = iov->iov_len - s_off;
> -        if (to_copy > all_copy) {
> -            to_copy = all_copy;
> -        }
> -        memcpy(&buffer[d_off], &s[s_off], to_copy);
> -
> -        d_off += to_copy;
> -        all_copy -= to_copy;
> -
> -        s_off = 0;
> -        index++;
> -    }
> -
> -    return count;
> -}
> -
> -/**
> - * Grow the QEMUSizedBuffer to the given size and allocate
> - * memory for it.
> - *
> - * @qsb: A QEMUSizedBuffer
> - * @new_size: The new size of the buffer
> - *
> - * Return:
> - *    a negative error code in case of memory allocation failure
> - * or
> - *    the new size of the buffer. The returned size may be greater or equal
> - *    to @new_size.
> - */
> -static ssize_t qsb_grow(QEMUSizedBuffer *qsb, size_t new_size)
> -{
> -    size_t needed_chunks, i;
> -
> -    if (qsb->size < new_size) {
> -        struct iovec *new_iov;
> -        size_t size_diff = new_size - qsb->size;
> -        size_t chunk_size = (size_diff > QSB_MAX_CHUNK_SIZE)
> -                             ? QSB_MAX_CHUNK_SIZE : QSB_CHUNK_SIZE;
> -
> -        needed_chunks = DIV_ROUND_UP(size_diff, chunk_size);
> -
> -        new_iov = g_try_new(struct iovec, qsb->n_iov + needed_chunks);
> -        if (new_iov == NULL) {
> -            return -ENOMEM;
> -        }
> -
> -        /* Allocate new chunks as needed into new_iov */
> -        for (i = qsb->n_iov; i < qsb->n_iov + needed_chunks; i++) {
> -            new_iov[i].iov_base = g_try_malloc0(chunk_size);
> -            new_iov[i].iov_len = chunk_size;
> -            if (!new_iov[i].iov_base) {
> -                size_t j;
> -
> -                /* Free previously allocated new chunks */
> -                for (j = qsb->n_iov; j < i; j++) {
> -                    g_free(new_iov[j].iov_base);
> -                }
> -                g_free(new_iov);
> -
> -                return -ENOMEM;
> -            }
> -        }
> -
> -        /*
> -         * Now we can't get any allocation errors, copy over to new iov
> -         * and switch.
> -         */
> -        for (i = 0; i < qsb->n_iov; i++) {
> -            new_iov[i] = qsb->iov[i];
> -        }
> -
> -        qsb->n_iov += needed_chunks;
> -        g_free(qsb->iov);
> -        qsb->iov = new_iov;
> -        qsb->size += (needed_chunks * chunk_size);
> -    }
> -
> -    return qsb->size;
> -}
> -
> -/**
> - * Write into the QEMUSizedBuffer at a given position and a given
> - * number of bytes. This function will automatically grow the
> - * QEMUSizedBuffer.
> - *
> - * @qsb: A QEMUSizedBuffer
> - * @source: A byte array to copy data from
> - * @pos: The position within the @qsb to write data to
> - * @size: The number of bytes to copy into the @qsb
> - *
> - * Returns @size or a negative error code in case of memory allocation 
> failure,
> - *           or with an invalid 'pos'
> - */
> -ssize_t qsb_write_at(QEMUSizedBuffer *qsb, const uint8_t *source,
> -                     off_t pos, size_t count)
> -{
> -    ssize_t rc = qsb_grow(qsb, pos + count);
> -    size_t to_copy;
> -    size_t all_copy = count;
> -    const struct iovec *iov;
> -    ssize_t index;
> -    char *dest;
> -    off_t d_off, s_off = 0;
> -
> -    if (rc < 0) {
> -        return rc;
> -    }
> -
> -    if (pos + count > qsb->used) {
> -        qsb->used = pos + count;
> -    }
> -
> -    index = qsb_get_iovec(qsb, pos, &d_off);
> -    if (index < 0) {
> -        return -EINVAL;
> -    }
> -
> -    while (all_copy > 0) {
> -        iov = &qsb->iov[index];
> -
> -        dest = iov->iov_base;
> -
> -        to_copy = iov->iov_len - d_off;
> -        if (to_copy > all_copy) {
> -            to_copy = all_copy;
> -        }
> -
> -        memcpy(&dest[d_off], &source[s_off], to_copy);
> -
> -        s_off += to_copy;
> -        all_copy -= to_copy;
> -
> -        d_off = 0;
> -        index++;
> -    }
> -
> -    return count;
> -}
> -- 
> 2.5.0
> 
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK



reply via email to

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