From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Zijlstra Subject: Re: [PATCH] 3/4 combine RCU with seqlock to allow mmu notifier methods to sleep (#v9 was 1/4) Date: Fri, 07 Mar 2008 17:52:42 +0100 Message-ID: <1204908762.8514.114.camel@twins> References: <20080302155457.GK8091@v2.random> <20080303213707.GA8091@v2.random> <20080303220502.GA5301@v2.random> <47CC9B57.5050402@qumranet.com> <20080304133020.GC5301@v2.random> <20080304222030.GB8951@v2.random> <20080307151722.GD24114@v2.random> <20080307152328.GE24114@v2.random> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Cc: Christoph Lameter , Jack Steiner , Nick Piggin , akpm@linux-foundation.org, Robin Holt , Avi Kivity , kvm-devel@lists.sourceforge.net, general@lists.openfabrics.org, Steve Wise , Roland Dreier , Kanoj Sarcar , linux-kernel@vger.kernel.org, linux-mm@kvack.org, daniel.blueman@quadrics.com To: Andrea Arcangeli Return-path: In-Reply-To: <20080307152328.GE24114@v2.random> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org On Fri, 2008-03-07 at 16:23 +0100, Andrea Arcangeli wrote: > @@ -42,11 +45,19 @@ int __mmu_notifier_clear_flush_young(str > struct mmu_notifier *mn; > struct hlist_node *n; > int young = 0; > + unsigned seq; > > rcu_read_lock(); > +restart: > + seq = read_seqbegin(&mm->mmu_notifier_lock); > hlist_for_each_entry_rcu(mn, n, &mm->mmu_notifier_list, hlist) { > - if (mn->ops->clear_flush_young) > + if (mn->ops->clear_flush_young) { hlist_del_rcu(&mn->hlist) > + rcu_read_unlock(); kfree(mn); > young |= mn->ops->clear_flush_young(mn, mm, address); *BANG* > + rcu_read_lock(); > + } > + if (read_seqretry(&mm->mmu_notifier_lock, seq)) > + goto restart; > } > rcu_read_unlock();