qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH -V4 08/21] virtio-9p: Add sg helper functions


From: Aneesh Kumar K.V
Subject: [Qemu-devel] [PATCH -V4 08/21] virtio-9p: Add sg helper functions
Date: Fri, 9 Apr 2010 17:13:11 +0530

From: Anthony Liguori <address@hidden>

Add scatter-gather helper functions.

Signed-off-by: Anthony Liguori <address@hidden>
Signed-off-by: Aneesh Kumar K.V <address@hidden>
---
 hw/virtio-9p.c |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c
index 4b3ce2f..5dab1d3 100644
--- a/hw/virtio-9p.c
+++ b/hw/virtio-9p.c
@@ -764,6 +764,56 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name,
     return 0;
 }
 
+static struct iovec *adjust_sg(struct iovec *sg, int len, int *iovcnt)
+{
+    while (len && *iovcnt) {
+        if (len < sg->iov_len) {
+            sg->iov_len -= len;
+            sg->iov_base += len;
+            len = 0;
+        } else {
+            len -= sg->iov_len;
+            sg++;
+            *iovcnt -= 1;
+        }
+    }
+
+    return sg;
+}
+
+static struct iovec *cap_sg(struct iovec *sg, int cap, int *cnt)
+{
+    int i;
+    int total = 0;
+
+    for (i = 0; i < *cnt; i++) {
+        if ((total + sg[i].iov_len) > cap) {
+            sg[i].iov_len -= ((total + sg[i].iov_len) - cap);
+            i++;
+            break;
+        }
+        total += sg[i].iov_len;
+    }
+
+    *cnt = i;
+
+    return sg;
+}
+
+static void print_sg(struct iovec *sg, int cnt)
+{
+    int i;
+
+    printf("sg[%d]: {", cnt);
+    for (i = 0; i < cnt; i++) {
+        if (i) {
+            printf(", ");
+        }
+        printf("(%p, %zd)", sg[i].iov_base, sg[i].iov_len);
+    }
+    printf("}\n");
+}
+
 static void v9fs_dummy(V9fsState *s, V9fsPDU *pdu)
 {
     /* Note: The following have been added to prevent GCC from complaining
@@ -788,6 +838,9 @@ static void v9fs_dummy(V9fsState *s, V9fsPDU *pdu)
     (void) donttouch_stat;
     (void) v9fs_stat_free;
     (void) stat_to_v9stat;
+    (void) adjust_sg;
+    (void) cap_sg;
+    (void) print_sg;
 }
 
 static void v9fs_version(V9fsState *s, V9fsPDU *pdu)
-- 
1.7.0.4.360.g11766c





reply via email to

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