All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines.
@ 2011-05-17 19:43 Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 01/25] [virtio-9p] Add infrastructure to support glib threads and coroutines Venkateswararao Jujjuri (JV)
                   ` (25 more replies)
  0 siblings, 26 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri ", stefanha

VirtFS (fileserver base on 9P) performs many blocking system calls in the 
vCPU context. This effort is to move the blocking calls out of vCPU/IO 
thread context, into asynchronous threads.

Anthony's " Add hard build dependency on glib" patch and 
Kevin/Stefan's coroutine effort is a prerequisite.

Changes from V1
---------------
o Redesigned to use bh as per Stefan's suggestion. 
  This made the code very simple but is little less performant compared to V1.
  Anthony suggested to go-in with cleaner code and design (This version) and
  deal with the performance later.
  Just to put in perspective:
  Sequential Writes of creating 1GB files using ffsb
  o Write size 8k 
  With bh: 66.9MB/sec
  Without bh (marshalling routines): 74.9 MB/sec

  o Write size 128k
  With bh: 117MB/sec
  Without bh (marshalling routines): 122MB/sec

o Addressed all review comments.

o Using readdir_r is currently being worked on. Will add as a patch on top.

This patch set contains:
 - Converting all 9pfs calls into coroutines. 
 - Each 9P operation will be modified for:
    - Remove post* functions. These are our call back functions which makes 
      the code very hard to read. Now with coroutines, we can achieve the same 
      state machine model with nice sequential code flow.
    - Move errno access near to the local_syscall()
    - Introduce asynchronous threading

This series has the basic infrastructure and few routines like 
mkdir,monod,unlink,readdir,xattr,lstat, etc converted. 
Currently we are working on converting and testing other 9P operations also 
into this model and those patches will follow shortly.

Removing callback functions made some of the patches little lengthy. 
Here is the git tree for the reviewer convenience. 

http://repo.or.cz/w/qemu/aliguori/jvrao.git/shortlog/refs/heads/9p-coroutine-bh-round1

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 01/25] [virtio-9p] Add infrastructure to support glib threads and coroutines.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 02/25] [virtio-9p] Change all pdu handlers to coroutines Venkateswararao Jujjuri (JV)
                   ` (24 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Harsh Prateek Bora, Arun R Bharadwaj, aliguori,
	Venkateswararao Jujjuri (JV),
	stefanha

This patch is originally made by Arun Bharadwaj for glib support.
Later Harsh Prateek Bora added coroutines support.
This version implemented with suggestions from
Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>.

Signed-off-by: Arun R Bharadwaj <arun@linux.vnet.ibm.com>
Signed-off-by: Harsh Prateek Bora <harsh@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 Makefile.objs              |    2 +
 hw/9pfs/virtio-9p-coth.c   |   93 ++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h   |   58 +++++++++++++++++++++++++++
 hw/9pfs/virtio-9p-device.c |    7 ++-
 4 files changed, 158 insertions(+), 2 deletions(-)
 create mode 100644 hw/9pfs/virtio-9p-coth.c
 create mode 100644 hw/9pfs/virtio-9p-coth.h

diff --git a/Makefile.objs b/Makefile.objs
index 3873f10..96f6a24 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -297,8 +297,10 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
 9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
 9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
 9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o virtio-9p-posix-acl.o
+9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o
 
 hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
+$(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
 
 
 ######################################################################
diff --git a/hw/9pfs/virtio-9p-coth.c b/hw/9pfs/virtio-9p-coth.c
new file mode 100644
index 0000000..e61b656
--- /dev/null
+++ b/hw/9pfs/virtio-9p-coth.c
@@ -0,0 +1,93 @@
+/*
+ * Virtio 9p backend
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ *  Harsh Prateek Bora <harsh@linux.vnet.ibm.com>
+ *  Venkateswararao Jujjuri(JV) <jvrao@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-char.h"
+#include "fsdev/qemu-fsdev.h"
+#include "qemu-thread.h"
+#include "qemu-coroutine.h"
+#include "virtio-9p-coth.h"
+
+/* v9fs glib thread pool */
+static V9fsThPool v9fs_pool;
+
+void co_run_in_worker_bh(void *opaque)
+{
+    Coroutine *co = opaque;
+    g_thread_pool_push(v9fs_pool.pool, co, NULL);
+}
+
+static void v9fs_qemu_process_req_done(void *arg)
+{
+    char byte;
+    ssize_t len;
+    Coroutine *co;
+
+    do {
+        len = read(v9fs_pool.rfd, &byte, sizeof(byte));
+    } while (len == -1 &&  errno == EINTR);
+
+    while ((co = g_async_queue_try_pop(v9fs_pool.completed)) != NULL) {
+        qemu_coroutine_enter(co, NULL);
+    }
+}
+
+static void v9fs_thread_routine(gpointer data, gpointer user_data)
+{
+    ssize_t len;
+    char byte = 0;
+    Coroutine *co = data;
+
+    qemu_coroutine_enter(co, NULL);
+
+    g_async_queue_push(v9fs_pool.completed, co);
+    do {
+        len = write(v9fs_pool.wfd, &byte, sizeof(byte));
+    } while (len == -1 && errno == EINTR);
+}
+
+int v9fs_init_worker_threads(void)
+{
+    int notifier_fds[2];
+    V9fsThPool *p = &v9fs_pool;
+
+    /* init thread system if not already initialized */
+    if (!g_thread_get_initialized()) {
+        g_thread_init(NULL);
+    }
+
+    if (qemu_pipe(notifier_fds) == -1) {
+        return -1;
+    }
+
+    p->pool = g_thread_pool_new(v9fs_thread_routine, p, -1, FALSE, NULL);
+    if (!p->pool) {
+        return -1;
+    }
+    p->completed = g_async_queue_new();
+    if (!p->completed) {
+        /*
+         * We are going to terminate.
+         * So don't worry about cleanup
+         */
+        return -1;
+    }
+    p->rfd = notifier_fds[0];
+    p->wfd = notifier_fds[1];
+
+    fcntl(p->rfd, F_SETFL, O_NONBLOCK);
+    fcntl(p->wfd, F_SETFL, O_NONBLOCK);
+
+    qemu_set_fd_handler(p->rfd, v9fs_qemu_process_req_done, NULL, NULL);
+    return 0;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
new file mode 100644
index 0000000..8445d29
--- /dev/null
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -0,0 +1,58 @@
+/*
+ * Virtio 9p backend
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ *  Harsh Prateek Bora <harsh@linux.vnet.ibm.com>
+ *  Venkateswararao Jujjuri(JV) <jvrao@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef _QEMU_VIRTIO_9P_COTH_H
+#define _QEMU_VIRTIO_9P_COTH_H
+
+#include "qemu-thread.h"
+#include "qemu-coroutine.h"
+#include <glib.h>
+
+typedef struct V9fsThPool {
+    int rfd;
+    int wfd;
+    GThreadPool *pool;
+    GAsyncQueue *completed;
+} V9fsThPool;
+
+/*
+ * we want to use bottom half because we want to make sure the below
+ * sequence of events.
+ *
+ *   1. Yield the coroutine in the QEMU thread.
+ *   2. Submit the coroutine to a worker thread.
+ *   3. Enter the coroutine in the worker thread.
+ * we cannot swap step 1 and 2, because that would imply worker thread
+ * can enter coroutine while step1 is still running
+ */
+#define v9fs_co_run_in_worker(code_block)                               \
+    do {                                                                \
+        QEMUBH *co_bh;                                                  \
+        co_bh = qemu_bh_new(co_run_in_worker_bh,                        \
+                            qemu_coroutine_self());                     \
+        qemu_bh_schedule(co_bh);                                        \
+        /*                                                              \
+         * yeild in qemu thread and re-enter back                       \
+         * in glib worker thread                                        \
+         */                                                             \
+        qemu_coroutine_yield();                                         \
+        qemu_bh_delete(co_bh);                                          \
+        code_block;                                                     \
+        /* re-enter back to qemu thread */                              \
+        qemu_coroutine_yield();                                         \
+    } while (0)
+
+extern void co_run_in_worker_bh(void *);
+extern int v9fs_init_worker_threads(void);
+#endif
diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
index a2b6acc..7811103 100644
--- a/hw/9pfs/virtio-9p-device.c
+++ b/hw/9pfs/virtio-9p-device.c
@@ -18,6 +18,7 @@
 #include "virtio-9p.h"
 #include "fsdev/qemu-fsdev.h"
 #include "virtio-9p-xattr.h"
+#include "virtio-9p-coth.h"
 
 static uint32_t virtio_9p_get_features(VirtIODevice *vdev, uint32_t features)
 {
@@ -50,13 +51,11 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf)
     struct stat stat;
     FsTypeEntry *fse;
 
-
     s = (V9fsState *)virtio_common_init("virtio-9p",
                                     VIRTIO_ID_9P,
                                     sizeof(struct virtio_9p_config)+
                                     MAX_TAG_LEN,
                                     sizeof(V9fsState));
-
     /* initialize pdu allocator */
     QLIST_INIT(&s->free_list);
     for (i = 0; i < (MAX_REQ - 1); i++) {
@@ -132,6 +131,10 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf)
                         s->tag_len;
     s->vdev.get_config = virtio_9p_get_config;
 
+    if (v9fs_init_worker_threads() < 0) {
+        fprintf(stderr, "worker thread initialization failed\n");
+        exit(1);
+    }
     return &s->vdev;
 }
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 02/25] [virtio-9p] Change all pdu handlers to coroutines.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 01/25] [virtio-9p] Add infrastructure to support glib threads and coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 03/25] [virtio-9p] Remove post functions for v9fs_readlink Venkateswararao Jujjuri (JV)
                   ` (23 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

This patch changes the top level handlers to coroutines and sets the base.
It will be followed up with series of patches to convert all filesystem
calls to threaded coroutines pushing all blocking clals in VirtFS out
of vcpu threads.

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p-coth.h |    1 +
 hw/9pfs/virtio-9p.c      |  139 +++++++++++++++++++++++++++++++---------------
 hw/9pfs/virtio-9p.h      |    4 +-
 3 files changed, 99 insertions(+), 45 deletions(-)

diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 8445d29..9388f9b 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -17,6 +17,7 @@
 
 #include "qemu-thread.h"
 #include "qemu-coroutine.h"
+#include "virtio-9p.h"
 #include <glib.h>
 
 typedef struct V9fsThPool {
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index ec97b10..15bfea7 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -19,6 +19,7 @@
 #include "fsdev/qemu-fsdev.h"
 #include "virtio-9p-debug.h"
 #include "virtio-9p-xattr.h"
+#include "virtio-9p-coth.h"
 
 int debug_9p_pdu;
 
@@ -1192,8 +1193,10 @@ static void v9fs_fix_path(V9fsString *dst, V9fsString *src, int len)
     v9fs_string_free(&str);
 }
 
-static void v9fs_version(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_version(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     V9fsString version;
     size_t offset = 7;
 
@@ -1211,10 +1214,13 @@ static void v9fs_version(V9fsState *s, V9fsPDU *pdu)
     complete_pdu(s, pdu, offset);
 
     v9fs_string_free(&version);
+    return;
 }
 
-static void v9fs_attach(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_attach(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid, afid, n_uname;
     V9fsString uname, aname;
     V9fsFidState *fidp;
@@ -1269,8 +1275,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_stat(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_stat(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsStatState *vs;
     ssize_t err = 0;
@@ -1316,8 +1324,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_getattr(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_getattr(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsStatStateDotl *vs;
     ssize_t err = 0;
@@ -1465,8 +1475,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_setattr(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_setattr(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsSetattrState *vs;
     int err = 0;
@@ -1579,8 +1591,10 @@ out:
     v9fs_walk_complete(s, vs, err);
 }
 
-static void v9fs_walk(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_walk(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid, newfid;
     V9fsWalkState *vs;
     int err = 0;
@@ -1751,8 +1765,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_open(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_open(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsOpenState *vs;
     ssize_t err = 0;
@@ -1836,8 +1852,10 @@ out:
     v9fs_post_lcreate(s, vs, err);
 }
 
-static void v9fs_lcreate(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_lcreate(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t dfid, flags, mode;
     gid_t gid;
     V9fsLcreateState *vs;
@@ -1883,8 +1901,10 @@ static void v9fs_post_do_fsync(V9fsState *s, V9fsPDU *pdu, int err)
     complete_pdu(s, pdu, err);
 }
 
-static void v9fs_fsync(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_fsync(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     size_t offset = 7;
     V9fsFidState *fidp;
@@ -1902,8 +1922,10 @@ static void v9fs_fsync(V9fsState *s, V9fsPDU *pdu)
     v9fs_post_do_fsync(s, pdu, err);
 }
 
-static void v9fs_clunk(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_clunk(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     size_t offset = 7;
     int err;
@@ -2068,8 +2090,10 @@ static void v9fs_xattr_read(V9fsState *s, V9fsReadState *vs)
     qemu_free(vs);
 }
 
-static void v9fs_read(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_read(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsReadState *vs;
     ssize_t err = 0;
@@ -2207,8 +2231,10 @@ static void v9fs_readdir_post_setdir(V9fsState *s, V9fsReadDirState *vs)
     return;
 }
 
-static void v9fs_readdir(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_readdir(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsReadDirState *vs;
     ssize_t err = 0;
@@ -2240,7 +2266,6 @@ static void v9fs_readdir(V9fsState *s, V9fsPDU *pdu)
 out:
     complete_pdu(s, pdu, err);
     qemu_free(vs);
-    return;
 }
 
 static void v9fs_write_post_pwritev(V9fsState *s, V9fsWriteState *vs,
@@ -2319,8 +2344,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_write(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_write(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsWriteState *vs;
     ssize_t err;
@@ -2553,8 +2580,10 @@ out:
     v9fs_post_create(s, vs, err);
 }
 
-static void v9fs_create(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_create(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsCreateState *vs;
     int err = 0;
@@ -2615,8 +2644,10 @@ out:
     v9fs_post_symlink(s, vs, err);
 }
 
-static void v9fs_symlink(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_symlink(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t dfid;
     V9fsSymlinkState *vs;
     int err = 0;
@@ -2651,14 +2682,19 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_flush(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_flush(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     /* A nop call with no return */
     complete_pdu(s, pdu, 7);
+    return;
 }
 
-static void v9fs_link(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_link(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t dfid, oldfid;
     V9fsFidState *dfidp, *oldfidp;
     V9fsString name, fullname;
@@ -2710,8 +2746,10 @@ static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
     qemu_free(vs);
 }
 
-static void v9fs_remove(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_remove(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsRemoveState *vs;
     int err = 0;
@@ -2877,8 +2915,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_rename(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_rename(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsRenameState *vs;
     ssize_t err = 0;
@@ -3002,8 +3042,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_wstat(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_wstat(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsWstatState *vs;
     int err = 0;
@@ -3087,8 +3129,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_statfs(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_statfs(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     V9fsStatfsState *vs;
     ssize_t err = 0;
 
@@ -3113,6 +3157,7 @@ static void v9fs_statfs(V9fsState *s, V9fsPDU *pdu)
 out:
     complete_pdu(s, vs->pdu, err);
     qemu_free(vs);
+    return;
 }
 
 static void v9fs_mknod_post_lstat(V9fsState *s, V9fsMkState *vs, int err)
@@ -3149,8 +3194,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_mknod(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_mknod(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsMkState *vs;
     int err = 0;
@@ -3195,8 +3242,10 @@ out:
  * So when a TLOCK request comes, always return success
  */
 
-static void v9fs_lock(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_lock(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid, err = 0;
     V9fsLockState *vs;
 
@@ -3240,8 +3289,10 @@ out:
  * handling is done by client's VFS layer.
  */
 
-static void v9fs_getlock(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_getlock(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid, err = 0;
     V9fsGetlockState *vs;
 
@@ -3309,8 +3360,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_mkdir(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_mkdir(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsMkState *vs;
     int err = 0;
@@ -3433,8 +3486,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_xattrwalk(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_xattrwalk(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     ssize_t err = 0;
     V9fsXattrState *vs;
     int32_t fid, newfid;
@@ -3487,8 +3542,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_xattrcreate(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_xattrcreate(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int flags;
     int32_t fid;
     ssize_t err = 0;
@@ -3541,8 +3598,10 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_readlink(V9fsState *s, V9fsPDU *pdu)
+static void v9fs_readlink(void *opaque)
 {
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
     int32_t fid;
     V9fsReadLinkState *vs;
     int err = 0;
@@ -3569,9 +3628,7 @@ out:
     qemu_free(vs);
 }
 
-typedef void (pdu_handler_t)(V9fsState *s, V9fsPDU *pdu);
-
-static pdu_handler_t *pdu_handlers[] = {
+static CoroutineEntry *pdu_co_handlers[] = {
     [P9_TREADDIR] = v9fs_readdir,
     [P9_TSTATFS] = v9fs_statfs,
     [P9_TGETATTR] = v9fs_getattr,
@@ -3608,18 +3665,14 @@ static pdu_handler_t *pdu_handlers[] = {
 
 static void submit_pdu(V9fsState *s, V9fsPDU *pdu)
 {
-    pdu_handler_t *handler;
-
+    Coroutine *co;
     if (debug_9p_pdu) {
         pprint_pdu(pdu);
     }
-
-    BUG_ON(pdu->id >= ARRAY_SIZE(pdu_handlers));
-
-    handler = pdu_handlers[pdu->id];
-    BUG_ON(handler == NULL);
-
-    handler(s, pdu);
+    BUG_ON(pdu->id >= ARRAY_SIZE(pdu_co_handlers));
+    BUG_ON(pdu_co_handlers[pdu->id] == NULL);
+    co = qemu_coroutine_create(pdu_co_handlers[pdu->id]);
+    qemu_coroutine_enter(co, pdu);
 }
 
 void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq)
@@ -3631,7 +3684,7 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq)
     while ((pdu = alloc_pdu(s)) &&
             (len = virtqueue_pop(vq, &pdu->elem)) != 0) {
         uint8_t *ptr;
-
+        pdu->s = s;
         BUG_ON(pdu->elem.out_num == 0 || pdu->elem.in_num == 0);
         BUG_ON(pdu->elem.out_sg[0].iov_len < 7);
 
@@ -3640,9 +3693,7 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq)
         memcpy(&pdu->size, ptr, 4);
         pdu->id = ptr[4];
         memcpy(&pdu->tag, ptr + 5, 2);
-
         submit_pdu(s, pdu);
     }
-
     free_pdu(s, pdu);
 }
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index 2bfbe62..fb1e465 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -5,7 +5,7 @@
 #include <dirent.h>
 #include <sys/time.h>
 #include <utime.h>
-
+#include "hw/virtio.h"
 #include "fsdev/file-op-9p.h"
 
 /* The feature bitmap for virtio 9P */
@@ -114,6 +114,7 @@ static inline const char *rpath(FsContext *ctx, const char *path, char *buffer)
 #define P9_IOHDRSZ 24
 
 typedef struct V9fsPDU V9fsPDU;
+struct V9fsState;
 
 struct V9fsPDU
 {
@@ -121,6 +122,7 @@ struct V9fsPDU
     uint16_t tag;
     uint8_t id;
     VirtQueueElement elem;
+    struct V9fsState *s;
     QLIST_ENTRY(V9fsPDU) next;
 };
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 03/25] [virtio-9p] Remove post functions for v9fs_readlink.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 01/25] [virtio-9p] Add infrastructure to support glib threads and coroutines Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 02/25] [virtio-9p] Change all pdu handlers to coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-18  9:27   ` Stefan Hajnoczi
  2011-05-17 19:43 ` [Qemu-devel] [V2 04/25] [virtio-9p] clean up v9fs_readlink Venkateswararao Jujjuri (JV)
                   ` (22 subsequent siblings)
  25 siblings, 1 reply; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

In the process of preparation for coroutine threads, remove all post functions
and make the function more readable.

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   25 +++++++------------------
 1 files changed, 7 insertions(+), 18 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 15bfea7..06da2c9 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -3583,21 +3583,6 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_readlink_post_readlink(V9fsState *s, V9fsReadLinkState *vs,
-                                                    int err)
-{
-    if (err < 0) {
-        err = -errno;
-        goto out;
-    }
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "s", &vs->target);
-    err = vs->offset;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->target);
-    qemu_free(vs);
-}
-
 static void v9fs_readlink(void *opaque)
 {
     V9fsPDU *pdu = opaque;
@@ -3612,7 +3597,6 @@ static void v9fs_readlink(void *opaque)
     vs->offset = 7;
 
     pdu_unmarshal(vs->pdu, vs->offset, "d", &fid);
-
     fidp = lookup_fid(s, fid);
     if (fidp == NULL) {
         err = -ENOENT;
@@ -3621,8 +3605,13 @@ static void v9fs_readlink(void *opaque)
 
     v9fs_string_init(&vs->target);
     err = v9fs_do_readlink(s, &fidp->path, &vs->target);
-    v9fs_readlink_post_readlink(s, vs, err);
-    return;
+    if (err < 0) {
+        err = -errno;
+        goto out;
+    }
+    vs->offset += pdu_marshal(vs->pdu, vs->offset, "s", &vs->target);
+    err = vs->offset;
+    v9fs_string_free(&vs->target);
 out:
     complete_pdu(s, vs->pdu, err);
     qemu_free(vs);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 04/25] [virtio-9p] clean up v9fs_readlink.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (2 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 03/25] [virtio-9p] Remove post functions for v9fs_readlink Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 05/25] [virtio-9p] Move errno into v9fs_do_readlink Venkateswararao Jujjuri (JV)
                   ` (21 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Rearrange the code so that we can avoid V9fsReadLinkState.

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   25 ++++++++++---------------
 hw/9pfs/virtio-9p.h |    7 -------
 2 files changed, 10 insertions(+), 22 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 06da2c9..e0e7eed 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -3586,35 +3586,30 @@ out:
 static void v9fs_readlink(void *opaque)
 {
     V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
+    size_t offset = 7;
+    V9fsString target;
     int32_t fid;
-    V9fsReadLinkState *vs;
     int err = 0;
     V9fsFidState *fidp;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    pdu_unmarshal(vs->pdu, vs->offset, "d", &fid);
-    fidp = lookup_fid(s, fid);
+    pdu_unmarshal(pdu, offset, "d", &fid);
+    fidp = lookup_fid(pdu->s, fid);
     if (fidp == NULL) {
         err = -ENOENT;
         goto out;
     }
 
-    v9fs_string_init(&vs->target);
-    err = v9fs_do_readlink(s, &fidp->path, &vs->target);
+    v9fs_string_init(&target);
+    err = v9fs_do_readlink(pdu->s, &fidp->path, &target);
     if (err < 0) {
         err = -errno;
         goto out;
     }
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "s", &vs->target);
-    err = vs->offset;
-    v9fs_string_free(&vs->target);
+    offset += pdu_marshal(pdu, offset, "s", &target);
+    err = offset;
+    v9fs_string_free(&target);
 out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
+    complete_pdu(pdu->s, pdu, err);
 }
 
 static CoroutineEntry *pdu_co_handlers[] = {
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index fb1e465..e95b63d 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -495,13 +495,6 @@ typedef struct V9fsGetlockState
     V9fsGetlock *glock;
 } V9fsGetlockState;
 
-typedef struct V9fsReadLinkState
-{
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsString target;
-} V9fsReadLinkState;
-
 size_t pdu_packunpack(void *addr, struct iovec *sg, int sg_count,
                       size_t offset, size_t size, int pack);
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 05/25] [virtio-9p] Move errno into v9fs_do_readlink
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (3 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 04/25] [virtio-9p] clean up v9fs_readlink Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-18  9:31   ` Stefan Hajnoczi
  2011-05-17 19:43 ` [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink Venkateswararao Jujjuri (JV)
                   ` (20 subsequent siblings)
  25 siblings, 1 reply; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   32 ++++++++++++++++----------------
 1 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index e0e7eed..cc22a1f 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -82,19 +82,21 @@ static int v9fs_do_lstat(V9fsState *s, V9fsString *path, struct stat *stbuf)
     return s->ops->lstat(&s->ctx, path->data, stbuf);
 }
 
-static ssize_t v9fs_do_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
+static int v9fs_do_readlink(V9fsState *s, V9fsString *path, V9fsString *buf,
+        ssize_t *len)
 {
-    ssize_t len;
-
+    int err;
     buf->data = qemu_malloc(1024);
 
-    len = s->ops->readlink(&s->ctx, path->data, buf->data, 1024 - 1);
-    if (len > -1) {
-        buf->size = len;
-        buf->data[len] = 0;
+    *len = s->ops->readlink(&s->ctx, path->data, buf->data, 1024 - 1);
+    if (*len > -1) {
+        buf->size = *len;
+        buf->data[*len] = 0;
+        err = 0;
+    } else {
+        err = -errno;
     }
-
-    return len;
+    return err;
 }
 
 static int v9fs_do_close(V9fsState *s, int fd)
@@ -1055,13 +1057,11 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name,
     v9fs_string_null(&v9stat->extension);
 
     if (v9stat->mode & P9_STAT_MODE_SYMLINK) {
-        err = v9fs_do_readlink(s, name, &v9stat->extension);
-        if (err == -1) {
-            err = -errno;
+        ssize_t symlink_len;
+        err = v9fs_do_readlink(s, name, &v9stat->extension, &symlink_len);
+        if (err < 0) {
             return err;
         }
-        v9stat->extension.data[err] = 0;
-        v9stat->extension.size = err;
     } else if (v9stat->mode & P9_STAT_MODE_DEVICE) {
         v9fs_string_sprintf(&v9stat->extension, "%c %u %u",
                 S_ISCHR(stbuf->st_mode) ? 'c' : 'b',
@@ -3591,6 +3591,7 @@ static void v9fs_readlink(void *opaque)
     int32_t fid;
     int err = 0;
     V9fsFidState *fidp;
+    ssize_t symlink_len;
 
     pdu_unmarshal(pdu, offset, "d", &fid);
     fidp = lookup_fid(pdu->s, fid);
@@ -3600,9 +3601,8 @@ static void v9fs_readlink(void *opaque)
     }
 
     v9fs_string_init(&target);
-    err = v9fs_do_readlink(pdu->s, &fidp->path, &target);
+    err = v9fs_do_readlink(pdu->s, &fidp->path, &target, &symlink_len);
     if (err < 0) {
-        err = -errno;
         goto out;
     }
     offset += pdu_marshal(pdu, offset, "s", &target);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (4 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 05/25] [virtio-9p] Move errno into v9fs_do_readlink Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-18  9:43   ` Stefan Hajnoczi
  2011-05-17 19:43 ` [Qemu-devel] [V2 07/25] [virtio-9p] Remove post functions for v9fs_mkdir Venkateswararao Jujjuri (JV)
                   ` (19 subsequent siblings)
  25 siblings, 1 reply; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 Makefile.objs            |    2 +-
 hw/9pfs/cofs.c           |   42 ++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    1 +
 hw/9pfs/virtio-9p.c      |   27 ++++-----------------------
 hw/9pfs/virtio-9p.h      |    3 ++-
 5 files changed, 50 insertions(+), 25 deletions(-)
 create mode 100644 hw/9pfs/cofs.c

diff --git a/Makefile.objs b/Makefile.objs
index 96f6a24..36005bb 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
 9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
 9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
 9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o virtio-9p-posix-acl.o
-9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o
+9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o
 
 hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
 $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
new file mode 100644
index 0000000..6d94673
--- /dev/null
+++ b/hw/9pfs/cofs.c
@@ -0,0 +1,42 @@
+
+/*
+ * Virtio 9p backend
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "fsdev/qemu-fsdev.h"
+#include "qemu-thread.h"
+#include "qemu-coroutine.h"
+#include "virtio-9p-coth.h"
+
+int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
+{
+    int err;
+    ssize_t len;
+    V9fsString tbuf;
+
+    tbuf.data = qemu_malloc(PATH_MAX);
+    v9fs_co_run_in_worker(
+        {
+            len = s->ops->readlink(&s->ctx, path->data,
+                                   tbuf.data, PATH_MAX - 1);
+            if (len > -1) {
+                tbuf.size = len;
+                tbuf.data[len] = 0;
+                err = 0;
+            } else {
+                err = -errno;
+            }
+        });
+    buf->size = tbuf.size;
+    buf->data = tbuf.data;
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 9388f9b..94c5147 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -56,4 +56,5 @@ typedef struct V9fsThPool {
 
 extern void co_run_in_worker_bh(void *);
 extern int v9fs_init_worker_threads(void);
+extern int v9fs_co_readlink(V9fsState *, V9fsString *, V9fsString *);
 #endif
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index cc22a1f..25831c3 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -82,23 +82,6 @@ static int v9fs_do_lstat(V9fsState *s, V9fsString *path, struct stat *stbuf)
     return s->ops->lstat(&s->ctx, path->data, stbuf);
 }
 
-static int v9fs_do_readlink(V9fsState *s, V9fsString *path, V9fsString *buf,
-        ssize_t *len)
-{
-    int err;
-    buf->data = qemu_malloc(1024);
-
-    *len = s->ops->readlink(&s->ctx, path->data, buf->data, 1024 - 1);
-    if (*len > -1) {
-        buf->size = *len;
-        buf->data[*len] = 0;
-        err = 0;
-    } else {
-        err = -errno;
-    }
-    return err;
-}
-
 static int v9fs_do_close(V9fsState *s, int fd)
 {
     return s->ops->close(&s->ctx, fd);
@@ -299,7 +282,7 @@ static void v9fs_string_init(V9fsString *str)
     str->size = 0;
 }
 
-static void v9fs_string_free(V9fsString *str)
+void v9fs_string_free(V9fsString *str)
 {
     qemu_free(str->data);
     str->data = NULL;
@@ -421,7 +404,7 @@ v9fs_string_sprintf(V9fsString *str, const char *fmt, ...)
     str->size = err;
 }
 
-static void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs)
+void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs)
 {
     v9fs_string_free(lhs);
     v9fs_string_sprintf(lhs, "%s", rhs->data);
@@ -1057,8 +1040,7 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name,
     v9fs_string_null(&v9stat->extension);
 
     if (v9stat->mode & P9_STAT_MODE_SYMLINK) {
-        ssize_t symlink_len;
-        err = v9fs_do_readlink(s, name, &v9stat->extension, &symlink_len);
+        err = v9fs_co_readlink(s, name, &v9stat->extension);
         if (err < 0) {
             return err;
         }
@@ -3591,7 +3573,6 @@ static void v9fs_readlink(void *opaque)
     int32_t fid;
     int err = 0;
     V9fsFidState *fidp;
-    ssize_t symlink_len;
 
     pdu_unmarshal(pdu, offset, "d", &fid);
     fidp = lookup_fid(pdu->s, fid);
@@ -3601,7 +3582,7 @@ static void v9fs_readlink(void *opaque)
     }
 
     v9fs_string_init(&target);
-    err = v9fs_do_readlink(pdu->s, &fidp->path, &target, &symlink_len);
+    err = v9fs_co_readlink(pdu->s, &fidp->path, &target);
     if (err < 0) {
         goto out;
     }
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index e95b63d..c6f2649 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -505,5 +505,6 @@ static inline size_t do_pdu_unpack(void *dst, struct iovec *sg, int sg_count,
 }
 
 extern void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq);
-
+extern void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs);
+extern void v9fs_string_free(V9fsString *str);
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 07/25] [virtio-9p] Remove post functions for v9fs_mkdir.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (5 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 08/25] [virtio-9p] clean up v9fs_mkdir Venkateswararao Jujjuri (JV)
                   ` (18 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   52 ++++++++++++--------------------------------------
 1 files changed, 13 insertions(+), 39 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 25831c3..82e5490 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -3308,40 +3308,6 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_mkdir_post_lstat(V9fsState *s, V9fsMkState *vs, int err)
-{
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
-
-    stat_to_qid(&vs->stbuf, &vs->qid);
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
-    err = vs->offset;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->fullname);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-}
-
-static void v9fs_mkdir_post_mkdir(V9fsState *s, V9fsMkState *vs, int err)
-{
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
-
-    err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
-    v9fs_mkdir_post_lstat(s, vs, err);
-    return;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->fullname);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-}
-
 static void v9fs_mkdir(void *opaque)
 {
     V9fsPDU *pdu = opaque;
@@ -3359,19 +3325,27 @@ static void v9fs_mkdir(void *opaque)
 
     v9fs_string_init(&vs->fullname);
     pdu_unmarshal(vs->pdu, vs->offset, "dsdd", &fid, &vs->name, &mode,
-        &gid);
+                  &gid);
 
     fidp = lookup_fid(s, fid);
     if (fidp == NULL) {
         err = -ENOENT;
         goto out;
     }
-
     v9fs_string_sprintf(&vs->fullname, "%s/%s", fidp->path.data, vs->name.data);
     err = v9fs_do_mkdir(s, vs->fullname.data, mode, fidp->uid, gid);
-    v9fs_mkdir_post_mkdir(s, vs, err);
-    return;
-
+    if (err == -1) {
+        err = -errno;
+        goto out;
+    }
+    err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
+    if (err == -1) {
+        err = -errno;
+        goto out;
+    }
+    stat_to_qid(&vs->stbuf, &vs->qid);
+    vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
+    err = vs->offset;
 out:
     complete_pdu(s, vs->pdu, err);
     v9fs_string_free(&vs->fullname);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 08/25] [virtio-9p] clean up v9fs_mkdir.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (6 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 07/25] [virtio-9p] Remove post functions for v9fs_mkdir Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 09/25] hw/9pfs: Add yield support for readdir related coroutines Venkateswararao Jujjuri (JV)
                   ` (17 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Rearrange the code so that we can avoid V9fsMkState and additional malloc()s.

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   38 +++++++++++++++++---------------------
 1 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 82e5490..40c8b31 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -3311,46 +3311,42 @@ out:
 static void v9fs_mkdir(void *opaque)
 {
     V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
+    size_t offset = 7;
     int32_t fid;
-    V9fsMkState *vs;
-    int err = 0;
+    struct stat stbuf;
+    V9fsString name, fullname;
+    V9fsQID qid;
     V9fsFidState *fidp;
     gid_t gid;
     int mode;
+    int err = 0;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    v9fs_string_init(&vs->fullname);
-    pdu_unmarshal(vs->pdu, vs->offset, "dsdd", &fid, &vs->name, &mode,
-                  &gid);
+    v9fs_string_init(&fullname);
+    pdu_unmarshal(pdu, offset, "dsdd", &fid, &name, &mode, &gid);
 
-    fidp = lookup_fid(s, fid);
+    fidp = lookup_fid(pdu->s, fid);
     if (fidp == NULL) {
         err = -ENOENT;
         goto out;
     }
-    v9fs_string_sprintf(&vs->fullname, "%s/%s", fidp->path.data, vs->name.data);
-    err = v9fs_do_mkdir(s, vs->fullname.data, mode, fidp->uid, gid);
+    v9fs_string_sprintf(&fullname, "%s/%s", fidp->path.data, name.data);
+    err = v9fs_do_mkdir(pdu->s, fullname.data, mode, fidp->uid, gid);
     if (err == -1) {
         err = -errno;
         goto out;
     }
-    err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
+    err = v9fs_do_lstat(pdu->s, &fullname, &stbuf);
     if (err == -1) {
         err = -errno;
         goto out;
     }
-    stat_to_qid(&vs->stbuf, &vs->qid);
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
-    err = vs->offset;
+    stat_to_qid(&stbuf, &qid);
+    offset += pdu_marshal(pdu, offset, "Q", &qid);
+    err = offset;
 out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->fullname);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
+    complete_pdu(pdu->s, pdu, err);
+    v9fs_string_free(&fullname);
+    v9fs_string_free(&name);
 }
 
 static void v9fs_post_xattr_getvalue(V9fsState *s, V9fsXattrState *vs, int err)
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 09/25] hw/9pfs: Add yield support for readdir related coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (7 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 08/25] [virtio-9p] clean up v9fs_mkdir Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-18  9:55   ` Stefan Hajnoczi
  2011-05-17 19:43 ` [Qemu-devel] [V2 10/25] hw/9pfs: Update v9fs_readdir to use coroutines Venkateswararao Jujjuri (JV)
                   ` (16 subsequent siblings)
  25 siblings, 1 reply; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

This include readdir, telldir, seekdir, rewinddir.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 Makefile.objs            |    2 +-
 hw/9pfs/codir.c          |   68 ++++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    5 +++
 3 files changed, 74 insertions(+), 1 deletions(-)
 create mode 100644 hw/9pfs/codir.c

diff --git a/Makefile.objs b/Makefile.objs
index 36005bb..614bcaf 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
 9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
 9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
 9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o virtio-9p-posix-acl.o
-9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o
+9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o codir.o
 
 hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
 $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
diff --git a/hw/9pfs/codir.c b/hw/9pfs/codir.c
new file mode 100644
index 0000000..885f7d0
--- /dev/null
+++ b/hw/9pfs/codir.c
@@ -0,0 +1,68 @@
+
+/*
+ * Virtio 9p backend
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "fsdev/qemu-fsdev.h"
+#include "qemu-thread.h"
+#include "qemu-coroutine.h"
+#include "virtio-9p-coth.h"
+
+int v9fs_co_readdir(V9fsState *s, V9fsFidState *fidp, struct dirent **dent)
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            errno = 0;
+            /*FIXME!! need to switch to readdir_r */
+            *dent = s->ops->readdir(&s->ctx, fidp->fs.dir);
+            if (!*dent && errno) {
+                err = -errno;
+            } else {
+                err = 0;
+            }
+        });
+    return err;
+}
+
+off_t v9fs_co_telldir(V9fsState *s, V9fsFidState *fidp)
+{
+    off_t err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->telldir(&s->ctx, fidp->fs.dir);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
+
+void v9fs_co_seekdir(V9fsState *s, V9fsFidState *fidp, off_t offset)
+{
+    v9fs_co_run_in_worker(
+        {
+            s->ops->seekdir(&s->ctx, fidp->fs.dir, offset);
+        });
+    return;
+}
+
+void v9fs_co_rewinddir(V9fsState *s, V9fsFidState *fidp)
+{
+    v9fs_co_run_in_worker(
+        {
+            s->ops->rewinddir(&s->ctx, fidp->fs.dir);
+        });
+    return;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 94c5147..9aa5953 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -57,4 +57,9 @@ typedef struct V9fsThPool {
 extern void co_run_in_worker_bh(void *);
 extern int v9fs_init_worker_threads(void);
 extern int v9fs_co_readlink(V9fsState *, V9fsString *, V9fsString *);
+extern int v9fs_co_readdir(V9fsState *, V9fsFidState *,
+                           struct dirent **);
+extern off_t v9fs_co_telldir(V9fsState *, V9fsFidState *);
+extern void v9fs_co_seekdir(V9fsState *, V9fsFidState *, off_t);
+extern void v9fs_co_rewinddir(V9fsState *, V9fsFidState *);
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 10/25] hw/9pfs: Update v9fs_readdir to use coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (8 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 09/25] hw/9pfs: Add yield support for readdir related coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-18 10:10   ` Stefan Hajnoczi
  2011-05-17 19:43 ` [Qemu-devel] [V2 11/25] hw/9pfs: Add yield support to statfs coroutine Venkateswararao Jujjuri (JV)
                   ` (15 subsequent siblings)
  25 siblings, 1 reply; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |  170 +++++++++++++++++++++------------------------------
 1 files changed, 69 insertions(+), 101 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 40c8b31..6ae4fe4 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -112,11 +112,6 @@ static off_t v9fs_do_telldir(V9fsState *s, DIR *dir)
     return s->ops->telldir(&s->ctx, dir);
 }
 
-static struct dirent *v9fs_do_readdir(V9fsState *s, DIR *dir)
-{
-    return s->ops->readdir(&s->ctx, dir);
-}
-
 static void v9fs_do_seekdir(V9fsState *s, DIR *dir, off_t off)
 {
     return s->ops->seekdir(&s->ctx, dir, off);
@@ -1967,7 +1962,7 @@ static void v9fs_read_post_dir_lstat(V9fsState *s, V9fsReadState *vs,
     v9fs_stat_free(&vs->v9stat);
     v9fs_string_free(&vs->name);
     vs->dir_pos = vs->dent->d_off;
-    vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
+    v9fs_co_readdir(s, vs->fidp, &vs->dent);
     v9fs_read_post_readdir(s, vs, err);
     return;
 out:
@@ -1999,7 +1994,7 @@ static void v9fs_read_post_readdir(V9fsState *s, V9fsReadState *vs, ssize_t err)
 
 static void v9fs_read_post_telldir(V9fsState *s, V9fsReadState *vs, ssize_t err)
 {
-    vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
+    v9fs_co_readdir(s, vs->fidp, &vs->dent);
     v9fs_read_post_readdir(s, vs, err);
     return;
 }
@@ -2128,126 +2123,99 @@ out:
     qemu_free(vs);
 }
 
-typedef struct V9fsReadDirState {
-    V9fsPDU *pdu;
-    V9fsFidState *fidp;
-    V9fsQID qid;
-    off_t saved_dir_pos;
-    struct dirent *dent;
-    int32_t count;
-    int32_t max_count;
-    size_t offset;
-    int64_t initial_offset;
-    V9fsString name;
-} V9fsReadDirState;
-
-static void v9fs_readdir_post_seekdir(V9fsState *s, V9fsReadDirState *vs)
-{
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "d", vs->count);
-    vs->offset += vs->count;
-    complete_pdu(s, vs->pdu, vs->offset);
-    qemu_free(vs);
-    return;
-}
-
-/* Size of each dirent on the wire: size of qid (13) + size of offset (8)
+/*
+ * Size of each dirent on the wire: size of qid (13) + size of offset (8)
  * size of type (1) + size of name.size (2) + strlen(name.data)
  */
-#define V9_READDIR_DATA_SZ (24 + strlen(vs->name.data))
+#define V9_READDIR_DATA_SZ (24 + strlen(name.data))
 
-static void v9fs_readdir_post_readdir(V9fsState *s, V9fsReadDirState *vs)
+static int v9fs_do_readdir(V9fsState *s, V9fsPDU *pdu,
+                           V9fsFidState *fidp, int32_t max_count)
 {
-    int len;
     size_t size;
+    V9fsQID qid;
+    V9fsString name;
+    int len, err = 0;
+    int32_t count = 0;
+    off_t saved_dir_pos;
+    struct dirent *dent;
 
-    if (vs->dent) {
-        v9fs_string_init(&vs->name);
-        v9fs_string_sprintf(&vs->name, "%s", vs->dent->d_name);
-
-        if ((vs->count + V9_READDIR_DATA_SZ) > vs->max_count) {
+    /* save the directory position */
+    saved_dir_pos = v9fs_co_telldir(s, fidp);
+    if (saved_dir_pos < 0) {
+        return saved_dir_pos;
+    }
+    while (1) {
+        err = v9fs_co_readdir(s, fidp, &dent);
+        if (err || !dent) {
+            break;
+        }
+        v9fs_string_init(&name);
+        v9fs_string_sprintf(&name, "%s", dent->d_name);
+        if ((count + V9_READDIR_DATA_SZ) > max_count) {
             /* Ran out of buffer. Set dir back to old position and return */
-            v9fs_do_seekdir(s, vs->fidp->fs.dir, vs->saved_dir_pos);
-            v9fs_readdir_post_seekdir(s, vs);
-            return;
+            v9fs_co_seekdir(s, fidp, saved_dir_pos);
+            v9fs_string_free(&name);
+            return count;
         }
-
-        /* Fill up just the path field of qid because the client uses
+        /*
+         * Fill up just the path field of qid because the client uses
          * only that. To fill the entire qid structure we will have
          * to stat each dirent found, which is expensive
          */
-        size = MIN(sizeof(vs->dent->d_ino), sizeof(vs->qid.path));
-        memcpy(&vs->qid.path, &vs->dent->d_ino, size);
+        size = MIN(sizeof(dent->d_ino), sizeof(qid.path));
+        memcpy(&qid.path, &dent->d_ino, size);
         /* Fill the other fields with dummy values */
-        vs->qid.type = 0;
-        vs->qid.version = 0;
-
-        len = pdu_marshal(vs->pdu, vs->offset+4+vs->count, "Qqbs",
-                              &vs->qid, vs->dent->d_off,
-                              vs->dent->d_type, &vs->name);
-        vs->count += len;
-        v9fs_string_free(&vs->name);
-        vs->saved_dir_pos = vs->dent->d_off;
-        vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
-        v9fs_readdir_post_readdir(s, vs);
-        return;
-    }
-
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "d", vs->count);
-    vs->offset += vs->count;
-    complete_pdu(s, vs->pdu, vs->offset);
-    qemu_free(vs);
-    return;
-}
-
-static void v9fs_readdir_post_telldir(V9fsState *s, V9fsReadDirState *vs)
-{
-    vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
-    v9fs_readdir_post_readdir(s, vs);
-    return;
-}
+        qid.type = 0;
+        qid.version = 0;
 
-static void v9fs_readdir_post_setdir(V9fsState *s, V9fsReadDirState *vs)
-{
-    vs->saved_dir_pos = v9fs_do_telldir(s, vs->fidp->fs.dir);
-    v9fs_readdir_post_telldir(s, vs);
-    return;
+        /* 11 = 7 + 4 (7 = start offset, 4 = space for storing count) */
+        len = pdu_marshal(pdu, 11 + count, "Qqbs",
+                          &qid, dent->d_off,
+                          dent->d_type, &name);
+        count += len;
+        v9fs_string_free(&name);
+        saved_dir_pos = dent->d_off;
+    }
+    if (err < 0) {
+        return err;
+    }
+    return count;
 }
 
 static void v9fs_readdir(void *opaque)
 {
-    V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
     int32_t fid;
-    V9fsReadDirState *vs;
-    ssize_t err = 0;
+    V9fsFidState *fidp;
+    ssize_t retval = 0;
     size_t offset = 7;
+    int64_t initial_offset;
+    int32_t count, max_count;
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-    vs->count = 0;
-
-    pdu_unmarshal(vs->pdu, offset, "dqd", &fid, &vs->initial_offset,
-                                                        &vs->max_count);
+    pdu_unmarshal(pdu, offset, "dqd", &fid, &initial_offset, &max_count);
 
-    vs->fidp = lookup_fid(s, fid);
-    if (vs->fidp == NULL || !(vs->fidp->fs.dir)) {
-        err = -EINVAL;
+    fidp = lookup_fid(s, fid);
+    if (fidp == NULL || !fidp->fs.dir) {
+        retval = -EINVAL;
         goto out;
     }
-
-    if (vs->initial_offset == 0) {
-        v9fs_do_rewinddir(s, vs->fidp->fs.dir);
+    if (initial_offset == 0) {
+        v9fs_co_rewinddir(s, fidp);
     } else {
-        v9fs_do_seekdir(s, vs->fidp->fs.dir, vs->initial_offset);
+        v9fs_co_seekdir(s, fidp, initial_offset);
     }
-
-    v9fs_readdir_post_setdir(s, vs);
-    return;
-
+    count = v9fs_do_readdir(s, pdu, fidp, max_count);
+    if (count < 0) {
+        retval = count;
+        goto out;
+    }
+    retval = offset;
+    retval += pdu_marshal(pdu, offset, "d", count);
+    retval += count;
 out:
-    complete_pdu(s, pdu, err);
-    qemu_free(vs);
+    complete_pdu(s, pdu, retval);
 }
 
 static void v9fs_write_post_pwritev(V9fsState *s, V9fsWriteState *vs,
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 11/25] hw/9pfs: Add yield support to statfs coroutine
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (9 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 10/25] hw/9pfs: Update v9fs_readdir to use coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 12/25] hw/9pfs: Update v9fs_statfs to use coroutines Venkateswararao Jujjuri (JV)
                   ` (14 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/cofs.c           |   14 ++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    1 +
 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
index 6d94673..f79564b 100644
--- a/hw/9pfs/cofs.c
+++ b/hw/9pfs/cofs.c
@@ -40,3 +40,17 @@ int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
     buf->data = tbuf.data;
     return err;
 }
+
+int v9fs_co_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->statfs(&s->ctx, path->data, stbuf);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 9aa5953..5d9dc0f 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -62,4 +62,5 @@ extern int v9fs_co_readdir(V9fsState *, V9fsFidState *,
 extern off_t v9fs_co_telldir(V9fsState *, V9fsFidState *);
 extern void v9fs_co_seekdir(V9fsState *, V9fsFidState *, off_t);
 extern void v9fs_co_rewinddir(V9fsState *, V9fsFidState *);
+extern int v9fs_co_statfs(V9fsState *, V9fsString *, struct statfs *);
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 12/25] hw/9pfs: Update v9fs_statfs to use coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (10 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 11/25] hw/9pfs: Add yield support to statfs coroutine Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 13/25] hw/9pfs: Add yield support to lstat coroutine Venkateswararao Jujjuri (JV)
                   ` (13 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   92 ++++++++++++++++++++++++--------------------------
 hw/9pfs/virtio-9p.h |   22 ------------
 2 files changed, 44 insertions(+), 70 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 6ae4fe4..9523970 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -3034,79 +3034,75 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_statfs_post_statfs(V9fsState *s, V9fsStatfsState *vs, int err)
-{
+static int v9fs_fill_statfs(V9fsState *s, V9fsPDU *pdu, struct statfs *stbuf)
+{
+    uint32_t f_type;
+    uint32_t f_bsize;
+    uint64_t f_blocks;
+    uint64_t f_bfree;
+    uint64_t f_bavail;
+    uint64_t f_files;
+    uint64_t f_ffree;
+    uint64_t fsid_val;
+    uint32_t f_namelen;
+    size_t offset = 7;
     int32_t bsize_factor;
 
-    if (err) {
-        err = -errno;
-        goto out;
-    }
-
     /*
      * compute bsize factor based on host file system block size
      * and client msize
      */
-    bsize_factor = (s->msize - P9_IOHDRSZ)/vs->stbuf.f_bsize;
+    bsize_factor = (s->msize - P9_IOHDRSZ)/stbuf->f_bsize;
     if (!bsize_factor) {
         bsize_factor = 1;
     }
-    vs->v9statfs.f_type = vs->stbuf.f_type;
-    vs->v9statfs.f_bsize = vs->stbuf.f_bsize;
-    vs->v9statfs.f_bsize *= bsize_factor;
+    f_type  = stbuf->f_type;
+    f_bsize = stbuf->f_bsize;
+    f_bsize *= bsize_factor;
     /*
      * f_bsize is adjusted(multiplied) by bsize factor, so we need to
      * adjust(divide) the number of blocks, free blocks and available
      * blocks by bsize factor
      */
-    vs->v9statfs.f_blocks = vs->stbuf.f_blocks/bsize_factor;
-    vs->v9statfs.f_bfree = vs->stbuf.f_bfree/bsize_factor;
-    vs->v9statfs.f_bavail = vs->stbuf.f_bavail/bsize_factor;
-    vs->v9statfs.f_files = vs->stbuf.f_files;
-    vs->v9statfs.f_ffree = vs->stbuf.f_ffree;
-    vs->v9statfs.fsid_val = (unsigned int) vs->stbuf.f_fsid.__val[0] |
-			(unsigned long long)vs->stbuf.f_fsid.__val[1] << 32;
-    vs->v9statfs.f_namelen = vs->stbuf.f_namelen;
-
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "ddqqqqqqd",
-         vs->v9statfs.f_type, vs->v9statfs.f_bsize, vs->v9statfs.f_blocks,
-         vs->v9statfs.f_bfree, vs->v9statfs.f_bavail, vs->v9statfs.f_files,
-         vs->v9statfs.f_ffree, vs->v9statfs.fsid_val,
-         vs->v9statfs.f_namelen);
+    f_blocks = stbuf->f_blocks/bsize_factor;
+    f_bfree  = stbuf->f_bfree/bsize_factor;
+    f_bavail = stbuf->f_bavail/bsize_factor;
+    f_files  = stbuf->f_files;
+    f_ffree  = stbuf->f_ffree;
+    fsid_val = (unsigned int) stbuf->f_fsid.__val[0] |
+               (unsigned long long)stbuf->f_fsid.__val[1] << 32;
+    f_namelen = stbuf->f_namelen;
 
-out:
-    complete_pdu(s, vs->pdu, vs->offset);
-    qemu_free(vs);
+    return pdu_marshal(pdu, offset, "ddqqqqqqd",
+                       f_type, f_bsize, f_blocks, f_bfree,
+                       f_bavail, f_files, f_ffree,
+                       fsid_val, f_namelen);
 }
 
 static void v9fs_statfs(void *opaque)
 {
+    int32_t fid;
+    ssize_t retval = 0;
+    size_t offset = 7;
+    V9fsFidState *fidp;
+    struct statfs stbuf;
     V9fsPDU *pdu = opaque;
     V9fsState *s = pdu->s;
-    V9fsStatfsState *vs;
-    ssize_t err = 0;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    memset(&vs->v9statfs, 0, sizeof(vs->v9statfs));
-
-    pdu_unmarshal(vs->pdu, vs->offset, "d", &vs->fid);
-
-    vs->fidp = lookup_fid(s, vs->fid);
-    if (vs->fidp == NULL) {
-        err = -ENOENT;
+    pdu_unmarshal(pdu, offset, "d", &fid);
+    fidp = lookup_fid(s, fid);
+    if (fidp == NULL) {
+        retval = -ENOENT;
         goto out;
     }
-
-    err = v9fs_do_statfs(s, &vs->fidp->path, &vs->stbuf);
-    v9fs_statfs_post_statfs(s, vs, err);
-    return;
-
+    retval = v9fs_co_statfs(s, &fidp->path, &stbuf);
+    if (retval < 0) {
+        goto out;
+    }
+    retval = offset;
+    retval += v9fs_fill_statfs(s, pdu, &stbuf);
 out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
+    complete_pdu(s, pdu, retval);
     return;
 }
 
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index c6f2649..a7e4ff2 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -398,28 +398,6 @@ struct virtio_9p_config
     uint8_t tag[0];
 } __attribute__((packed));
 
-typedef struct V9fsStatfs
-{
-    uint32_t f_type;
-    uint32_t f_bsize;
-    uint64_t f_blocks;
-    uint64_t f_bfree;
-    uint64_t f_bavail;
-    uint64_t f_files;
-    uint64_t f_ffree;
-    uint64_t fsid_val;
-    uint32_t f_namelen;
-} V9fsStatfs;
-
-typedef struct V9fsStatfsState {
-    V9fsPDU *pdu;
-    size_t offset;
-    int32_t fid;
-    V9fsStatfs v9statfs;
-    V9fsFidState *fidp;
-    struct statfs stbuf;
-} V9fsStatfsState;
-
 typedef struct V9fsMkState {
     V9fsPDU *pdu;
     size_t offset;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 13/25] hw/9pfs: Add yield support to lstat coroutine
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (11 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 12/25] hw/9pfs: Update v9fs_statfs to use coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 14/25] hw/9pfs: Update v9fs_getattr to use coroutines Venkateswararao Jujjuri (JV)
                   ` (12 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 Makefile.objs            |    2 +-
 hw/9pfs/cofile.c         |   32 ++++++++++++++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    1 +
 3 files changed, 34 insertions(+), 1 deletions(-)
 create mode 100644 hw/9pfs/cofile.c

diff --git a/Makefile.objs b/Makefile.objs
index 614bcaf..83d30bd 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
 9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
 9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
 9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o virtio-9p-posix-acl.o
-9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o codir.o
+9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o codir.o cofile.o
 
 hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
 $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c
new file mode 100644
index 0000000..a4c0ae7
--- /dev/null
+++ b/hw/9pfs/cofile.c
@@ -0,0 +1,32 @@
+
+/*
+ * Virtio 9p backend
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "fsdev/qemu-fsdev.h"
+#include "qemu-thread.h"
+#include "qemu-coroutine.h"
+#include "virtio-9p-coth.h"
+
+int v9fs_co_lstat(V9fsState *s, V9fsString *path, struct stat *stbuf)
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->lstat(&s->ctx, path->data, stbuf);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 5d9dc0f..3538d91 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -63,4 +63,5 @@ extern off_t v9fs_co_telldir(V9fsState *, V9fsFidState *);
 extern void v9fs_co_seekdir(V9fsState *, V9fsFidState *, off_t);
 extern void v9fs_co_rewinddir(V9fsState *, V9fsFidState *);
 extern int v9fs_co_statfs(V9fsState *, V9fsString *, struct statfs *);
+extern int v9fs_co_lstat(V9fsState *, V9fsString *, struct stat *);
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 14/25] hw/9pfs: Update v9fs_getattr to use coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (12 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 13/25] hw/9pfs: Add yield support to lstat coroutine Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 15/25] hw/9pfs: Add yield support to setattr related coroutines Venkateswararao Jujjuri (JV)
                   ` (11 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   57 +++++++++++++++++----------------------------------
 hw/9pfs/virtio-9p.h |    8 -------
 2 files changed, 19 insertions(+), 46 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 9523970..936e97f 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -1087,7 +1087,7 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name,
 
 
 static void stat_to_v9stat_dotl(V9fsState *s, const struct stat *stbuf,
-                            V9fsStatDotl *v9lstat)
+                                V9fsStatDotl *v9lstat)
 {
     memset(v9lstat, 0, sizeof(*v9lstat));
 
@@ -1284,57 +1284,38 @@ out:
     qemu_free(vs);
 }
 
-static void v9fs_getattr_post_lstat(V9fsState *s, V9fsStatStateDotl *vs,
-                                                                int err)
-{
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
-
-    stat_to_v9stat_dotl(s, &vs->stbuf, &vs->v9stat_dotl);
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "A", &vs->v9stat_dotl);
-    err = vs->offset;
-
-out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
-}
-
 static void v9fs_getattr(void *opaque)
 {
-    V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
     int32_t fid;
-    V9fsStatStateDotl *vs;
-    ssize_t err = 0;
+    size_t offset = 7;
+    ssize_t retval = 0;
+    struct stat stbuf;
     V9fsFidState *fidp;
     uint64_t request_mask;
+    V9fsStatDotl v9stat_dotl;
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    memset(&vs->v9stat_dotl, 0, sizeof(vs->v9stat_dotl));
-
-    pdu_unmarshal(vs->pdu, vs->offset, "dq", &fid, &request_mask);
+    pdu_unmarshal(pdu, offset, "dq", &fid, &request_mask);
 
     fidp = lookup_fid(s, fid);
     if (fidp == NULL) {
-        err = -ENOENT;
+        retval = -ENOENT;
         goto out;
     }
-
-    /* Currently we only support BASIC fields in stat, so there is no
+    /*
+     * Currently we only support BASIC fields in stat, so there is no
      * need to look at request_mask.
      */
-    err = v9fs_do_lstat(s, &fidp->path, &vs->stbuf);
-    v9fs_getattr_post_lstat(s, vs, err);
-    return;
-
+    retval = v9fs_co_lstat(s, &fidp->path, &stbuf);
+    if (retval < 0) {
+        goto out;
+    }
+    stat_to_v9stat_dotl(s, &stbuf, &v9stat_dotl);
+    retval = offset;
+    retval += pdu_marshal(pdu, offset, "A", &v9stat_dotl);
 out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
+    complete_pdu(s, pdu, retval);
 }
 
 /* From Linux kernel code */
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index a7e4ff2..debc64a 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -278,14 +278,6 @@ typedef struct V9fsStatDotl {
     uint64_t st_data_version;
 } V9fsStatDotl;
 
-typedef struct V9fsStatStateDotl {
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsStatDotl v9stat_dotl;
-    struct stat stbuf;
-} V9fsStatStateDotl;
-
-
 typedef struct V9fsWalkState {
     V9fsPDU *pdu;
     size_t offset;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 15/25] hw/9pfs: Add yield support to setattr related coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (13 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 14/25] hw/9pfs: Update v9fs_getattr to use coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 16/25] hw/9pfs: Update v9fs_setattr to use coroutines Venkateswararao Jujjuri (JV)
                   ` (10 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

This include chmod, utimensat, chown and truncate.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/cofs.c           |   64 ++++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    4 +++
 2 files changed, 68 insertions(+), 0 deletions(-)

diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
index f79564b..4297788 100644
--- a/hw/9pfs/cofs.c
+++ b/hw/9pfs/cofs.c
@@ -54,3 +54,67 @@ int v9fs_co_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
         });
     return err;
 }
+
+int v9fs_co_chmod(V9fsState *s, V9fsString *path, mode_t mode)
+{
+    int err;
+    FsCred cred;
+
+    cred_init(&cred);
+    cred.fc_mode = mode;
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->chmod(&s->ctx, path->data, &cred);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
+
+int v9fs_co_utimensat(V9fsState *s, V9fsString *path,
+                      struct timespec times[2])
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->utimensat(&s->ctx, path->data, times);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
+
+int v9fs_co_chown(V9fsState *s, V9fsString *path, uid_t uid, gid_t gid)
+{
+    int err;
+    FsCred cred;
+
+    cred_init(&cred);
+    cred.fc_uid = uid;
+    cred.fc_gid = gid;
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->chown(&s->ctx, path->data, &cred);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
+
+int v9fs_co_truncate(V9fsState *s, V9fsString *path, off_t size)
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->truncate(&s->ctx, path->data, size);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 3538d91..09f232a 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -64,4 +64,8 @@ extern void v9fs_co_seekdir(V9fsState *, V9fsFidState *, off_t);
 extern void v9fs_co_rewinddir(V9fsState *, V9fsFidState *);
 extern int v9fs_co_statfs(V9fsState *, V9fsString *, struct statfs *);
 extern int v9fs_co_lstat(V9fsState *, V9fsString *, struct stat *);
+extern int v9fs_co_chmod(V9fsState *, V9fsString *, mode_t);
+extern int v9fs_co_utimensat(V9fsState *, V9fsString *, struct timespec [2]);
+extern int v9fs_co_chown(V9fsState *, V9fsString *, uid_t, gid_t);
+extern int v9fs_co_truncate(V9fsState *, V9fsString *, off_t);
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 16/25] hw/9pfs: Update v9fs_setattr to use coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (14 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 15/25] hw/9pfs: Add yield support to setattr related coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 17/25] hw/9pfs: Add yield support to xattr related coroutine Venkateswararao Jujjuri (JV)
                   ` (9 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |  163 +++++++++++++++++----------------------------------
 hw/9pfs/virtio-9p.h |    8 ---
 2 files changed, 54 insertions(+), 117 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 936e97f..f7e1980 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -1330,139 +1330,84 @@ out:
 #define ATTR_ATIME_SET  (1 << 7)
 #define ATTR_MTIME_SET  (1 << 8)
 
-static void v9fs_setattr_post_truncate(V9fsState *s, V9fsSetattrState *vs,
-                                                                  int err)
-{
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
-    err = vs->offset;
-
-out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
-}
-
-static void v9fs_setattr_post_chown(V9fsState *s, V9fsSetattrState *vs, int err)
+static void v9fs_setattr(void *opaque)
 {
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
+    int err = 0;
+    int32_t fid;
+    V9fsFidState *fidp;
+    size_t offset = 7;
+    V9fsIattr v9iattr;
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
 
-    if (vs->v9iattr.valid & (ATTR_SIZE)) {
-        err = v9fs_do_truncate(s, &vs->fidp->path, vs->v9iattr.size);
-    }
-    v9fs_setattr_post_truncate(s, vs, err);
-    return;
+    pdu_unmarshal(pdu, offset, "dI", &fid, &v9iattr);
 
-out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
-}
-
-static void v9fs_setattr_post_utimensat(V9fsState *s, V9fsSetattrState *vs,
-                                                                   int err)
-{
-    if (err == -1) {
-        err = -errno;
+    fidp = lookup_fid(s, fid);
+    if (fidp == NULL) {
+        err = -EINVAL;
         goto out;
     }
-
-    /* If the only valid entry in iattr is ctime we can call
-     * chown(-1,-1) to update the ctime of the file
-     */
-    if ((vs->v9iattr.valid & (ATTR_UID | ATTR_GID)) ||
-            ((vs->v9iattr.valid & ATTR_CTIME)
-            && !((vs->v9iattr.valid & ATTR_MASK) & ~ATTR_CTIME))) {
-        if (!(vs->v9iattr.valid & ATTR_UID)) {
-            vs->v9iattr.uid = -1;
-        }
-        if (!(vs->v9iattr.valid & ATTR_GID)) {
-            vs->v9iattr.gid = -1;
+    if (v9iattr.valid & ATTR_MODE) {
+        err = v9fs_co_chmod(s, &fidp->path, v9iattr.mode);
+        if (err < 0) {
+            goto out;
         }
-        err = v9fs_do_chown(s, &vs->fidp->path, vs->v9iattr.uid,
-                                                vs->v9iattr.gid);
     }
-    v9fs_setattr_post_chown(s, vs, err);
-    return;
-
-out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
-}
-
-static void v9fs_setattr_post_chmod(V9fsState *s, V9fsSetattrState *vs, int err)
-{
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
-
-    if (vs->v9iattr.valid & (ATTR_ATIME | ATTR_MTIME)) {
+    if (v9iattr.valid & (ATTR_ATIME | ATTR_MTIME)) {
         struct timespec times[2];
-        if (vs->v9iattr.valid & ATTR_ATIME) {
-            if (vs->v9iattr.valid & ATTR_ATIME_SET) {
-                times[0].tv_sec = vs->v9iattr.atime_sec;
-                times[0].tv_nsec = vs->v9iattr.atime_nsec;
+        if (v9iattr.valid & ATTR_ATIME) {
+            if (v9iattr.valid & ATTR_ATIME_SET) {
+                times[0].tv_sec = v9iattr.atime_sec;
+                times[0].tv_nsec = v9iattr.atime_nsec;
             } else {
                 times[0].tv_nsec = UTIME_NOW;
             }
         } else {
             times[0].tv_nsec = UTIME_OMIT;
         }
-
-        if (vs->v9iattr.valid & ATTR_MTIME) {
-            if (vs->v9iattr.valid & ATTR_MTIME_SET) {
-                times[1].tv_sec = vs->v9iattr.mtime_sec;
-                times[1].tv_nsec = vs->v9iattr.mtime_nsec;
+        if (v9iattr.valid & ATTR_MTIME) {
+            if (v9iattr.valid & ATTR_MTIME_SET) {
+                times[1].tv_sec = v9iattr.mtime_sec;
+                times[1].tv_nsec = v9iattr.mtime_nsec;
             } else {
                 times[1].tv_nsec = UTIME_NOW;
             }
         } else {
             times[1].tv_nsec = UTIME_OMIT;
         }
-        err = v9fs_do_utimensat(s, &vs->fidp->path, times);
+        err = v9fs_co_utimensat(s, &fidp->path, times);
+        if (err < 0) {
+            goto out;
+        }
     }
-    v9fs_setattr_post_utimensat(s, vs, err);
-    return;
-
-out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
-}
-
-static void v9fs_setattr(void *opaque)
-{
-    V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
-    int32_t fid;
-    V9fsSetattrState *vs;
-    int err = 0;
-
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    pdu_unmarshal(pdu, vs->offset, "dI", &fid, &vs->v9iattr);
-
-    vs->fidp = lookup_fid(s, fid);
-    if (vs->fidp == NULL) {
-        err = -EINVAL;
-        goto out;
+    /*
+     * If the only valid entry in iattr is ctime we can call
+     * chown(-1,-1) to update the ctime of the file
+     */
+    if ((v9iattr.valid & (ATTR_UID | ATTR_GID)) ||
+        ((v9iattr.valid & ATTR_CTIME)
+         && !((v9iattr.valid & ATTR_MASK) & ~ATTR_CTIME))) {
+        if (!(v9iattr.valid & ATTR_UID)) {
+            v9iattr.uid = -1;
+        }
+        if (!(v9iattr.valid & ATTR_GID)) {
+            v9iattr.gid = -1;
+        }
+        err = v9fs_co_chown(s, &fidp->path, v9iattr.uid,
+                            v9iattr.gid);
+        if (err < 0) {
+            goto out;
+        }
     }
-
-    if (vs->v9iattr.valid & ATTR_MODE) {
-        err = v9fs_do_chmod(s, &vs->fidp->path, vs->v9iattr.mode);
+    if (v9iattr.valid & (ATTR_SIZE)) {
+        err = v9fs_co_truncate(s, &fidp->path, v9iattr.size);
+        if (err < 0) {
+            goto out;
+        }
     }
-
-    v9fs_setattr_post_chmod(s, vs, err);
-    return;
-
+    err = offset;
 out:
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
+    complete_pdu(s, pdu, err);
 }
 
 static void v9fs_walk_complete(V9fsState *s, V9fsWalkState *vs, int err)
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index debc64a..2298d9c 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -374,14 +374,6 @@ typedef struct V9fsIattr
     int64_t mtime_nsec;
 } V9fsIattr;
 
-typedef struct V9fsSetattrState
-{
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsIattr v9iattr;
-    V9fsFidState *fidp;
-} V9fsSetattrState;
-
 struct virtio_9p_config
 {
     /* number of characters in tag */
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 17/25] hw/9pfs: Add yield support to xattr related coroutine
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (15 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 16/25] hw/9pfs: Update v9fs_setattr to use coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 18/25] hw/9pfs: Update v9fs_xattrwalk to coroutines Venkateswararao Jujjuri (JV)
                   ` (8 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

This include llistxattr and lgetxattr.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 Makefile.objs            |    1 +
 hw/9pfs/coxattr.c        |   50 ++++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    3 ++
 3 files changed, 54 insertions(+), 0 deletions(-)
 create mode 100644 hw/9pfs/coxattr.c

diff --git a/Makefile.objs b/Makefile.objs
index 83d30bd..98a345b 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -298,6 +298,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
 9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
 9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o virtio-9p-posix-acl.o
 9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o codir.o cofile.o
+9pfs-nested-$(CONFIG_VIRTFS) += coxattr.o
 
 hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
 $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
diff --git a/hw/9pfs/coxattr.c b/hw/9pfs/coxattr.c
new file mode 100644
index 0000000..2fba2c9
--- /dev/null
+++ b/hw/9pfs/coxattr.c
@@ -0,0 +1,50 @@
+
+/*
+ * Virtio 9p backend
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "fsdev/qemu-fsdev.h"
+#include "qemu-thread.h"
+#include "qemu-coroutine.h"
+#include "virtio-9p-coth.h"
+
+int v9fs_co_llistxattr(V9fsState *s, V9fsString *path, void *value, size_t size)
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->llistxattr(&s->ctx, path->data, value, size);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
+
+int v9fs_co_lgetxattr(V9fsState *s, V9fsString *path,
+                      V9fsString *xattr_name,
+                      void *value, size_t size)
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->lgetxattr(&s->ctx, path->data,
+                                    xattr_name->data,
+                                    value, size);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 09f232a..eb0c99a 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -68,4 +68,7 @@ extern int v9fs_co_chmod(V9fsState *, V9fsString *, mode_t);
 extern int v9fs_co_utimensat(V9fsState *, V9fsString *, struct timespec [2]);
 extern int v9fs_co_chown(V9fsState *, V9fsString *, uid_t, gid_t);
 extern int v9fs_co_truncate(V9fsState *, V9fsString *, off_t);
+extern int v9fs_co_llistxattr(V9fsState *, V9fsString *, void *, size_t);
+extern int v9fs_co_lgetxattr(V9fsState *, V9fsString *,
+                             V9fsString *, void *, size_t);
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 18/25] hw/9pfs: Update v9fs_xattrwalk to coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (16 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 17/25] hw/9pfs: Add yield support to xattr related coroutine Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 19/25] hw/9pfs: Update v9fs_xattrcreate to use coroutines Venkateswararao Jujjuri (JV)
                   ` (7 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |  198 ++++++++++++++++-----------------------------------
 1 files changed, 63 insertions(+), 135 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index f7e1980..dc220f9 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -240,21 +240,6 @@ static int v9fs_do_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
     return s->ops->statfs(&s->ctx, path->data, stbuf);
 }
 
-static ssize_t v9fs_do_lgetxattr(V9fsState *s, V9fsString *path,
-                             V9fsString *xattr_name,
-                             void *value, size_t size)
-{
-    return s->ops->lgetxattr(&s->ctx, path->data,
-                             xattr_name->data, value, size);
-}
-
-static ssize_t v9fs_do_llistxattr(V9fsState *s, V9fsString *path,
-                              void *value, size_t size)
-{
-    return s->ops->llistxattr(&s->ctx, path->data,
-                              value, size);
-}
-
 static int v9fs_do_lsetxattr(V9fsState *s, V9fsString *path,
                              V9fsString *xattr_name,
                              void *value, size_t size, int flags)
@@ -3239,149 +3224,92 @@ out:
     v9fs_string_free(&name);
 }
 
-static void v9fs_post_xattr_getvalue(V9fsState *s, V9fsXattrState *vs, int err)
-{
-
-    if (err < 0) {
-        err = -errno;
-        free_fid(s, vs->xattr_fidp->fid);
-        goto out;
-    }
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "q", vs->size);
-    err = vs->offset;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-    return;
-}
-
-static void v9fs_post_xattr_check(V9fsState *s, V9fsXattrState *vs, ssize_t err)
-{
-    if (err < 0) {
-        err = -errno;
-        free_fid(s, vs->xattr_fidp->fid);
-        goto out;
-    }
-    /*
-     * Read the xattr value
-     */
-    vs->xattr_fidp->fs.xattr.len = vs->size;
-    vs->xattr_fidp->fid_type = P9_FID_XATTR;
-    vs->xattr_fidp->fs.xattr.copied_len = -1;
-    if (vs->size) {
-        vs->xattr_fidp->fs.xattr.value = qemu_malloc(vs->size);
-        err = v9fs_do_lgetxattr(s, &vs->xattr_fidp->path,
-                                &vs->name, vs->xattr_fidp->fs.xattr.value,
-                                vs->xattr_fidp->fs.xattr.len);
-    }
-    v9fs_post_xattr_getvalue(s, vs, err);
-    return;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-}
-
-static void v9fs_post_lxattr_getvalue(V9fsState *s,
-                                      V9fsXattrState *vs, int err)
-{
-    if (err < 0) {
-        err = -errno;
-        free_fid(s, vs->xattr_fidp->fid);
-        goto out;
-    }
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "q", vs->size);
-    err = vs->offset;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-    return;
-}
-
-static void v9fs_post_lxattr_check(V9fsState *s,
-                                   V9fsXattrState *vs, ssize_t err)
-{
-    if (err < 0) {
-        err = -errno;
-        free_fid(s, vs->xattr_fidp->fid);
-        goto out;
-    }
-    /*
-     * Read the xattr value
-     */
-    vs->xattr_fidp->fs.xattr.len = vs->size;
-    vs->xattr_fidp->fid_type = P9_FID_XATTR;
-    vs->xattr_fidp->fs.xattr.copied_len = -1;
-    if (vs->size) {
-        vs->xattr_fidp->fs.xattr.value = qemu_malloc(vs->size);
-        err = v9fs_do_llistxattr(s, &vs->xattr_fidp->path,
-                                 vs->xattr_fidp->fs.xattr.value,
-                                 vs->xattr_fidp->fs.xattr.len);
-    }
-    v9fs_post_lxattr_getvalue(s, vs, err);
-    return;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-}
-
 static void v9fs_xattrwalk(void *opaque)
 {
-    V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
+    int64_t size;
+    V9fsString name;
     ssize_t err = 0;
-    V9fsXattrState *vs;
+    size_t offset = 7;
     int32_t fid, newfid;
+    V9fsFidState *file_fidp;
+    V9fsFidState *xattr_fidp;
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    pdu_unmarshal(vs->pdu, vs->offset, "dds", &fid, &newfid, &vs->name);
-    vs->file_fidp = lookup_fid(s, fid);
-    if (vs->file_fidp == NULL) {
+    pdu_unmarshal(pdu, offset, "dds", &fid, &newfid, &name);
+    file_fidp = lookup_fid(s, fid);
+    if (file_fidp == NULL) {
         err = -ENOENT;
         goto out;
     }
-
-    vs->xattr_fidp = alloc_fid(s, newfid);
-    if (vs->xattr_fidp == NULL) {
+    xattr_fidp = alloc_fid(s, newfid);
+    if (xattr_fidp == NULL) {
         err = -EINVAL;
         goto out;
     }
-
-    v9fs_string_copy(&vs->xattr_fidp->path, &vs->file_fidp->path);
-    if (vs->name.data[0] == 0) {
+    v9fs_string_copy(&xattr_fidp->path, &file_fidp->path);
+    if (name.data[0] == 0) {
         /*
          * listxattr request. Get the size first
          */
-        vs->size = v9fs_do_llistxattr(s, &vs->xattr_fidp->path,
-                                      NULL, 0);
-        if (vs->size < 0) {
-            err = vs->size;
+        size = v9fs_co_llistxattr(s, &xattr_fidp->path, NULL, 0);
+        if (size < 0) {
+            err = size;
+            free_fid(s, xattr_fidp->fid);
+            goto out;
         }
-        v9fs_post_lxattr_check(s, vs, err);
-        return;
+        /*
+         * Read the xattr value
+         */
+        xattr_fidp->fs.xattr.len = size;
+        xattr_fidp->fid_type = P9_FID_XATTR;
+        xattr_fidp->fs.xattr.copied_len = -1;
+        if (size) {
+            xattr_fidp->fs.xattr.value = qemu_malloc(size);
+            err = v9fs_co_llistxattr(s, &xattr_fidp->path,
+                                     xattr_fidp->fs.xattr.value,
+                                     xattr_fidp->fs.xattr.len);
+            if (err < 0) {
+                free_fid(s, xattr_fidp->fid);
+                goto out;
+            }
+        }
+        offset += pdu_marshal(pdu, offset, "q", size);
+        err = offset;
     } else {
         /*
          * specific xattr fid. We check for xattr
          * presence also collect the xattr size
          */
-        vs->size = v9fs_do_lgetxattr(s, &vs->xattr_fidp->path,
-                                     &vs->name, NULL, 0);
-        if (vs->size < 0) {
-            err = vs->size;
+        size = v9fs_co_lgetxattr(s, &xattr_fidp->path,
+                                 &name, NULL, 0);
+        if (size < 0) {
+            err = size;
+            free_fid(s, xattr_fidp->fid);
+            goto out;
         }
-        v9fs_post_xattr_check(s, vs, err);
-        return;
+        /*
+         * Read the xattr value
+         */
+        xattr_fidp->fs.xattr.len = size;
+        xattr_fidp->fid_type = P9_FID_XATTR;
+        xattr_fidp->fs.xattr.copied_len = -1;
+        if (size) {
+            xattr_fidp->fs.xattr.value = qemu_malloc(size);
+            err = v9fs_co_lgetxattr(s, &xattr_fidp->path,
+                                    &name, xattr_fidp->fs.xattr.value,
+                                    xattr_fidp->fs.xattr.len);
+            if (err < 0) {
+                free_fid(s, xattr_fidp->fid);
+                goto out;
+            }
+        }
+        offset += pdu_marshal(pdu, offset, "q", size);
+        err = offset;
     }
 out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
+    complete_pdu(s, pdu, err);
+    v9fs_string_free(&name);
 }
 
 static void v9fs_xattrcreate(void *opaque)
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 19/25] hw/9pfs: Update v9fs_xattrcreate to use coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (17 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 18/25] hw/9pfs: Update v9fs_xattrwalk to coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 20/25] hw/9pfs: Add yield support to mknod coroutine Venkateswararao Jujjuri (JV)
                   ` (6 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   53 +++++++++++++++++++++++++--------------------------
 hw/9pfs/virtio-9p.h |   11 ----------
 2 files changed, 26 insertions(+), 38 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index dc220f9..46577c0 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -3314,43 +3314,42 @@ out:
 
 static void v9fs_xattrcreate(void *opaque)
 {
-    V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
     int flags;
     int32_t fid;
+    int64_t size;
     ssize_t err = 0;
-    V9fsXattrState *vs;
-
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
+    V9fsString name;
+    size_t offset = 7;
+    V9fsFidState *file_fidp;
+    V9fsFidState *xattr_fidp;
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
 
-    pdu_unmarshal(vs->pdu, vs->offset, "dsqd",
-                  &fid, &vs->name, &vs->size, &flags);
+    pdu_unmarshal(pdu, offset, "dsqd",
+                  &fid, &name, &size, &flags);
 
-    vs->file_fidp = lookup_fid(s, fid);
-    if (vs->file_fidp == NULL) {
+    file_fidp = lookup_fid(s, fid);
+    if (file_fidp == NULL) {
         err = -EINVAL;
         goto out;
     }
-
     /* Make the file fid point to xattr */
-    vs->xattr_fidp = vs->file_fidp;
-    vs->xattr_fidp->fid_type = P9_FID_XATTR;
-    vs->xattr_fidp->fs.xattr.copied_len = 0;
-    vs->xattr_fidp->fs.xattr.len = vs->size;
-    vs->xattr_fidp->fs.xattr.flags = flags;
-    v9fs_string_init(&vs->xattr_fidp->fs.xattr.name);
-    v9fs_string_copy(&vs->xattr_fidp->fs.xattr.name, &vs->name);
-    if (vs->size)
-        vs->xattr_fidp->fs.xattr.value = qemu_malloc(vs->size);
-    else
-        vs->xattr_fidp->fs.xattr.value = NULL;
-
+    xattr_fidp = file_fidp;
+    xattr_fidp->fid_type = P9_FID_XATTR;
+    xattr_fidp->fs.xattr.copied_len = 0;
+    xattr_fidp->fs.xattr.len = size;
+    xattr_fidp->fs.xattr.flags = flags;
+    v9fs_string_init(&xattr_fidp->fs.xattr.name);
+    v9fs_string_copy(&xattr_fidp->fs.xattr.name, &name);
+    if (size) {
+        xattr_fidp->fs.xattr.value = qemu_malloc(size);
+    } else {
+        xattr_fidp->fs.xattr.value = NULL;
+    }
+    err = offset;
 out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
+    complete_pdu(s, pdu, err);
+    v9fs_string_free(&name);
 }
 
 static void v9fs_readlink(void *opaque)
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index 2298d9c..ffbb3b8 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -399,17 +399,6 @@ typedef struct V9fsRenameState {
     V9fsString name;
 } V9fsRenameState;
 
-typedef struct V9fsXattrState
-{
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsFidState *file_fidp;
-    V9fsFidState *xattr_fidp;
-    V9fsString name;
-    int64_t size;
-    int flags;
-    void *value;
-} V9fsXattrState;
 
 #define P9_LOCK_SUCCESS 0
 #define P9_LOCK_BLOCKED 1
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 20/25] hw/9pfs: Add yield support to mknod coroutine
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (18 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 19/25] hw/9pfs: Update v9fs_xattrcreate to use coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 21/25] hw/9pfs: Update v9fs_mknod to use coroutines Venkateswararao Jujjuri (JV)
                   ` (5 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/cofs.c           |   21 +++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    2 ++
 2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
index 4297788..af7b78e 100644
--- a/hw/9pfs/cofs.c
+++ b/hw/9pfs/cofs.c
@@ -118,3 +118,24 @@ int v9fs_co_truncate(V9fsState *s, V9fsString *path, off_t size)
         });
     return err;
 }
+
+int v9fs_co_mknod(V9fsState *s, V9fsString *path, uid_t uid,
+                  gid_t gid, dev_t dev, mode_t mode)
+{
+    int err;
+    FsCred cred;
+
+    cred_init(&cred);
+    cred.fc_uid  = uid;
+    cred.fc_gid  = gid;
+    cred.fc_mode = mode;
+    cred.fc_rdev = dev;
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->mknod(&s->ctx, path->data, &cred);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index eb0c99a..d023683 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -71,4 +71,6 @@ extern int v9fs_co_truncate(V9fsState *, V9fsString *, off_t);
 extern int v9fs_co_llistxattr(V9fsState *, V9fsString *, void *, size_t);
 extern int v9fs_co_lgetxattr(V9fsState *, V9fsString *,
                              V9fsString *, void *, size_t);
+extern int v9fs_co_mknod(V9fsState *, V9fsString *, uid_t,
+                         gid_t, dev_t, mode_t);
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 21/25] hw/9pfs: Update v9fs_mknod to use coroutines
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (19 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 20/25] hw/9pfs: Add yield support to mknod coroutine Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 22/25] [virtio-9p] coroutine and threading for mkdir Venkateswararao Jujjuri (JV)
                   ` (4 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: aliguori, Venkateswararao Jujjuri ", stefanha, Aneesh Kumar K.V

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   88 +++++++++++++++++---------------------------------
 1 files changed, 30 insertions(+), 58 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 46577c0..3f4d449 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -3017,77 +3017,49 @@ out:
     return;
 }
 
-static void v9fs_mknod_post_lstat(V9fsState *s, V9fsMkState *vs, int err)
-{
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
-
-    stat_to_qid(&vs->stbuf, &vs->qid);
-    vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
-    err = vs->offset;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->fullname);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-}
-
-static void v9fs_mknod_post_mknod(V9fsState *s, V9fsMkState *vs, int err)
-{
-    if (err == -1) {
-        err = -errno;
-        goto out;
-    }
-
-    err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
-    v9fs_mknod_post_lstat(s, vs, err);
-    return;
-out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->fullname);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
-}
-
 static void v9fs_mknod(void *opaque)
 {
-    V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
+
+    int mode;
+    gid_t gid;
     int32_t fid;
-    V9fsMkState *vs;
+    V9fsQID qid;
     int err = 0;
-    V9fsFidState *fidp;
-    gid_t gid;
-    int mode;
     int major, minor;
+    size_t offset = 7;
+    V9fsString name;
+    struct stat stbuf;
+    V9fsString fullname;
+    V9fsFidState *fidp;
+    V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    v9fs_string_init(&vs->fullname);
-    pdu_unmarshal(vs->pdu, vs->offset, "dsdddd", &fid, &vs->name, &mode,
-        &major, &minor, &gid);
+    v9fs_string_init(&fullname);
+    pdu_unmarshal(pdu, offset, "dsdddd", &fid, &name, &mode,
+                  &major, &minor, &gid);
 
     fidp = lookup_fid(s, fid);
     if (fidp == NULL) {
         err = -ENOENT;
         goto out;
     }
-
-    v9fs_string_sprintf(&vs->fullname, "%s/%s", fidp->path.data, vs->name.data);
-    err = v9fs_do_mknod(s, vs->fullname.data, mode, makedev(major, minor),
-        fidp->uid, gid);
-    v9fs_mknod_post_mknod(s, vs, err);
-    return;
-
+    v9fs_string_sprintf(&fullname, "%s/%s", fidp->path.data, name.data);
+    err = v9fs_co_mknod(s, &fullname, fidp->uid, gid,
+                        makedev(major, minor), mode);
+    if (err < 0) {
+        goto out;
+    }
+    err = v9fs_co_lstat(s, &fullname, &stbuf);
+    if (err < 0) {
+        goto out;
+    }
+    stat_to_qid(&stbuf, &qid);
+    err = offset;
+    err += pdu_marshal(pdu, offset, "Q", &qid);
 out:
-    complete_pdu(s, vs->pdu, err);
-    v9fs_string_free(&vs->fullname);
-    v9fs_string_free(&vs->name);
-    qemu_free(vs);
+    complete_pdu(s, pdu, err);
+    v9fs_string_free(&fullname);
+    v9fs_string_free(&name);
 }
 
 /*
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 22/25] [virtio-9p] coroutine and threading for mkdir
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (20 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 21/25] hw/9pfs: Update v9fs_mknod to use coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 23/25] [virtio-9p] Remove post functions for v9fs_remove Venkateswararao Jujjuri (JV)
                   ` (3 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/codir.c          |   19 +++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    1 +
 hw/9pfs/virtio-9p.c      |   28 ++++++----------------------
 3 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/hw/9pfs/codir.c b/hw/9pfs/codir.c
index 885f7d0..4ccf94f 100644
--- a/hw/9pfs/codir.c
+++ b/hw/9pfs/codir.c
@@ -66,3 +66,22 @@ void v9fs_co_rewinddir(V9fsState *s, V9fsFidState *fidp)
         });
     return;
 }
+
+int v9fs_co_mkdir(V9fsState *s, char *name, mode_t mode, uid_t uid, gid_t gid)
+{
+    int err;
+    FsCred cred;
+
+    cred_init(&cred);
+    cred.fc_mode = mode;
+    cred.fc_uid = uid;
+    cred.fc_gid = gid;
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->mkdir(&s->ctx, name, &cred);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index d023683..96e88d8 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -73,4 +73,5 @@ extern int v9fs_co_lgetxattr(V9fsState *, V9fsString *,
                              V9fsString *, void *, size_t);
 extern int v9fs_co_mknod(V9fsState *, V9fsString *, uid_t,
                          gid_t, dev_t, mode_t);
+extern int v9fs_co_mkdir(V9fsState *, char *, mode_t, uid_t, gid_t);
 #endif
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 3f4d449..89fe652 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -149,19 +149,6 @@ static int v9fs_do_mknod(V9fsState *s, char *name,
     return s->ops->mknod(&s->ctx, name, &cred);
 }
 
-static int v9fs_do_mkdir(V9fsState *s, char *name, mode_t mode,
-                uid_t uid, gid_t gid)
-{
-    FsCred cred;
-
-    cred_init(&cred);
-    cred.fc_uid = uid;
-    cred.fc_gid = gid;
-    cred.fc_mode = mode;
-
-    return s->ops->mkdir(&s->ctx, name, &cred);
-}
-
 static int v9fs_do_fstat(V9fsState *s, int fd, struct stat *stbuf)
 {
     return s->ops->fstat(&s->ctx, fd, stbuf);
@@ -2327,8 +2314,7 @@ out:
 
 static void v9fs_create_post_mkdir(V9fsState *s, V9fsCreateState *vs, int err)
 {
-    if (err) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -2377,7 +2363,7 @@ static void v9fs_create_post_lstat(V9fsState *s, V9fsCreateState *vs, int err)
     }
 
     if (vs->perm & P9_STAT_MODE_DIR) {
-        err = v9fs_do_mkdir(s, vs->fullname.data, vs->perm & 0777,
+        err = v9fs_co_mkdir(s, vs->fullname.data, vs->perm & 0777,
                 vs->fidp->uid, -1);
         v9fs_create_post_mkdir(s, vs, err);
     } else if (vs->perm & P9_STAT_MODE_SYMLINK) {
@@ -3177,14 +3163,12 @@ static void v9fs_mkdir(void *opaque)
         goto out;
     }
     v9fs_string_sprintf(&fullname, "%s/%s", fidp->path.data, name.data);
-    err = v9fs_do_mkdir(pdu->s, fullname.data, mode, fidp->uid, gid);
-    if (err == -1) {
-        err = -errno;
+    err = v9fs_co_mkdir(pdu->s, fullname.data, mode, fidp->uid, gid);
+    if (err < 0) {
         goto out;
     }
-    err = v9fs_do_lstat(pdu->s, &fullname, &stbuf);
-    if (err == -1) {
-        err = -errno;
+    err = v9fs_co_lstat(pdu->s, &fullname, &stbuf);
+    if (err < 0) {
         goto out;
     }
     stat_to_qid(&stbuf, &qid);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 23/25] [virtio-9p] Remove post functions for v9fs_remove
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (21 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 22/25] [virtio-9p] coroutine and threading for mkdir Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 24/25] [virtio-9p] clean up v9fs_remove Venkateswararao Jujjuri (JV)
                   ` (2 subsequent siblings)
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   26 +++++++-------------------
 1 files changed, 7 insertions(+), 19 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 89fe652..a79ec72 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -2577,22 +2577,6 @@ out:
     complete_pdu(s, pdu, err);
 }
 
-static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
-                                                                int err)
-{
-    if (err < 0) {
-        err = -errno;
-    } else {
-        err = vs->offset;
-    }
-
-    /* For TREMOVE we need to clunk the fid even on failed remove */
-    free_fid(s, vs->fidp->fid);
-
-    complete_pdu(s, vs->pdu, err);
-    qemu_free(vs);
-}
-
 static void v9fs_remove(void *opaque)
 {
     V9fsPDU *pdu = opaque;
@@ -2612,11 +2596,15 @@ static void v9fs_remove(void *opaque)
         err = -EINVAL;
         goto out;
     }
-
     err = v9fs_do_remove(s, &vs->fidp->path);
-    v9fs_remove_post_remove(s, vs, err);
-    return;
+    if (err < 0) {
+        err = -errno;
+    } else {
+        err = vs->offset;
+    }
 
+    /* For TREMOVE we need to clunk the fid even on failed remove */
+    free_fid(s, vs->fidp->fid);
 out:
     complete_pdu(s, pdu, err);
     qemu_free(vs);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 24/25] [virtio-9p] clean up v9fs_remove.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (22 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 23/25] [virtio-9p] Remove post functions for v9fs_remove Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-17 19:43 ` [Qemu-devel] [V2 25/25] [virtio-9p] coroutine and threading for remove/unlink Venkateswararao Jujjuri (JV)
  2011-05-18 10:39 ` [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Stefan Hajnoczi
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Rearrange the code so that we can avoid V9fsRemoveState
and additional malloc()s.

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/virtio-9p.c |   25 ++++++++++---------------
 hw/9pfs/virtio-9p.h |    6 ------
 2 files changed, 10 insertions(+), 21 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index a79ec72..ce45f00 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -2579,35 +2579,30 @@ out:
 
 static void v9fs_remove(void *opaque)
 {
-    V9fsPDU *pdu = opaque;
-    V9fsState *s = pdu->s;
     int32_t fid;
-    V9fsRemoveState *vs;
     int err = 0;
+    size_t offset = 7;
+    V9fsFidState *fidp;
+    V9fsPDU *pdu = opaque;
 
-    vs = qemu_malloc(sizeof(*vs));
-    vs->pdu = pdu;
-    vs->offset = 7;
-
-    pdu_unmarshal(vs->pdu, vs->offset, "d", &fid);
+    pdu_unmarshal(pdu, offset, "d", &fid);
 
-    vs->fidp = lookup_fid(s, fid);
-    if (vs->fidp == NULL) {
+    fidp = lookup_fid(pdu->s, fid);
+    if (fidp == NULL) {
         err = -EINVAL;
         goto out;
     }
-    err = v9fs_do_remove(s, &vs->fidp->path);
+    err = v9fs_do_remove(pdu->s, &fidp->path);
     if (err < 0) {
         err = -errno;
     } else {
-        err = vs->offset;
+        err = offset;
     }
 
     /* For TREMOVE we need to clunk the fid even on failed remove */
-    free_fid(s, vs->fidp->fid);
+    free_fid(pdu->s, fidp->fid);
 out:
-    complete_pdu(s, pdu, err);
-    qemu_free(vs);
+    complete_pdu(pdu->s, pdu, err);
 }
 
 static void v9fs_wstat_post_truncate(V9fsState *s, V9fsWstatState *vs, int err)
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index ffbb3b8..b693f74 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -333,12 +333,6 @@ typedef struct V9fsWriteState {
     int cnt;
 } V9fsWriteState;
 
-typedef struct V9fsRemoveState {
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsFidState *fidp;
-} V9fsRemoveState;
-
 typedef struct V9fsWstatState
 {
     V9fsPDU *pdu;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [V2 25/25] [virtio-9p] coroutine and threading for remove/unlink
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (23 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 24/25] [virtio-9p] clean up v9fs_remove Venkateswararao Jujjuri (JV)
@ 2011-05-17 19:43 ` Venkateswararao Jujjuri (JV)
  2011-05-18 10:39 ` [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Stefan Hajnoczi
  25 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri (JV) @ 2011-05-17 19:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Venkateswararao Jujjuri (JV), stefanha

Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/cofs.c           |   14 ++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    1 +
 hw/9pfs/virtio-9p.c      |   11 ++---------
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
index af7b78e..af17077 100644
--- a/hw/9pfs/cofs.c
+++ b/hw/9pfs/cofs.c
@@ -139,3 +139,17 @@ int v9fs_co_mknod(V9fsState *s, V9fsString *path, uid_t uid,
         });
     return err;
 }
+
+int v9fs_co_remove(V9fsState *s, V9fsString *path)
+{
+    int err;
+
+    v9fs_co_run_in_worker(
+        {
+            err = s->ops->remove(&s->ctx, path->data);
+            if (err < 0) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 96e88d8..60795c4 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -74,4 +74,5 @@ extern int v9fs_co_lgetxattr(V9fsState *, V9fsString *,
 extern int v9fs_co_mknod(V9fsState *, V9fsString *, uid_t,
                          gid_t, dev_t, mode_t);
 extern int v9fs_co_mkdir(V9fsState *, char *, mode_t, uid_t, gid_t);
+extern int v9fs_co_remove(V9fsState *, V9fsString *);
 #endif
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index ce45f00..0dba63d 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -212,11 +212,6 @@ static int v9fs_do_utimensat(V9fsState *s, V9fsString *path,
     return s->ops->utimensat(&s->ctx, path->data, times);
 }
 
-static int v9fs_do_remove(V9fsState *s, V9fsString *path)
-{
-    return s->ops->remove(&s->ctx, path->data);
-}
-
 static int v9fs_do_fsync(V9fsState *s, int fd, int datasync)
 {
     return s->ops->fsync(&s->ctx, fd, datasync);
@@ -2592,10 +2587,8 @@ static void v9fs_remove(void *opaque)
         err = -EINVAL;
         goto out;
     }
-    err = v9fs_do_remove(pdu->s, &fidp->path);
-    if (err < 0) {
-        err = -errno;
-    } else {
+    err = v9fs_co_remove(pdu->s, &fidp->path);
+    if (!err) {
         err = offset;
     }
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 03/25] [virtio-9p] Remove post functions for v9fs_readlink.
  2011-05-17 19:43 ` [Qemu-devel] [V2 03/25] [virtio-9p] Remove post functions for v9fs_readlink Venkateswararao Jujjuri (JV)
@ 2011-05-18  9:27   ` Stefan Hajnoczi
  0 siblings, 0 replies; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-18  9:27 UTC (permalink / raw)
  To: Venkateswararao Jujjuri (JV); +Cc: aliguori, qemu-devel, stefanha

On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
<jvrao@linux.vnet.ibm.com> wrote:
> @@ -3621,8 +3605,13 @@ static void v9fs_readlink(void *opaque)
>
>     v9fs_string_init(&vs->target);
>     err = v9fs_do_readlink(s, &fidp->path, &vs->target);
> -    v9fs_readlink_post_readlink(s, vs, err);
> -    return;
> +    if (err < 0) {
> +        err = -errno;
> +        goto out;
> +    }
> +    vs->offset += pdu_marshal(vs->pdu, vs->offset, "s", &vs->target);
> +    err = vs->offset;
> +    v9fs_string_free(&vs->target);
>  out:

The vs->target string should be freed when v9fs_do_readlink() fails.
v9fs_do_readlink() *always* allocates vs->target.data, it doesn't free
it on error.

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 05/25] [virtio-9p] Move errno into v9fs_do_readlink
  2011-05-17 19:43 ` [Qemu-devel] [V2 05/25] [virtio-9p] Move errno into v9fs_do_readlink Venkateswararao Jujjuri (JV)
@ 2011-05-18  9:31   ` Stefan Hajnoczi
  2011-05-18 18:28     ` Venkateswararao Jujjuri
  0 siblings, 1 reply; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-18  9:31 UTC (permalink / raw)
  To: Venkateswararao Jujjuri (JV); +Cc: aliguori, qemu-devel, stefanha

On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
<jvrao@linux.vnet.ibm.com> wrote:
> Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
> ---
>  hw/9pfs/virtio-9p.c |   32 ++++++++++++++++----------------
>  1 files changed, 16 insertions(+), 16 deletions(-)

Please see my comment from v1:
"The len argument is redundant and not used by any callers, please just
return -errno and drop the len argument.  Callers rely on buf->size
instead."

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink
  2011-05-17 19:43 ` [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink Venkateswararao Jujjuri (JV)
@ 2011-05-18  9:43   ` Stefan Hajnoczi
  2011-05-18 18:42     ` Venkateswararao Jujjuri
  0 siblings, 1 reply; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-18  9:43 UTC (permalink / raw)
  To: Venkateswararao Jujjuri (JV); +Cc: aliguori, qemu-devel, stefanha

On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
<jvrao@linux.vnet.ibm.com> wrote:
> Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
> ---
>  Makefile.objs            |    2 +-
>  hw/9pfs/cofs.c           |   42 ++++++++++++++++++++++++++++++++++++++++++
>  hw/9pfs/virtio-9p-coth.h |    1 +
>  hw/9pfs/virtio-9p.c      |   27 ++++-----------------------
>  hw/9pfs/virtio-9p.h      |    3 ++-
>  5 files changed, 50 insertions(+), 25 deletions(-)
>  create mode 100644 hw/9pfs/cofs.c
>
> diff --git a/Makefile.objs b/Makefile.objs
> index 96f6a24..36005bb 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
>  9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
>  9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
>  9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o virtio-9p-posix-acl.o
> -9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o
> +9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o
>
>  hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
>  $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
> diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
> new file mode 100644
> index 0000000..6d94673
> --- /dev/null
> +++ b/hw/9pfs/cofs.c
> @@ -0,0 +1,42 @@
> +
> +/*
> + * Virtio 9p backend
> + *
> + * Copyright IBM, Corp. 2011
> + *
> + * Authors:
> + *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "fsdev/qemu-fsdev.h"
> +#include "qemu-thread.h"
> +#include "qemu-coroutine.h"
> +#include "virtio-9p-coth.h"
> +
> +int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
> +{
> +    int err;
> +    ssize_t len;
> +    V9fsString tbuf;
> +
> +    tbuf.data = qemu_malloc(PATH_MAX);

Why introduce tbuf when the buf is available?  You end up having to
copy back fields at the end of the function and load from an
uninitialized address (tbuf.size) in the error case.

> @@ -299,7 +282,7 @@ static void v9fs_string_init(V9fsString *str)
>     str->size = 0;
>  }
>
> -static void v9fs_string_free(V9fsString *str)
> +void v9fs_string_free(V9fsString *str)
>  {
>     qemu_free(str->data);
>     str->data = NULL;
> @@ -421,7 +404,7 @@ v9fs_string_sprintf(V9fsString *str, const char *fmt, ...)
>     str->size = err;
>  }
>
> -static void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs)
> +void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs)
>  {
>     v9fs_string_free(lhs);
>     v9fs_string_sprintf(lhs, "%s", rhs->data);

Spurious changes?  I don't see any users here.

> @@ -1057,8 +1040,7 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name,
>     v9fs_string_null(&v9stat->extension);
>
>     if (v9stat->mode & P9_STAT_MODE_SYMLINK) {
> -        ssize_t symlink_len;
> -        err = v9fs_do_readlink(s, name, &v9stat->extension, &symlink_len);
> +        err = v9fs_co_readlink(s, name, &v9stat->extension);
>         if (err < 0) {
>             return err;
>         }
> @@ -3591,7 +3573,6 @@ static void v9fs_readlink(void *opaque)
>     int32_t fid;
>     int err = 0;
>     V9fsFidState *fidp;
> -    ssize_t symlink_len;
>
>     pdu_unmarshal(pdu, offset, "d", &fid);
>     fidp = lookup_fid(pdu->s, fid);
> @@ -3601,7 +3582,7 @@ static void v9fs_readlink(void *opaque)
>     }
>
>     v9fs_string_init(&target);
> -    err = v9fs_do_readlink(pdu->s, &fidp->path, &target, &symlink_len);
> +    err = v9fs_co_readlink(pdu->s, &fidp->path, &target);
>     if (err < 0) {
>         goto out;
>     }

Ah, the unused length argument from patch 5 has been removed.  It
would be nice to do fixes earlier rather than later in the patch
series, otherwise time is spent reviewing and commenting on code which
gets removed.

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 09/25] hw/9pfs: Add yield support for readdir related coroutines
  2011-05-17 19:43 ` [Qemu-devel] [V2 09/25] hw/9pfs: Add yield support for readdir related coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-18  9:55   ` Stefan Hajnoczi
  0 siblings, 0 replies; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-18  9:55 UTC (permalink / raw)
  To: Venkateswararao Jujjuri (JV)
  Cc: Aneesh Kumar K.V, aliguori, qemu-devel, stefanha

On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
<jvrao@linux.vnet.ibm.com> wrote:
> +void v9fs_co_seekdir(V9fsState *s, V9fsFidState *fidp, off_t offset)
> +{
> +    v9fs_co_run_in_worker(
> +        {
> +            s->ops->seekdir(&s->ctx, fidp->fs.dir, offset);
> +        });
> +    return;

Please do not put return statements at the end of void functions.

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 10/25] hw/9pfs: Update v9fs_readdir to use coroutines
  2011-05-17 19:43 ` [Qemu-devel] [V2 10/25] hw/9pfs: Update v9fs_readdir to use coroutines Venkateswararao Jujjuri (JV)
@ 2011-05-18 10:10   ` Stefan Hajnoczi
  0 siblings, 0 replies; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-18 10:10 UTC (permalink / raw)
  To: Venkateswararao Jujjuri (JV)
  Cc: Aneesh Kumar K.V, aliguori, qemu-devel, stefanha

On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
<jvrao@linux.vnet.ibm.com> wrote:
> -/* Size of each dirent on the wire: size of qid (13) + size of offset (8)
> +/*
> + * Size of each dirent on the wire: size of qid (13) + size of offset (8)
>  * size of type (1) + size of name.size (2) + strlen(name.data)
>  */
> -#define V9_READDIR_DATA_SZ (24 + strlen(vs->name.data))
> +#define V9_READDIR_DATA_SZ (24 + strlen(name.data))

This should look like a function, not like a constant:
static size_t v9fs_readdir_data_size(V9fsString *name)
{
    /*
     * Size of each dirent on the wire: size of qid (13) + size of offset (8)
     * size of type (1) + size of name.size (2) + strlen(name.data)
     */
    return 24 + v9fs_string_size(name);
}

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines.
  2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
                   ` (24 preceding siblings ...)
  2011-05-17 19:43 ` [Qemu-devel] [V2 25/25] [virtio-9p] coroutine and threading for remove/unlink Venkateswararao Jujjuri (JV)
@ 2011-05-18 10:39 ` Stefan Hajnoczi
  2011-05-18 18:43   ` Venkateswararao Jujjuri
  25 siblings, 1 reply; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-18 10:39 UTC (permalink / raw)
  To: Venkateswararao Jujjuri (JV); +Cc: aliguori, qemu-devel, stefanha

On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
<jvrao@linux.vnet.ibm.com> wrote:

I sent comments on individual patches.  This is turning out nice, many
of the PDU handlers are now straight-line code that can be followed
easily.

> o Redesigned to use bh as per Stefan's suggestion.
>  This made the code very simple but is little less performant compared to V1.
>  Anthony suggested to go-in with cleaner code and design (This version) and
>  deal with the performance later.
>  Just to put in perspective:
>  Sequential Writes of creating 1GB files using ffsb
>  o Write size 8k
>  With bh: 66.9MB/sec
>  Without bh (marshalling routines): 74.9 MB/sec
>
>  o Write size 128k
>  With bh: 117MB/sec
>  Without bh (marshalling routines): 122MB/sec

It would be interesting to hack in a post-yield callback which is
invoked after yield transfers control back to the calling coroutine.
This avoids setting up a BH and notifying the iothread to invoke it.
I'm just suggesting this as an experiment to see if the BH mechanism
causes the performance degradation, not as a real solution.

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 05/25] [virtio-9p] Move errno into v9fs_do_readlink
  2011-05-18  9:31   ` Stefan Hajnoczi
@ 2011-05-18 18:28     ` Venkateswararao Jujjuri
  0 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri @ 2011-05-18 18:28 UTC (permalink / raw)
  To: qemu-devel

On 05/18/2011 02:31 AM, Stefan Hajnoczi wrote:
> On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
> <jvrao@linux.vnet.ibm.com>  wrote:
>> Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
>> ---
>>   hw/9pfs/virtio-9p.c |   32 ++++++++++++++++----------------
>>   1 files changed, 16 insertions(+), 16 deletions(-)
> Please see my comment from v1:
> "The len argument is redundant and not used by any callers, please just
> return -errno and drop the len argument.  Callers rely on buf->size
> instead."
We took care of this while introducing coroutines in patch 6.
06/25 will modify functions for the new int v9fs_co_readlink(V9fsState 
*s, V9fsString *path, V9fsString *buf)

Thanks,
JV
> Stefan
>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink
  2011-05-18  9:43   ` Stefan Hajnoczi
@ 2011-05-18 18:42     ` Venkateswararao Jujjuri
  2011-05-19  5:37       ` Stefan Hajnoczi
  0 siblings, 1 reply; 38+ messages in thread
From: Venkateswararao Jujjuri @ 2011-05-18 18:42 UTC (permalink / raw)
  To: qemu-devel

On 05/18/2011 02:43 AM, Stefan Hajnoczi wrote:
> On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
> <jvrao@linux.vnet.ibm.com>  wrote:
>> Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
>> ---
>>   Makefile.objs            |    2 +-
>>   hw/9pfs/cofs.c           |   42 ++++++++++++++++++++++++++++++++++++++++++
>>   hw/9pfs/virtio-9p-coth.h |    1 +
>>   hw/9pfs/virtio-9p.c      |   27 ++++-----------------------
>>   hw/9pfs/virtio-9p.h      |    3 ++-
>>   5 files changed, 50 insertions(+), 25 deletions(-)
>>   create mode 100644 hw/9pfs/cofs.c
>>
>> diff --git a/Makefile.objs b/Makefile.objs
>> index 96f6a24..36005bb 100644
>> --- a/Makefile.objs
>> +++ b/Makefile.objs
>> @@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
>>   9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
>>   9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
>>   9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o virtio-9p-posix-acl.o
>> -9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o
>> +9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o
>>
>>   hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
>>   $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
>> diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
>> new file mode 100644
>> index 0000000..6d94673
>> --- /dev/null
>> +++ b/hw/9pfs/cofs.c
>> @@ -0,0 +1,42 @@
>> +
>> +/*
>> + * Virtio 9p backend
>> + *
>> + * Copyright IBM, Corp. 2011
>> + *
>> + * Authors:
>> + *  Aneesh Kumar K.V<aneesh.kumar@linux.vnet.ibm.com>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2.  See
>> + * the COPYING file in the top-level directory.
>> + *
>> + */
>> +
>> +#include "fsdev/qemu-fsdev.h"
>> +#include "qemu-thread.h"
>> +#include "qemu-coroutine.h"
>> +#include "virtio-9p-coth.h"
>> +
>> +int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
>> +{
>> +    int err;
>> +    ssize_t len;
>> +    V9fsString tbuf;
>> +
>> +    tbuf.data = qemu_malloc(PATH_MAX);
> Why introduce tbuf when the buf is available?  You end up having to
> copy back fields at the end of the function and load from an
> uninitialized address (tbuf.size) in the error case.
tbuf is introduced for re-entrent purpose.
We should be calling v9fs_string_init() on this though.

>> @@ -299,7 +282,7 @@ static void v9fs_string_init(V9fsString *str)
>>      str->size = 0;
>>   }
>>
>> -static void v9fs_string_free(V9fsString *str)
>> +void v9fs_string_free(V9fsString *str)
>>   {
>>      qemu_free(str->data);
>>      str->data = NULL;
>> @@ -421,7 +404,7 @@ v9fs_string_sprintf(V9fsString *str, const char *fmt, ...)
>>      str->size = err;
>>   }
>>
>> -static void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs)
>> +void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs)
>>   {
>>      v9fs_string_free(lhs);
>>      v9fs_string_sprintf(lhs, "%s", rhs->data);
> Spurious changes?  I don't see any users here.
Yep. Good catch.

>> @@ -1057,8 +1040,7 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name,
>>      v9fs_string_null(&v9stat->extension);
>>
>>      if (v9stat->mode&  P9_STAT_MODE_SYMLINK) {
>> -        ssize_t symlink_len;
>> -        err = v9fs_do_readlink(s, name,&v9stat->extension,&symlink_len);
>> +        err = v9fs_co_readlink(s, name,&v9stat->extension);
>>          if (err<  0) {
>>              return err;
>>          }
>> @@ -3591,7 +3573,6 @@ static void v9fs_readlink(void *opaque)
>>      int32_t fid;
>>      int err = 0;
>>      V9fsFidState *fidp;
>> -    ssize_t symlink_len;
>>
>>      pdu_unmarshal(pdu, offset, "d",&fid);
>>      fidp = lookup_fid(pdu->s, fid);
>> @@ -3601,7 +3582,7 @@ static void v9fs_readlink(void *opaque)
>>      }
>>
>>      v9fs_string_init(&target);
>> -    err = v9fs_do_readlink(pdu->s,&fidp->path,&target,&symlink_len);
>> +    err = v9fs_co_readlink(pdu->s,&fidp->path,&target);
>>      if (err<  0) {
>>          goto out;
>>      }
> Ah, the unused length argument from patch 5 has been removed.  It
> would be nice to do fixes earlier rather than later in the patch
> series, otherwise time is spent reviewing and commenting on code which
> gets removed.
>
The previous patch is just to move errno. So we thought of doing here while
we are introducing coroutines. But thinking now we could have done 
either place.

Thanks,
JV

> Stefan
>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines.
  2011-05-18 10:39 ` [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Stefan Hajnoczi
@ 2011-05-18 18:43   ` Venkateswararao Jujjuri
  0 siblings, 0 replies; 38+ messages in thread
From: Venkateswararao Jujjuri @ 2011-05-18 18:43 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: aliguori, qemu-devel, stefanha

On 05/18/2011 03:39 AM, Stefan Hajnoczi wrote:
> On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
> <jvrao@linux.vnet.ibm.com>  wrote:
>
> I sent comments on individual patches.  This is turning out nice, many
> of the PDU handlers are now straight-line code that can be followed
> easily.
>
Thanks. Yeah it is coming out nice. :-)

>> o Redesigned to use bh as per Stefan's suggestion.
>>   This made the code very simple but is little less performant compared to V1.
>>   Anthony suggested to go-in with cleaner code and design (This version) and
>>   deal with the performance later.
>>   Just to put in perspective:
>>   Sequential Writes of creating 1GB files using ffsb
>>   o Write size 8k
>>   With bh: 66.9MB/sec
>>   Without bh (marshalling routines): 74.9 MB/sec
>>
>>   o Write size 128k
>>   With bh: 117MB/sec
>>   Without bh (marshalling routines): 122MB/sec
> It would be interesting to hack in a post-yield callback which is
> invoked after yield transfers control back to the calling coroutine.
> This avoids setting up a BH and notifying the iothread to invoke it.
> I'm just suggesting this as an experiment to see if the BH mechanism
> causes the performance degradation, not as a real solution.
>
Correct, plan is to get the functionality in first and then handle this 
area.

Thanks,
JV

> Stefan
>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink
  2011-05-18 18:42     ` Venkateswararao Jujjuri
@ 2011-05-19  5:37       ` Stefan Hajnoczi
  2011-05-19 15:28         ` Venkateswararao Jujjuri
  0 siblings, 1 reply; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-19  5:37 UTC (permalink / raw)
  To: Venkateswararao Jujjuri; +Cc: qemu-devel

On Wed, May 18, 2011 at 7:42 PM, Venkateswararao Jujjuri
<jvrao@linux.vnet.ibm.com> wrote:
> On 05/18/2011 02:43 AM, Stefan Hajnoczi wrote:
>>
>> On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
>> <jvrao@linux.vnet.ibm.com>  wrote:
>>>
>>> Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
>>> ---
>>>  Makefile.objs            |    2 +-
>>>  hw/9pfs/cofs.c           |   42
>>> ++++++++++++++++++++++++++++++++++++++++++
>>>  hw/9pfs/virtio-9p-coth.h |    1 +
>>>  hw/9pfs/virtio-9p.c      |   27 ++++-----------------------
>>>  hw/9pfs/virtio-9p.h      |    3 ++-
>>>  5 files changed, 50 insertions(+), 25 deletions(-)
>>>  create mode 100644 hw/9pfs/cofs.c
>>>
>>> diff --git a/Makefile.objs b/Makefile.objs
>>> index 96f6a24..36005bb 100644
>>> --- a/Makefile.objs
>>> +++ b/Makefile.objs
>>> @@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
>>>  9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
>>>  9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
>>>  9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o
>>> virtio-9p-posix-acl.o
>>> -9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o
>>> +9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o
>>>
>>>  hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
>>>  $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
>>> diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
>>> new file mode 100644
>>> index 0000000..6d94673
>>> --- /dev/null
>>> +++ b/hw/9pfs/cofs.c
>>> @@ -0,0 +1,42 @@
>>> +
>>> +/*
>>> + * Virtio 9p backend
>>> + *
>>> + * Copyright IBM, Corp. 2011
>>> + *
>>> + * Authors:
>>> + *  Aneesh Kumar K.V<aneesh.kumar@linux.vnet.ibm.com>
>>> + *
>>> + * This work is licensed under the terms of the GNU GPL, version 2.  See
>>> + * the COPYING file in the top-level directory.
>>> + *
>>> + */
>>> +
>>> +#include "fsdev/qemu-fsdev.h"
>>> +#include "qemu-thread.h"
>>> +#include "qemu-coroutine.h"
>>> +#include "virtio-9p-coth.h"
>>> +
>>> +int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
>>> +{
>>> +    int err;
>>> +    ssize_t len;
>>> +    V9fsString tbuf;
>>> +
>>> +    tbuf.data = qemu_malloc(PATH_MAX);
>>
>> Why introduce tbuf when the buf is available?  You end up having to
>> copy back fields at the end of the function and load from an
>> uninitialized address (tbuf.size) in the error case.
>
> tbuf is introduced for re-entrent purpose.
> We should be calling v9fs_string_init() on this though.

I see no issue here and no safety added by using a local variable.
Can you explain what you're trying to do?

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink
  2011-05-19  5:37       ` Stefan Hajnoczi
@ 2011-05-19 15:28         ` Venkateswararao Jujjuri
  2011-05-19 16:01           ` Stefan Hajnoczi
  0 siblings, 1 reply; 38+ messages in thread
From: Venkateswararao Jujjuri @ 2011-05-19 15:28 UTC (permalink / raw)
  To: qemu-devel

On 05/18/2011 10:37 PM, Stefan Hajnoczi wrote:
> On Wed, May 18, 2011 at 7:42 PM, Venkateswararao Jujjuri
> <jvrao@linux.vnet.ibm.com>  wrote:
>> On 05/18/2011 02:43 AM, Stefan Hajnoczi wrote:
>>> On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
>>> <jvrao@linux.vnet.ibm.com>    wrote:
>>>> Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
>>>> ---
>>>>   Makefile.objs            |    2 +-
>>>>   hw/9pfs/cofs.c           |   42
>>>> ++++++++++++++++++++++++++++++++++++++++++
>>>>   hw/9pfs/virtio-9p-coth.h |    1 +
>>>>   hw/9pfs/virtio-9p.c      |   27 ++++-----------------------
>>>>   hw/9pfs/virtio-9p.h      |    3 ++-
>>>>   5 files changed, 50 insertions(+), 25 deletions(-)
>>>>   create mode 100644 hw/9pfs/cofs.c
>>>>
>>>> diff --git a/Makefile.objs b/Makefile.objs
>>>> index 96f6a24..36005bb 100644
>>>> --- a/Makefile.objs
>>>> +++ b/Makefile.objs
>>>> @@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
>>>>   9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
>>>>   9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
>>>>   9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o
>>>> virtio-9p-posix-acl.o
>>>> -9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o
>>>> +9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o
>>>>
>>>>   hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
>>>>   $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
>>>> diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
>>>> new file mode 100644
>>>> index 0000000..6d94673
>>>> --- /dev/null
>>>> +++ b/hw/9pfs/cofs.c
>>>> @@ -0,0 +1,42 @@
>>>> +
>>>> +/*
>>>> + * Virtio 9p backend
>>>> + *
>>>> + * Copyright IBM, Corp. 2011
>>>> + *
>>>> + * Authors:
>>>> + *  Aneesh Kumar K.V<aneesh.kumar@linux.vnet.ibm.com>
>>>> + *
>>>> + * This work is licensed under the terms of the GNU GPL, version 2.  See
>>>> + * the COPYING file in the top-level directory.
>>>> + *
>>>> + */
>>>> +
>>>> +#include "fsdev/qemu-fsdev.h"
>>>> +#include "qemu-thread.h"
>>>> +#include "qemu-coroutine.h"
>>>> +#include "virtio-9p-coth.h"
>>>> +
>>>> +int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
>>>> +{
>>>> +    int err;
>>>> +    ssize_t len;
>>>> +    V9fsString tbuf;
>>>> +
>>>> +    tbuf.data = qemu_malloc(PATH_MAX);
>>> Why introduce tbuf when the buf is available?  You end up having to
>>> copy back fields at the end of the function and load from an
>>> uninitialized address (tbuf.size) in the error case.
>> tbuf is introduced for re-entrent purpose.
>> We should be calling v9fs_string_init() on this though.
> I see no issue here and no safety added by using a local variable.
> Can you explain what you're trying to do?
No issues in the current usage. Just looking at the micro level of this 
routine,
we have an passd-in buffer passed under lock and is getting updated 
outside the lock (worker thread).
Can take it out, not an issue.

- JV

> Stefan
>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink
  2011-05-19 15:28         ` Venkateswararao Jujjuri
@ 2011-05-19 16:01           ` Stefan Hajnoczi
  0 siblings, 0 replies; 38+ messages in thread
From: Stefan Hajnoczi @ 2011-05-19 16:01 UTC (permalink / raw)
  To: Venkateswararao Jujjuri; +Cc: qemu-devel

On Thu, May 19, 2011 at 4:28 PM, Venkateswararao Jujjuri
<jvrao@linux.vnet.ibm.com> wrote:
> On 05/18/2011 10:37 PM, Stefan Hajnoczi wrote:
>>
>> On Wed, May 18, 2011 at 7:42 PM, Venkateswararao Jujjuri
>> <jvrao@linux.vnet.ibm.com>  wrote:
>>>
>>> On 05/18/2011 02:43 AM, Stefan Hajnoczi wrote:
>>>>
>>>> On Tue, May 17, 2011 at 8:43 PM, Venkateswararao Jujjuri (JV)
>>>> <jvrao@linux.vnet.ibm.com>    wrote:
>>>>>
>>>>> Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
>>>>> ---
>>>>>  Makefile.objs            |    2 +-
>>>>>  hw/9pfs/cofs.c           |   42
>>>>> ++++++++++++++++++++++++++++++++++++++++++
>>>>>  hw/9pfs/virtio-9p-coth.h |    1 +
>>>>>  hw/9pfs/virtio-9p.c      |   27 ++++-----------------------
>>>>>  hw/9pfs/virtio-9p.h      |    3 ++-
>>>>>  5 files changed, 50 insertions(+), 25 deletions(-)
>>>>>  create mode 100644 hw/9pfs/cofs.c
>>>>>
>>>>> diff --git a/Makefile.objs b/Makefile.objs
>>>>> index 96f6a24..36005bb 100644
>>>>> --- a/Makefile.objs
>>>>> +++ b/Makefile.objs
>>>>> @@ -297,7 +297,7 @@ hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
>>>>>  9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
>>>>>  9pfs-nested-$(CONFIG_VIRTFS) +=  virtio-9p-local.o virtio-9p-xattr.o
>>>>>  9pfs-nested-$(CONFIG_VIRTFS) +=   virtio-9p-xattr-user.o
>>>>> virtio-9p-posix-acl.o
>>>>> -9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o
>>>>> +9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-coth.o cofs.o
>>>>>
>>>>>  hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
>>>>>  $(addprefix 9pfs/, $(9pfs-nested-y)): QEMU_CFLAGS+=$(GLIB_CFLAGS)
>>>>> diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
>>>>> new file mode 100644
>>>>> index 0000000..6d94673
>>>>> --- /dev/null
>>>>> +++ b/hw/9pfs/cofs.c
>>>>> @@ -0,0 +1,42 @@
>>>>> +
>>>>> +/*
>>>>> + * Virtio 9p backend
>>>>> + *
>>>>> + * Copyright IBM, Corp. 2011
>>>>> + *
>>>>> + * Authors:
>>>>> + *  Aneesh Kumar K.V<aneesh.kumar@linux.vnet.ibm.com>
>>>>> + *
>>>>> + * This work is licensed under the terms of the GNU GPL, version 2.
>>>>>  See
>>>>> + * the COPYING file in the top-level directory.
>>>>> + *
>>>>> + */
>>>>> +
>>>>> +#include "fsdev/qemu-fsdev.h"
>>>>> +#include "qemu-thread.h"
>>>>> +#include "qemu-coroutine.h"
>>>>> +#include "virtio-9p-coth.h"
>>>>> +
>>>>> +int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
>>>>> +{
>>>>> +    int err;
>>>>> +    ssize_t len;
>>>>> +    V9fsString tbuf;
>>>>> +
>>>>> +    tbuf.data = qemu_malloc(PATH_MAX);
>>>>
>>>> Why introduce tbuf when the buf is available?  You end up having to
>>>> copy back fields at the end of the function and load from an
>>>> uninitialized address (tbuf.size) in the error case.
>>>
>>> tbuf is introduced for re-entrent purpose.
>>> We should be calling v9fs_string_init() on this though.
>>
>> I see no issue here and no safety added by using a local variable.
>> Can you explain what you're trying to do?
>
> No issues in the current usage. Just looking at the micro level of this
> routine,
> we have an passd-in buffer passed under lock and is getting updated outside
> the lock (worker thread).
> Can take it out, not an issue.

Please take it out since it isn't needed.

Stefan

^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2011-05-19 16:01 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-17 19:43 [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 01/25] [virtio-9p] Add infrastructure to support glib threads and coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 02/25] [virtio-9p] Change all pdu handlers to coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 03/25] [virtio-9p] Remove post functions for v9fs_readlink Venkateswararao Jujjuri (JV)
2011-05-18  9:27   ` Stefan Hajnoczi
2011-05-17 19:43 ` [Qemu-devel] [V2 04/25] [virtio-9p] clean up v9fs_readlink Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 05/25] [virtio-9p] Move errno into v9fs_do_readlink Venkateswararao Jujjuri (JV)
2011-05-18  9:31   ` Stefan Hajnoczi
2011-05-18 18:28     ` Venkateswararao Jujjuri
2011-05-17 19:43 ` [Qemu-devel] [V2 06/25] [virtio-9p] coroutines for readlink Venkateswararao Jujjuri (JV)
2011-05-18  9:43   ` Stefan Hajnoczi
2011-05-18 18:42     ` Venkateswararao Jujjuri
2011-05-19  5:37       ` Stefan Hajnoczi
2011-05-19 15:28         ` Venkateswararao Jujjuri
2011-05-19 16:01           ` Stefan Hajnoczi
2011-05-17 19:43 ` [Qemu-devel] [V2 07/25] [virtio-9p] Remove post functions for v9fs_mkdir Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 08/25] [virtio-9p] clean up v9fs_mkdir Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 09/25] hw/9pfs: Add yield support for readdir related coroutines Venkateswararao Jujjuri (JV)
2011-05-18  9:55   ` Stefan Hajnoczi
2011-05-17 19:43 ` [Qemu-devel] [V2 10/25] hw/9pfs: Update v9fs_readdir to use coroutines Venkateswararao Jujjuri (JV)
2011-05-18 10:10   ` Stefan Hajnoczi
2011-05-17 19:43 ` [Qemu-devel] [V2 11/25] hw/9pfs: Add yield support to statfs coroutine Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 12/25] hw/9pfs: Update v9fs_statfs to use coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 13/25] hw/9pfs: Add yield support to lstat coroutine Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 14/25] hw/9pfs: Update v9fs_getattr to use coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 15/25] hw/9pfs: Add yield support to setattr related coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 16/25] hw/9pfs: Update v9fs_setattr to use coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 17/25] hw/9pfs: Add yield support to xattr related coroutine Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 18/25] hw/9pfs: Update v9fs_xattrwalk to coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 19/25] hw/9pfs: Update v9fs_xattrcreate to use coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 20/25] hw/9pfs: Add yield support to mknod coroutine Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 21/25] hw/9pfs: Update v9fs_mknod to use coroutines Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 22/25] [virtio-9p] coroutine and threading for mkdir Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 23/25] [virtio-9p] Remove post functions for v9fs_remove Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 24/25] [virtio-9p] clean up v9fs_remove Venkateswararao Jujjuri (JV)
2011-05-17 19:43 ` [Qemu-devel] [V2 25/25] [virtio-9p] coroutine and threading for remove/unlink Venkateswararao Jujjuri (JV)
2011-05-18 10:39 ` [Qemu-devel] [V2 0/25] Async threading for VirtFS using glib threads & coroutines Stefan Hajnoczi
2011-05-18 18:43   ` Venkateswararao Jujjuri

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.