From: Hannes Reinecke <hare@suse.de>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Stefan Haynoczi <stefanha@linux.vnet.ibm.com>,
kvm@vger.kernel.org, Alexander Graf <agraf@suse.de>,
Hannes Reinecke <hare@suse.de>
Subject: [PATCH 1/3] iov: Add 'offset' parameter to iov_to_buf()
Date: Fri, 1 Jul 2011 09:42:50 +0200 [thread overview]
Message-ID: <1309506172-17762-2-git-send-email-hare@suse.de> (raw)
In-Reply-To: <1309506172-17762-1-git-send-email-hare@suse.de>
Occasionally, the buffer needs to be placed at a offset within
the iovec when copying the buffer to the iovec.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
hw/virtio-net.c | 2 +-
hw/virtio-serial-bus.c | 2 +-
iov.c | 23 ++++++++++++++---------
iov.h | 2 +-
4 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 6997e02..a32cc01 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -657,7 +657,7 @@ static ssize_t virtio_net_receive(VLANClientState *nc, const uint8_t *buf, size_
/* copy in packet. ugh */
len = iov_from_buf(sg, elem.in_num,
- buf + offset, size - offset);
+ buf + offset, 0, size - offset);
total += len;
offset += len;
/* If buffers can't be merged, at this point we
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index 7f6db7b..53c58d0 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -103,7 +103,7 @@ static size_t write_to_port(VirtIOSerialPort *port,
}
len = iov_from_buf(elem.in_sg, elem.in_num,
- buf + offset, size - offset);
+ buf + offset, 0, size - offset);
offset += len;
virtqueue_push(vq, &elem, len);
diff --git a/iov.c b/iov.c
index 588cd04..9ead6ee 100644
--- a/iov.c
+++ b/iov.c
@@ -15,21 +15,26 @@
#include "iov.h"
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
- const void *buf, size_t size)
+ const void *buf, size_t offset, size_t size)
{
- size_t offset;
+ size_t iov_off, buf_off;
unsigned int i;
- offset = 0;
- for (i = 0; offset < size && i < iovcnt; i++) {
- size_t len;
+ iov_off = 0;
+ buf_off = 0;
+ for (i = 0; i < iovcnt && size; i++) {
+ if (offset < (iov_off + iov[i].iov_len)) {
+ size_t len = MIN((iov_off + iov[i].iov_len) - offset, size);
- len = MIN(iov[i].iov_len, size - offset);
+ memcpy(iov[i].iov_base + (offset - iov_off), buf + buf_off, len);
- memcpy(iov[i].iov_base, buf + offset, len);
- offset += len;
+ buf_off += len;
+ offset += len;
+ size -= len;
+ }
+ iov_off += iov[i].iov_len;
}
- return offset;
+ return buf_off;
}
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
diff --git a/iov.h b/iov.h
index 60a8547..2677527 100644
--- a/iov.h
+++ b/iov.h
@@ -13,7 +13,7 @@
#include "qemu-common.h"
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
- const void *buf, size_t size);
+ const void *buf, size_t offset, size_t size);
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
void *buf, size_t offset, size_t size);
size_t iov_size(const struct iovec *iov, const unsigned int iovcnt);
--
1.6.0.2
WARNING: multiple messages have this Message-ID (diff)
From: Hannes Reinecke <hare@suse.de>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Hannes Reinecke <hare@suse.de>,
Stefan Haynoczi <stefanha@linux.vnet.ibm.com>,
kvm@vger.kernel.org, Alexander Graf <agraf@suse.de>
Subject: [Qemu-devel] [PATCH 1/3] iov: Add 'offset' parameter to iov_to_buf()
Date: Fri, 1 Jul 2011 09:42:50 +0200 [thread overview]
Message-ID: <1309506172-17762-2-git-send-email-hare@suse.de> (raw)
In-Reply-To: <1309506172-17762-1-git-send-email-hare@suse.de>
Occasionally, the buffer needs to be placed at a offset within
the iovec when copying the buffer to the iovec.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
hw/virtio-net.c | 2 +-
hw/virtio-serial-bus.c | 2 +-
iov.c | 23 ++++++++++++++---------
iov.h | 2 +-
4 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 6997e02..a32cc01 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -657,7 +657,7 @@ static ssize_t virtio_net_receive(VLANClientState *nc, const uint8_t *buf, size_
/* copy in packet. ugh */
len = iov_from_buf(sg, elem.in_num,
- buf + offset, size - offset);
+ buf + offset, 0, size - offset);
total += len;
offset += len;
/* If buffers can't be merged, at this point we
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index 7f6db7b..53c58d0 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -103,7 +103,7 @@ static size_t write_to_port(VirtIOSerialPort *port,
}
len = iov_from_buf(elem.in_sg, elem.in_num,
- buf + offset, size - offset);
+ buf + offset, 0, size - offset);
offset += len;
virtqueue_push(vq, &elem, len);
diff --git a/iov.c b/iov.c
index 588cd04..9ead6ee 100644
--- a/iov.c
+++ b/iov.c
@@ -15,21 +15,26 @@
#include "iov.h"
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
- const void *buf, size_t size)
+ const void *buf, size_t offset, size_t size)
{
- size_t offset;
+ size_t iov_off, buf_off;
unsigned int i;
- offset = 0;
- for (i = 0; offset < size && i < iovcnt; i++) {
- size_t len;
+ iov_off = 0;
+ buf_off = 0;
+ for (i = 0; i < iovcnt && size; i++) {
+ if (offset < (iov_off + iov[i].iov_len)) {
+ size_t len = MIN((iov_off + iov[i].iov_len) - offset, size);
- len = MIN(iov[i].iov_len, size - offset);
+ memcpy(iov[i].iov_base + (offset - iov_off), buf + buf_off, len);
- memcpy(iov[i].iov_base, buf + offset, len);
- offset += len;
+ buf_off += len;
+ offset += len;
+ size -= len;
+ }
+ iov_off += iov[i].iov_len;
}
- return offset;
+ return buf_off;
}
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
diff --git a/iov.h b/iov.h
index 60a8547..2677527 100644
--- a/iov.h
+++ b/iov.h
@@ -13,7 +13,7 @@
#include "qemu-common.h"
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
- const void *buf, size_t size);
+ const void *buf, size_t offset, size_t size);
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
void *buf, size_t offset, size_t size);
size_t iov_size(const struct iovec *iov, const unsigned int iovcnt);
--
1.6.0.2
next prev parent reply other threads:[~2011-07-01 7:43 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-01 7:42 [PATCH 0/3] [v4] Megasas HBA emulation Hannes Reinecke
2011-07-01 7:42 ` [Qemu-devel] " Hannes Reinecke
2011-07-01 7:42 ` Hannes Reinecke [this message]
2011-07-01 7:42 ` [Qemu-devel] [PATCH 1/3] iov: Add 'offset' parameter to iov_to_buf() Hannes Reinecke
2011-07-01 7:42 ` [PATCH 2/3] scsi: replace 'tag' with 'hba_private' pointer Hannes Reinecke
2011-07-01 7:42 ` [Qemu-devel] " Hannes Reinecke
2011-07-01 7:42 ` [PATCH 3/3] megasas: LSI Megaraid SAS emulation Hannes Reinecke
2011-07-01 7:42 ` [Qemu-devel] " Hannes Reinecke
2011-07-01 9:16 ` Alexander Graf
2011-07-01 9:16 ` [Qemu-devel] " Alexander Graf
2011-07-03 8:09 ` Michael S. Tsirkin
2011-07-03 8:09 ` [Qemu-devel] " Michael S. Tsirkin
2011-07-01 8:27 ` [PATCH 2/3] scsi: replace 'tag' with 'hba_private' pointer Paolo Bonzini
2011-07-01 8:27 ` [Qemu-devel] " Paolo Bonzini
2011-07-01 8:57 ` Hannes Reinecke
2011-07-01 8:57 ` [Qemu-devel] " Hannes Reinecke
2011-07-01 13:11 ` Hannes Reinecke
2011-07-01 13:11 ` [Qemu-devel] " Hannes Reinecke
2011-07-01 14:33 ` Paolo Bonzini
2011-07-01 14:33 ` [Qemu-devel] " Paolo Bonzini
2011-07-01 8:02 ` [PATCH 1/3] iov: Add 'offset' parameter to iov_to_buf() Alexander Graf
2011-07-01 8:02 ` [Qemu-devel] " Alexander Graf
2011-07-01 8:07 ` Hannes Reinecke
2011-07-01 8:07 ` [Qemu-devel] " Hannes Reinecke
2011-07-01 8:11 ` Alexander Graf
2011-07-01 8:11 ` [Qemu-devel] " Alexander Graf
2011-07-01 8:03 ` Paolo Bonzini
2011-07-01 8:03 ` [Qemu-devel] " Paolo Bonzini
2011-07-01 8:04 ` Hannes Reinecke
2011-07-01 8:04 ` [Qemu-devel] " Hannes Reinecke
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=1309506172-17762-2-git-send-email-hare@suse.de \
--to=hare@suse.de \
--cc=agraf@suse.de \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.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 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.