lkml.org 
[lkml]   [2012]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 2/9] blkcg: drop unnecessary RCU locking
On Thu, Feb 16, 2012 at 02:37:51PM -0800, Tejun Heo wrote:
> Now that blkg additions / removals are always done under both q and
> blkcg locks, the only place RCU locking is used is blkg_lookup() for
> lockless lookup. This patch drops unncessary RCU locking replacing it
> with plain blkcg / q locking as necessary.
>
> * blkg_lookup_create() and blkiocg_pre_destroy() already perform
> proper locking and don't need RCU. Dropped.

But blkg_lookup_create() is called under rcu() to protect blkcg pointer.
And blkg_lookup() is also happening under same rcu read lock. So I think
you can't drop rcu from blkg_lookup_create().

> {
> struct blkio_group *blkg, *new_blkg;
>
> - WARN_ON_ONCE(!rcu_read_lock_held());

Don't we want to be called with rcu lock held needed for blkg_lookup()?

> lockdep_assert_held(q->queue_lock);
>
> /*

[..]
> @@ -581,11 +580,9 @@ struct blkio_group *blkg_lookup_create(struct blkio_cgroup *blkcg,
> * allocation is fixed.
> */
> spin_unlock_irq(q->queue_lock);
> - rcu_read_unlock();
>
> new_blkg = blkg_alloc(blkcg, q);
>
> - rcu_read_lock();
> spin_lock_irq(q->queue_lock);

blkg_alloc() might sleep here with rcu lock held?

Thanks
Vivek


\
 
 \ /
  Last update: 2012-02-17 17:23    [from the cache]
©2003-2011 Jasper Spaans