All of lore.kernel.org
 help / color / mirror / Atom feed
From: Harsh Bora <harsh@linux.vnet.ibm.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, aneesh.kumar@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH 2/2] 9p-synth: use mutex on read-side
Date: Tue, 14 Aug 2012 00:43:00 +0530	[thread overview]
Message-ID: <502951BC.1090400@linux.vnet.ibm.com> (raw)
In-Reply-To: <1344426944-7638-3-git-send-email-pbonzini@redhat.com>

On 08/08/2012 05:25 PM, Paolo Bonzini wrote:
> Even with the fix in the previous patch, the lockless handling of paths
> in 9p-synth is wrong.  Paths can outlive rcu_read_unlock arbitrarily
> via the V9fsPath objects that 9p-synth creates.  This would require
> a reference counting mechanism that is not there and is quite hard to
> retrofit into V9fsPath.
>
> It seems to me that this was a premature optimization, so replace
> everything with a simple mutex.

Hi Paolo,

The rcu_read_[un]lock() macros were added as no-ops (based on your 
inputs on #qemu) to replace reader-writer locks with RCU based locking 
as suggested while proposing QemuRWLock API for RW locks (See 
http://lists.gnu.org/archive/html/qemu-devel/2011-10/msg00192.html).

v9fs_synth_mutex was actually a pthread_rwlock_t earlier.
I am not sure if reader lock would be better than having a plain mutex 
for readers as well.

Aneesh, inputs ?

Also, if we are going forward with this change, we may also want to 
remove definition of QLIST_INSERT_HEAD_RCU, since the code being remove 
below is the only consumer of that macro.

regards,
Harsh

>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   hw/9pfs/virtio-9p-synth.c | 12 ++++++------
>   qemu-thread.h             |  3 ---
>   2 file modificati, 6 inserzioni(+), 9 rimozioni(-)
>
> diff --git a/hw/9pfs/virtio-9p-synth.c b/hw/9pfs/virtio-9p-synth.c
> index a91ebe1..426605e 100644
> --- a/hw/9pfs/virtio-9p-synth.c
> +++ b/hw/9pfs/virtio-9p-synth.c
> @@ -59,7 +59,7 @@ static V9fsSynthNode *v9fs_add_dir_node(V9fsSynthNode *parent, int mode,
>       }
>       node->private = node;
>       strncpy(node->name, name, sizeof(node->name));
> -    QLIST_INSERT_HEAD_RCU(&parent->child, node, sibling);
> +    QLIST_INSERT_HEAD(&parent->child, node, sibling);
>       return node;
>   }
>
> @@ -133,7 +133,7 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode,
>       node->attr->mode   = mode;
>       node->private      = arg;
>       strncpy(node->name, name, sizeof(node->name));
> -    QLIST_INSERT_HEAD_RCU(&parent->child, node, sibling);
> +    QLIST_INSERT_HEAD(&parent->child, node, sibling);
>       ret = 0;
>   err_out:
>       qemu_mutex_unlock(&v9fs_synth_mutex);
> @@ -229,7 +229,7 @@ static int v9fs_synth_get_dentry(V9fsSynthNode *dir, struct dirent *entry,
>       int i = 0;
>       V9fsSynthNode *node;
>
> -    rcu_read_lock();
> +    qemu_mutex_lock(&v9fs_synth_mutex);
>       QLIST_FOREACH(node, &dir->child, sibling) {
>           /* This is the off child of the directory */
>           if (i == off) {
> @@ -245,7 +245,7 @@ static int v9fs_synth_get_dentry(V9fsSynthNode *dir, struct dirent *entry,
>       v9fs_synth_direntry(node, entry, off);
>       *result = entry;
>   out:
> -    rcu_read_unlock();
> +    qemu_mutex_unlock(&v9fs_synth_mutex);
>       return 0;
>   }
>
> @@ -476,7 +476,7 @@ static int v9fs_synth_name_to_path(FsContext *ctx, V9fsPath *dir_path,
>
>       }
>
> -    rcu_read_lock();
> +    qemu_mutex_lock(&v9fs_synth_mutex);
>       if (!dir_path) {
>           dir_node = &v9fs_synth_root;
>       } else {
> @@ -504,7 +504,7 @@ static int v9fs_synth_name_to_path(FsContext *ctx, V9fsPath *dir_path,
>       memcpy(target->data, &node, sizeof(void *));
>       target->size = sizeof(void *);
>   err_out:
> -    rcu_read_unlock();
> +    qemu_mutex_unlock(&v9fs_synth_mutex);
>       return ret;
>   }
>
> diff --git a/qemu-thread.h b/qemu-thread.h
> index 05fdaaf..3c9715e 100644
> --- a/qemu-thread.h
> +++ b/qemu-thread.h
> @@ -23,9 +23,6 @@ void qemu_mutex_lock(QemuMutex *mutex);
>   int qemu_mutex_trylock(QemuMutex *mutex);
>   void qemu_mutex_unlock(QemuMutex *mutex);
>
> -#define rcu_read_lock() do { } while (0)
> -#define rcu_read_unlock() do { } while (0)
> -
>   void qemu_cond_init(QemuCond *cond);
>   void qemu_cond_destroy(QemuCond *cond);
>

  reply	other threads:[~2012-08-13 19:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-08 11:55 [Qemu-devel] [PATCH 0/2] 9p-synth: remove poor-man RCU Paolo Bonzini
2012-08-08 11:55 ` [Qemu-devel] [PATCH 1/2] 9p-synth: fix read-side critical sections Paolo Bonzini
2012-08-13 18:47   ` Harsh Bora
2012-08-08 11:55 ` [Qemu-devel] [PATCH 2/2] 9p-synth: use mutex on read-side Paolo Bonzini
2012-08-13 19:13   ` Harsh Bora [this message]
2012-08-18 18:46     ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=502951BC.1090400@linux.vnet.ibm.com \
    --to=harsh@linux.vnet.ibm.com \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.