[v8,0/5] Coroutines for better asynchronous programming

Message ID 87wrf43ql0.fsf@skywalker.in.ibm.com
State New
Headers show


git://repo.or.cz/qemu/v9fs.git for-upstream-1


Aneesh Kumar K V July 27, 2011, 11:34 a.m.
On Wed, 27 Jul 2011 15:15:20 +0530, "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> wrote:
> On Tue, 26 Jul 2011 10:21:12 +0100, Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> wrote:
> > QEMU is event-driven and suffers when blocking operations are performed because
> > VM execution may be stopped until the operation completes.  Therefore many
> > operations that could block are performed asynchronously and a callback is
> > invoked when the operation has completed.  This allows QEMU to continue
> > executing while the operation is pending.
> > 
> > The downside to callbacks is that they split up code into many smaller
> > functions, each of which is a single step in a state machine that quickly
> > becomes complex and hard to understand.  Callback functions also result in lots
> > of noise as variables are packed and unpacked into temporary structs that pass
> > state to the callback function.
> > 
> > This patch series introduces coroutines as a solution for writing asynchronous
> > code while still having a nice sequential control flow.  The semantics are
> > explained in the second patch.  The fourth patch adds automated tests.
> > 
> > A nice feature of coroutines is that it is relatively easy to take synchronous
> > code and lift it into a coroutine to make it asynchronous.  Work has been done
> > to move qcow2 request processing into coroutines and thereby make it
> > asynchronous (today qcow2 will perform synchronous metadata accesses).  This
> > qcow2 work is still ongoing and not quite ready for mainline yet.
> > 
> > v8:
> >  * Bisectability: introduce gthread implementation before ucontext/fibers
> Can we also get CoMutex and CoQueue patches also merged. I use them in
> the VirtFS series. 
> http://repo.or.cz/w/qemu/kevin.git/shortlog/refs/heads/coroutine-devel
> http://repo.or.cz/w/qemu/v9fs.git/commit/318ef0b9b01cd296f8c30d8288139b9bed859892

I have pushed VirtFS related changes to

git://repo.or.cz/qemu/v9fs.git for-upstream-1

Once the co-routine patches are merged I can send a proper pull request.
There are more changes pending for VirtFS. We will push them in batches.

The following changes since commit c729e893aba79680bf410a2b9c671fb9e2c2c1a4:

  coroutine: add test-coroutine --benchmark-lifecycle (2011-07-27 16:30:26 +0530)

are available in the git repository at:
  git://repo.or.cz/qemu/v9fs.git for-upstream-1

Aneesh Kumar K.V (32):
      hw/9pfs: Add yield support for readdir related coroutines
      hw/9pfs: Update v9fs_readdir to use coroutines
      hw/9pfs: Add yield support to statfs coroutine
      hw/9pfs: Update v9fs_statfs to use coroutines
      hw/9pfs: Add yield support to lstat coroutine
      hw/9pfs: Update v9fs_getattr to use coroutines
      hw/9pfs: Add yield support to setattr related coroutines
      hw/9pfs: Update v9fs_setattr to use coroutines
      hw/9pfs: Add yield support to xattr related coroutine
      hw/9pfs: Update v9fs_xattrwalk to coroutines
      hw/9pfs: Update v9fs_xattrcreate to use coroutines
      hw/9pfs: Add yield support to mknod coroutine
      hw/9pfs: Update v9fs_mknod to use coroutines
      hw/9pfs: Add yeild support to rename coroutine
      hw/9pfs: Update vfs_rename to use coroutines
      hw/9pfs: Add yeild support for fstat coroutine
      hw/9pfs: Update v9fs_lock to use coroutines
      hw/9pfs: Update v9fs_getlock to use coroutines
      hw/9pfs: Add yield support for open and opendir coroutine
      hw/9pfs: Update v9fs_open to use coroutines
      hw/9pfs: Update v9fs_stat to use coroutines
      hw/9pfs: Update v9fs_walk to use coroutines
      hw/9pfs: Add yeild support for clunk related coroutine
      hw/9pfs: Update v9fs_clunk to use coroutines
      hw/9pfs: Add yield support for fsync coroutine
      hw/9pfs: Update v9fs_fsync to use coroutines
      hw/9pfs: Add yield support for pwritev coroutine
      hw/9pfs: Update v9fs_write to use coroutines
      hw/9pfs: Update v9fs_wstat to use coroutines
      hw/9pfs: Update v9fs_attach to use coroutines
      hw/9pfs: Add yield support for preadv coroutine
      hw/9pfs: Update v9fs_read to use coroutines

Harsh Prateek Bora (1):
      use readdir_r instead of readdir for reentrancy

Venkateswararao Jujjuri (JV) (20):
      [virtio-9p] Add infrastructure to support glib threads and coroutines.
      [virtio-9p] Change all pdu handlers to coroutines.
      [virtio-9p] Remove post functions for v9fs_readlink.
      [virtio-9p] clean up v9fs_readlink.
      [virtio-9p] coroutines for readlink
      [virtio-9p] Remove post functions for v9fs_mkdir.
      [virtio-9p] clean up v9fs_mkdir.
      [virtio-9p] coroutine and threading for mkdir
      [virtio-9p] Remove post functions for v9fs_remove
      [virtio-9p] clean up v9fs_remove.
      [virtio-9p] coroutine and threading for remove/unlink
      [virtio-9p] Remove post functions for v9fs_lcreate
      [virtio-9p] clean up v9fs_lcreate
      [virtio-9p] coroutine and threading	for open2
      [virtio-9p] Remove post functions for v9fs_create
      [virtio-9p] clean up v9fs_create Rearrange the code
      [virtio-9p] Remove post functions for v9fs_symlink
      [virtio-9p] clean up v9fs_symlink
      [virtio-9p] coroutine and threading for v9fs_do_symlink
      [virtio-9p] coroutine and threading for v9fs_do_link

 Makefile.objs              |    3 +
 fsdev/file-op-9p.h         |    2 +-
 hw/9pfs/codir.c            |  117 ++
 hw/9pfs/cofile.c           |  163 +++
 hw/9pfs/cofs.c             |  191 +++
 hw/9pfs/coxattr.c          |   84 ++
 hw/9pfs/virtio-9p-coth.c   |  102 ++
 hw/9pfs/virtio-9p-coth.h   |   96 ++
 hw/9pfs/virtio-9p-device.c |    7 +-
 hw/9pfs/virtio-9p-local.c  |    7 +-
 hw/9pfs/virtio-9p.c        | 3052 ++++++++++++++++----------------------------
 hw/9pfs/virtio-9p.h        |  155 +---
 12 files changed, 1840 insertions(+), 2139 deletions(-)
 create mode 100644 hw/9pfs/codir.c
 create mode 100644 hw/9pfs/cofile.c
 create mode 100644 hw/9pfs/cofs.c
 create mode 100644 hw/9pfs/coxattr.c
 create mode 100644 hw/9pfs/virtio-9p-coth.c
 create mode 100644 hw/9pfs/virtio-9p-coth.h