public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Robin Holt <holt-sJ/iWh9BUns@public.gmane.org>
To: Andrea Arcangeli <andrea-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Cc: Andrew Morton <akpm-3NddpPZAyC0@public.gmane.org>,
	Nick Piggin <npiggin-l3A5Bk7waGM@public.gmane.org>,
	Peter Zijlstra
	<a.p.zijlstra-/NLkJaSkS4VmR6Xm/wNWPw@public.gmane.org>,
	linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org,
	Benjamin Herrenschmidt
	<benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org>,
	steiner-sJ/iWh9BUns@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>,
	kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
	daniel.blueman-xqY44rlHlBpWk0Htik3J/w@public.gmane.org,
	holt-sJ/iWh9BUns@public.gmane.org,
	Hugh Dickins <hugh-DTz5qymZ9yRBDgjK7y7TUQ@public.gmane.org>,
	clameter-sJ/iWh9BUns@public.gmane.org
Subject: Enhance mmu notifiers to accomplish a lockless implementation	(incomplete).
Date: Wed, 23 Jan 2008 20:00:08 -0600	[thread overview]
Message-ID: <20080124020007.GL26420@sgi.com> (raw)
In-Reply-To: <20080122200858.GB15848-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>

Expand the mmu_notifiers to allow for lockless callers.  To accomplish
this, the function receiving notifications needs to implement an rmap
equivalent.  The notification function is also responsible for tracking
page dirty state.

With this patch, I am getting fairly close to not needing the
invalidate_page mmu_notifier.  The combination of invalidate_range
and this export_notifier covers all the paths I can see so far except
__xip_unmap and do_wp_page.  __xip_unmap is not so much of a concern,
but I would like to handle it as well.

The one that really concerns me is do_wp_page.  I am having difficulty
figuring out a way to handle this without holding locks.

For either of these callers of ptep_clear_flush, I welcome suggestions
on methods to call a notifier without holding any non-sleepable locks.

I am traveling tomorrow but should be able to get back to this tomorrow
evening or early Friday.  This has not even been compiled yet.  Just
marking it up for now.

Thank you for your attention,
Robin Holt



Index: mmu_notifiers/include/linux/export_notifier.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ mmu_notifiers/include/linux/export_notifier.h	2008-01-23 19:46:05.000000000 -0600
@@ -0,0 +1,48 @@
+#ifndef _LINUX_EXPORT_NOTIFIER_H
+#define _LINUX_EXPORT_NOTIFIER_H
+
+#include <linux/list.h>
+#include <linux/mm_types.h>
+
+struct export_notifier {
+	struct hlist_node list;
+	const struct export_notifier_ops *ops;
+};
+
+struct export_notifier_ops {
+	/*
+	 * Called with the page lock held after ptes are modified or removed.
+	 *
+	 * Must clear PageExported()
+	 */
+	void (*invalidate_page)(struct export_notifier *em, struct page *page);
+};
+
+#ifdef CONFIG_EXPORT_NOTIFIER
+
+extern void export_notifier_register(struct export_notifier *em);
+extern void export_notifier_unregister(struct export_notifier *em);
+
+extern struct hlist_head export_notifier_list;
+
+#define export_notifier(function, args...)					\
+	do {									\
+		struct export_notifier *__em;					\
+										\
+		rcu_read_lock();						\
+		hlist_for_each_entry_rcu(__em, &export_notifier_list, list)	\
+			if (__em->ops->function)				\
+				__em->ops->function(__em, args);		\
+		rcu_read_unlock();						\
+	} while (0);
+
+#else
+
+#define export_notifier(function, args...)
+
+static inline void export_notifier_register(struct export_notifier *em) {}
+static inline void export_notifier_unregister(struct export_notifier *em) {}
+
+#endif
+
+#endif /* _LINUX_EXPORT_NOTIFIER_H */
Index: mmu_notifiers/include/linux/page-flags.h
===================================================================
--- mmu_notifiers.orig/include/linux/page-flags.h	2008-01-23 19:44:40.000000000 -0600
+++ mmu_notifiers/include/linux/page-flags.h	2008-01-23 19:46:05.000000000 -0600
@@ -105,6 +105,7 @@
  * 64 bit  |           FIELDS             | ??????         FLAGS         |
  *         63                            32                              0
  */
+#define PG_exported		30	/* Page is referenced by something not in the rmaps */
 #define PG_uncached		31	/* Page has been mapped as uncached */
 #endif
 
@@ -260,6 +261,14 @@ static inline void __ClearPageTail(struc
 #define SetPageUncached(page)	set_bit(PG_uncached, &(page)->flags)
 #define ClearPageUncached(page)	clear_bit(PG_uncached, &(page)->flags)
 
+#ifdef CONFIG_EXPORT_NOTIFIER
+#define PageExported(page)	test_bit(PG_exported, &(page)->flags)
+#define SetPageExported(page)	set_bit(PG_exported, &(page)->flags)
+#define ClearPageExported(page)	clear_bit(PG_exported, &(page)->flags)
+#else
+#define PageExported(page)	0
+#endif
+
 struct page;	/* forward declaration */
 
 extern void cancel_dirty_page(struct page *page, unsigned int account_size);
Index: mmu_notifiers/mm/Kconfig
===================================================================
--- mmu_notifiers.orig/mm/Kconfig	2008-01-23 19:44:39.000000000 -0600
+++ mmu_notifiers/mm/Kconfig	2008-01-23 19:46:06.000000000 -0600
@@ -197,3 +197,8 @@ config VIRT_TO_BUS
 config MMU_NOTIFIER
 	def_bool y
 	bool "MMU notifier, for paging KVM/RDMA"
+
+config EXPORT_NOTIFIER
+	def_bool y
+	depends on 64BIT
+	bool "Export Notifier for notifying subsystems about changes to page mappings"
Index: mmu_notifiers/mm/Makefile
===================================================================
--- mmu_notifiers.orig/mm/Makefile	2008-01-23 19:44:39.000000000 -0600
+++ mmu_notifiers/mm/Makefile	2008-01-23 19:46:06.000000000 -0600
@@ -31,4 +31,4 @@ obj-$(CONFIG_MIGRATION) += migrate.o
 obj-$(CONFIG_SMP) += allocpercpu.o
 obj-$(CONFIG_QUICKLIST) += quicklist.o
 obj-$(CONFIG_MMU_NOTIFIER) += mmu_notifier.o
-
+obj-$(CONFIG_EXPORT_NOTIFIER) += export_notifier.o
Index: mmu_notifiers/mm/export_notifier.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ mmu_notifiers/mm/export_notifier.c	2008-01-23 19:46:06.000000000 -0600
@@ -0,0 +1,20 @@
+#include <linux/export_notifier.h>
+
+HLIST_HEAD(export_notifier_list);
+DEFINE_SPINLOCK(export_notifier_list_lock);
+
+void export_notifier_register(struct export_notifier *en)
+{
+	spin_lock(&export_notifier_list_lock);
+	hlist_add_head_rcu(&en->list, &export_notifier_list);
+	spin_unlock(&export_notifier_list_lock);
+}
+
+void export_notifier_unregister(struct export_notifier *en)
+{
+	spin_lock(&export_notifier_list_lock);
+	hlist_del_rcu(&en->list);
+	spin_unlock(&export_notifier_list_lock);
+}
+
+
Index: mmu_notifiers/mm/rmap.c
===================================================================
--- mmu_notifiers.orig/mm/rmap.c	2008-01-23 19:44:39.000000000 -0600
+++ mmu_notifiers/mm/rmap.c	2008-01-23 19:46:06.000000000 -0600
@@ -49,6 +49,7 @@
 #include <linux/rcupdate.h>
 #include <linux/module.h>
 #include <linux/kallsyms.h>
+#include <linux/export_notifier.h>
 
 #include <asm/tlbflush.h>
 
@@ -473,6 +474,8 @@ int page_mkclean(struct page *page)
 		struct address_space *mapping = page_mapping(page);
 		if (mapping) {
 			ret = page_mkclean_file(mapping, page);
+			if (unlikely(PageExported(page)))
+				export_notifier(invalidate_page, page);
 			if (page_test_dirty(page)) {
 				page_clear_dirty(page);
 				ret = 1;
@@ -971,6 +974,9 @@ int try_to_unmap(struct page *page, int 
 	else
 		ret = try_to_unmap_file(page, migration);
 
+	if (unlikely(PageExported(page)))
+		export_notifier(invalidate_page, page);
+
 	if (!page_mapped(page))
 		ret = SWAP_SUCCESS;
 	return ret;
Index: mmu_notifiers/mm/fremap.c
===================================================================
--- mmu_notifiers.orig/mm/fremap.c	2008-01-23 19:44:39.000000000 -0600
+++ mmu_notifiers/mm/fremap.c	2008-01-23 19:46:06.000000000 -0600
@@ -211,6 +211,7 @@ asmlinkage long sys_remap_file_pages(uns
 		spin_unlock(&mapping->i_mmap_lock);
 	}
 
+	mmu_notifier(invalidate_range, mm, start, start + size);
 	err = populate_range(mm, vma, start, size, pgoff);
 	if (!err && !(flags & MAP_NONBLOCK)) {
 		if (unlikely(has_write_lock)) {

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

  parent reply	other threads:[~2008-01-24  2:00 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-13 16:24 [PATCH] mmu notifiers #v2 Andrea Arcangeli
     [not found] ` <20080113162418.GE8736-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-13 21:11   ` Benjamin Herrenschmidt
2008-01-14 20:02   ` Christoph Lameter
     [not found]     ` <Pine.LNX.4.64.0801141154240.8300-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-15  4:28       ` Benjamin Herrenschmidt
2008-01-15 12:44       ` Andrea Arcangeli
     [not found]         ` <20080115124449.GK30812-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-15 20:18           ` Benjamin Herrenschmidt
2008-01-16  1:06             ` Andrea Arcangeli
2008-01-16 17:42   ` Rik van Riel
     [not found]     ` <20080116124256.44033d48-Fuq27k0DHcCSkoNiqTzCLQ@public.gmane.org>
2008-01-16 17:48       ` Izik Eidus
     [not found]         ` <478E4356.7030303-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-17 16:23           ` Andrea Arcangeli
2008-01-17 18:21             ` Izik Eidus
     [not found]               ` <478F9C9C.7070500-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-17 19:32                 ` Andrea Arcangeli
     [not found]                   ` <20080117193252.GC24131-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-21 12:52                     ` [PATCH] mmu notifiers #v3 Andrea Arcangeli
     [not found]                       ` <20080121125204.GJ6970-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-22  2:21                         ` Rik van Riel
2008-01-22 14:12                         ` Avi Kivity
     [not found]                           ` <4795F9D2.1050503-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-22 14:43                             ` Andrea Arcangeli
     [not found]                               ` <20080122144332.GE7331-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-22 20:08                                 ` [PATCH] mmu notifiers #v4 Andrea Arcangeli
     [not found]                                   ` <20080122200858.GB15848-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-22 20:34                                     ` [PATCH] export notifier #1 Christoph Lameter
     [not found]                                       ` <Pine.LNX.4.64.0801221232040.28197-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-22 22:31                                         ` Andrea Arcangeli
     [not found]                                           ` <20080122223139.GD15848-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-22 22:53                                             ` Christoph Lameter
     [not found]                                               ` <Pine.LNX.4.64.0801221433080.2271-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-23 10:27                                                 ` Avi Kivity
     [not found]                                                   ` <479716AD.5070708-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-23 10:52                                                     ` Robin Holt
2008-01-23 12:04                                                       ` [kvm-devel] " Andrea Arcangeli
     [not found]                                                         ` <20080123120446.GF15848-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-23 12:34                                                           ` Robin Holt
2008-01-23 19:48                                                           ` Christoph Lameter
     [not found]                                                             ` <Pine.LNX.4.64.0801231147370.13547-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-23 19:58                                                               ` Robin Holt
     [not found]                                                       ` <20080123105246.GG26420-sJ/iWh9BUns@public.gmane.org>
2008-01-23 19:47                                                         ` Christoph Lameter
     [not found]                                                           ` <Pine.LNX.4.64.0801231145210.13547-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-24  5:56                                                             ` Avi Kivity
     [not found]                                                               ` <4798289B.1000007-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-24 12:26                                                                 ` Andrea Arcangeli
     [not found]                                                                   ` <20080124122623.GK7141-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-24 12:34                                                                     ` Avi Kivity
2008-01-23 11:41                                                 ` Andrea Arcangeli
     [not found]                                                   ` <20080123114136.GE15848-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-23 12:32                                                     ` Robin Holt
     [not found]                                                       ` <20080123123230.GH26420-sJ/iWh9BUns@public.gmane.org>
2008-01-23 17:33                                                         ` Andrea Arcangeli
     [not found]                                                           ` <20080123173325.GG7141-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-23 20:27                                                             ` Christoph Lameter
2008-01-24 15:42                                                               ` [kvm-devel] " Andrea Arcangeli
     [not found]                                                                 ` <20080124154239.GP7141-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-24 20:07                                                                   ` Christoph Lameter
     [not found]                                                                     ` <Pine.LNX.4.64.0801241205510.22285-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-25  6:35                                                                       ` Avi Kivity
2008-01-23 20:18                                                     ` Christoph Lameter
     [not found]                                                       ` <Pine.LNX.4.64.0801231149150.13547-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-24 14:34                                                         ` Andrea Arcangeli
     [not found]                                                           ` <20080124143454.GN7141-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-24 14:41                                                             ` Andrea Arcangeli
2008-01-24 15:15                                                             ` Avi Kivity
     [not found]                                                               ` <4798AB96.4000408-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-24 15:18                                                                 ` Avi Kivity
2008-01-24 20:01                                                             ` Christoph Lameter
2008-01-22 23:36                                         ` Benjamin Herrenschmidt
2008-01-23  0:40                                           ` Christoph Lameter
     [not found]                                             ` <Pine.LNX.4.64.0801221640010.3329-RYO/mD75kfhx2SFC9UQUAuF7EQX82lMiAL8bYrjMMd8@public.gmane.org>
2008-01-23  1:21                                               ` Robin Holt
2008-01-23 12:51                                         ` Gerd Hoffmann
     [not found]                                           ` <4797384B.7080200-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-23 13:19                                             ` Robin Holt
     [not found]                                               ` <20080123131939.GJ26420-sJ/iWh9BUns@public.gmane.org>
2008-01-23 14:12                                                 ` Gerd Hoffmann
     [not found]                                                   ` <47974B54.30407-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-23 14:18                                                     ` Robin Holt
     [not found]                                                       ` <20080123141814.GE3058-sJ/iWh9BUns@public.gmane.org>
2008-01-23 14:35                                                         ` Gerd Hoffmann
     [not found]                                                           ` <479750CA.4070101-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-23 15:48                                                             ` Robin Holt
2008-01-23 14:17                                                 ` Avi Kivity
     [not found]                                                   ` <47974C78.7050509-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-24  4:03                                                     ` Benjamin Herrenschmidt
2008-01-23 15:41                                           ` [kvm-devel] " Andrea Arcangeli
     [not found]                                             ` <20080123154130.GC7141-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-23 17:47                                               ` Gerd Hoffmann
     [not found]                                                 ` <47977DCA.3040904-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-24  6:01                                                   ` Avi Kivity
2008-01-24  6:45                                                 ` [kvm-devel] " Jeremy Fitzhardinge
2008-01-23 20:40                                               ` Christoph Lameter
2008-01-24  2:00                                     ` Robin Holt [this message]
     [not found]                                       ` <20080124020007.GL26420-sJ/iWh9BUns@public.gmane.org>
2008-01-24  4:05                                         ` Enhance mmu notifiers to accomplish a lockless implementation (incomplete) Robin Holt
2008-01-22 19:28                       ` [PATCH] mmu notifiers #v3 Peter Zijlstra
2008-01-22 20:31                         ` Christoph Lameter
2008-01-22 20:31                         ` Andrea Arcangeli
     [not found]                           ` <20080122203125.GC15848-lysg2Xt5kKMAvxtiuMwx3w@public.gmane.org>
2008-01-22 22:10                             ` Hugh Dickins

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=20080124020007.GL26420@sgi.com \
    --to=holt-sj/iwh9buns@public.gmane.org \
    --cc=a.p.zijlstra-/NLkJaSkS4VmR6Xm/wNWPw@public.gmane.org \
    --cc=akpm-3NddpPZAyC0@public.gmane.org \
    --cc=andrea-atKUWr5tajBWk0Htik3J/w@public.gmane.org \
    --cc=avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org \
    --cc=benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org \
    --cc=clameter-sJ/iWh9BUns@public.gmane.org \
    --cc=daniel.blueman-xqY44rlHlBpWk0Htik3J/w@public.gmane.org \
    --cc=hugh-DTz5qymZ9yRBDgjK7y7TUQ@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org \
    --cc=npiggin-l3A5Bk7waGM@public.gmane.org \
    --cc=steiner-sJ/iWh9BUns@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox