From holt@sgi.com Wed Jan 30 10:02:14 2008 Date: Wed, 30 Jan 2008 12:02:07 -0600 From: Robin Holt To: Christoph Lameter Cc: Andrea Arcangeli , Robin Holt , Avi Kivity , Izik Eidus , Nick Piggin , kvm-devel@lists.sourceforge.net, Benjamin Herrenschmidt , Peter Zijlstra , steiner@sgi.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, daniel.blueman@quadrics.com, Hugh Dickins Subject: Re: [patch 1/6] mmu_notifier: Core code Back to one of Andrea's points from a couple days ago, I think we still have a problem with the PageExternalRmap page flag. If I had two drivers with external rmap implementations, there is no way I can think of for a simple flag to coordinate a single page being exported and maintained by the two. Since the intended use seems to point in the direction of the external rmap must be maintained consistent with the all pages the driver has exported and the driver will already need to handle cases where the page does not appear in its rmap, I would propose the setting and clearing should be handled in the mmu_notifier code. This is the first of two patches. This one is intended as an addition to patch 1/6. I will post the other shortly under the patch 3/6 thread. --- include/linux/mmu_notifier.h | 1 + mm/mmu_notifier.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) Index: linux-2.6/include/linux/mmu_notifier.h =================================================================== --- linux-2.6.orig/include/linux/mmu_notifier.h 2008-01-30 11:09:06.000000000 -0800 +++ linux-2.6/include/linux/mmu_notifier.h 2008-01-30 11:10:38.000000000 -0800 @@ -146,6 +146,7 @@ static inline void mmu_notifier_head_ini extern void mmu_rmap_notifier_register(struct mmu_rmap_notifier *mrn); extern void mmu_rmap_notifier_unregister(struct mmu_rmap_notifier *mrn); +extern void mmu_rmap_export_page(struct page *page); extern struct hlist_head mmu_rmap_notifier_list; Index: linux-2.6/mm/mmu_notifier.c =================================================================== --- linux-2.6.orig/mm/mmu_notifier.c 2008-01-30 11:09:01.000000000 -0800 +++ linux-2.6/mm/mmu_notifier.c 2008-01-30 11:12:10.000000000 -0800 @@ -99,3 +99,15 @@ void mmu_rmap_notifier_unregister(struct } EXPORT_SYMBOL(mmu_rmap_notifier_unregister); +/* + * Export a page. + * + * Pagelock must be held. + * Must be called before a page is put on an external rmap. + */ +void mmu_rmap_export_page(struct page *page) +{ + BUG_ON(!PageLocked(page)); + SetPageExternalRmap(page); +} +EXPORT_SYMBOL(mmu_rmap_export_page);