* [PATCH 1/4] Add method to send fragmented packets
@ 2008-05-13 19:13 Anthony Liguori
2008-05-13 19:13 ` [PATCH 2/4] Add fd_readv handler to tap Anthony Liguori
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Anthony Liguori @ 2008-05-13 19:13 UTC (permalink / raw)
To: kvm-devel; +Cc: Anthony Liguori, Avi Kivity
We need to be able to send fragmented packets in KVM to avoid an extra copy
in the TX path. This patch adds a qemu_sendv_packet() function to send
fragemented packets. It also provides backwards compatibility for old clients
that don't support the new interface.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/qemu/net.h b/qemu/net.h
index 13daa27..5fb190e 100644
--- a/qemu/net.h
+++ b/qemu/net.h
@@ -1,12 +1,17 @@
#ifndef QEMU_NET_H
#define QEMU_NET_H
+#include <sys/uio.h>
+
/* VLANs support */
+typedef ssize_t (IOReadvHandler)(void *, const struct iovec *, int);
+
typedef struct VLANClientState VLANClientState;
struct VLANClientState {
IOReadHandler *fd_read;
+ IOReadvHandler *fd_readv;
/* Packets may still be sent if this returns zero. It's used to
rate-limit the slirp code. */
IOCanRWHandler *fd_can_read;
@@ -30,6 +35,8 @@ VLANClientState *qemu_new_vlan_client(VLANState *vlan,
void *opaque);
int qemu_can_send_packet(VLANClientState *vc);
void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size);
+ssize_t qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov,
+ int iovcnt);
void qemu_handler_true(void *opaque);
void do_info_network(void);
diff --git a/qemu/vl.c b/qemu/vl.c
index 45c97af..1f0a6ac 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -3820,6 +3820,50 @@ void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
}
}
+static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
+ int iovcnt)
+{
+ char buffer[4096];
+ size_t offset = 0;
+ int i;
+
+ for (i = 0; i < iovcnt; i++) {
+ size_t len;
+
+ len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
+ memcpy(buffer + offset, iov[i].iov_base, len);
+ offset += len;
+ }
+
+ vc->fd_read(vc->opaque, buffer, offset);
+
+ return offset;
+}
+
+ssize_t qemu_sendv_packet(VLANClientState *vc1, const struct iovec *iov,
+ int iovcnt)
+{
+ VLANState *vlan = vc1->vlan;
+ VLANClientState *vc;
+ ssize_t max_len = 0;
+
+ for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
+ ssize_t len = 0;
+
+ if (vc == vc1)
+ continue;
+
+ if (vc->fd_readv)
+ len = vc->fd_readv(vc->opaque, iov, iovcnt);
+ else if (vc->fd_read)
+ len = vc_sendv_compat(vc, iov, iovcnt);
+
+ max_len = MAX(max_len, len);
+ }
+
+ return max_len;
+}
+
#if defined(CONFIG_SLIRP)
/* slirp network adapter */
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/4] Add fd_readv handler to tap
2008-05-13 19:13 [PATCH 1/4] Add method to send fragmented packets Anthony Liguori
@ 2008-05-13 19:13 ` Anthony Liguori
2008-05-13 19:13 ` [PATCH 3/4] Use fragmented send for virtio Anthony Liguori
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Anthony Liguori @ 2008-05-13 19:13 UTC (permalink / raw)
To: kvm-devel; +Cc: Anthony Liguori, Avi Kivity
This allows fragmented packets to be sent with no additional copies over the
tap interface.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/qemu/vl.c b/qemu/vl.c
index 1f0a6ac..7900b76 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -4086,6 +4086,19 @@ static void tap_receive(void *opaque, const uint8_t *buf, int size)
}
}
+static ssize_t tap_readv(void *opaque, const struct iovec *iov,
+ int iovcnt)
+{
+ TAPState *s = opaque;
+ ssize_t len;
+
+ do {
+ len = writev(s->fd, iov, iovcnt);
+ } while (len == -1 && (errno == EINTR || errno == EAGAIN));
+
+ return len;
+}
+
static void tap_send(void *opaque)
{
TAPState *s = opaque;
@@ -4135,6 +4148,7 @@ static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
s->no_poll = 0;
enable_sigio_timer(fd);
s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
+ s->vc->fd_readv = tap_readv;
qemu_set_fd_handler2(s->fd, tap_read_poll, tap_send, NULL, s);
snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
return s;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/4] Use fragmented send for virtio
2008-05-13 19:13 [PATCH 1/4] Add method to send fragmented packets Anthony Liguori
2008-05-13 19:13 ` [PATCH 2/4] Add fd_readv handler to tap Anthony Liguori
@ 2008-05-13 19:13 ` Anthony Liguori
2008-05-13 19:13 ` [PATCH 4/4] Validate virtio-net TX header Anthony Liguori
2008-05-14 12:38 ` [PATCH 1/4] Add method to send fragmented packets Avi Kivity
3 siblings, 0 replies; 5+ messages in thread
From: Anthony Liguori @ 2008-05-13 19:13 UTC (permalink / raw)
To: kvm-devel; +Cc: Anthony Liguori, Avi Kivity
This patch converts virtio-net to use the new fragmented send interface.
We should have always supported this.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c
index 85cc9d2..93bca1d 100644
--- a/qemu/hw/virtio-net.c
+++ b/qemu/hw/virtio-net.c
@@ -239,23 +239,15 @@ again:
static void virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq)
{
VirtQueueElement elem;
- int count = 0;
if (!(n->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK))
return;
while (virtqueue_pop(vq, &elem)) {
- int i;
- size_t len = 0;
+ ssize_t len = 0;
/* ignore the header for now */
- for (i = 1; i < elem.out_num; i++) {
- qemu_send_packet(n->vc, elem.out_sg[i].iov_base,
- elem.out_sg[i].iov_len);
- len += elem.out_sg[i].iov_len;
- }
-
- count++;
+ len = qemu_sendv_packet(n->vc, &elem.out_sg[1], elem.out_num - 1);
virtqueue_push(vq, &elem, sizeof(struct virtio_net_hdr) + len);
virtio_notify(&n->vdev, vq);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/4] Validate virtio-net TX header
2008-05-13 19:13 [PATCH 1/4] Add method to send fragmented packets Anthony Liguori
2008-05-13 19:13 ` [PATCH 2/4] Add fd_readv handler to tap Anthony Liguori
2008-05-13 19:13 ` [PATCH 3/4] Use fragmented send for virtio Anthony Liguori
@ 2008-05-13 19:13 ` Anthony Liguori
2008-05-14 12:38 ` [PATCH 1/4] Add method to send fragmented packets Avi Kivity
3 siblings, 0 replies; 5+ messages in thread
From: Anthony Liguori @ 2008-05-13 19:13 UTC (permalink / raw)
To: kvm-devel; +Cc: Anthony Liguori, Avi Kivity
Missed this one in my last series.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c
index 93bca1d..ca45775 100644
--- a/qemu/hw/virtio-net.c
+++ b/qemu/hw/virtio-net.c
@@ -246,6 +246,12 @@ static void virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq)
while (virtqueue_pop(vq, &elem)) {
ssize_t len = 0;
+ if (elem.out_num < 1 ||
+ elem.out_sg[0].iov_len != sizeof(struct virtio_net_hdr)) {
+ fprintf(stderr, "virtio-net header not in first element\n");
+ exit(1);
+ }
+
/* ignore the header for now */
len = qemu_sendv_packet(n->vc, &elem.out_sg[1], elem.out_num - 1);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/4] Add method to send fragmented packets
2008-05-13 19:13 [PATCH 1/4] Add method to send fragmented packets Anthony Liguori
` (2 preceding siblings ...)
2008-05-13 19:13 ` [PATCH 4/4] Validate virtio-net TX header Anthony Liguori
@ 2008-05-14 12:38 ` Avi Kivity
3 siblings, 0 replies; 5+ messages in thread
From: Avi Kivity @ 2008-05-14 12:38 UTC (permalink / raw)
To: Anthony Liguori; +Cc: kvm-devel
Anthony Liguori wrote:
> We need to be able to send fragmented packets in KVM to avoid an extra copy
> in the TX path. This patch adds a qemu_sendv_packet() function to send
> fragemented packets. It also provides backwards compatibility for old clients
> that don't support the new interface.
>
Applied all, thanks.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-05-14 12:38 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-13 19:13 [PATCH 1/4] Add method to send fragmented packets Anthony Liguori
2008-05-13 19:13 ` [PATCH 2/4] Add fd_readv handler to tap Anthony Liguori
2008-05-13 19:13 ` [PATCH 3/4] Use fragmented send for virtio Anthony Liguori
2008-05-13 19:13 ` [PATCH 4/4] Validate virtio-net TX header Anthony Liguori
2008-05-14 12:38 ` [PATCH 1/4] Add method to send fragmented packets Avi Kivity
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.