diff options
author | Albert Herranz <albert_herranz@yahoo.es> | 2010-06-04 17:14:57 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-04 18:21:45 -0400 |
commit | d6d03f9158516b50d0d343158e3f33bcff1e4ca5 (patch) | |
tree | b853410433ef654e6a152804aa5dd2837cc0a2d7 /drivers/video/fb_defio.c | |
parent | 3f505ca45735c35576dab4ceb3e3736d528b6672 (diff) |
fb_defio: redo fix for non-dirty ptes
As pointed by Nick Piggin, ->page_mkwrite provides a way to keep a page
locked until the associated PTE is marked dirty.
Re-implement the fix by using this mechanism.
Signed-off-by: Albert Herranz <albert_herranz@yahoo.es>
Acked-by: Jaya Kumar <jayakumar.lkml@gmail.com>
Acked-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video/fb_defio.c')
-rw-r--r-- | drivers/video/fb_defio.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c index 137100ea8ad7..6b93ef93cb12 100644 --- a/drivers/video/fb_defio.c +++ b/drivers/video/fb_defio.c | |||
@@ -100,6 +100,16 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma, | |||
100 | /* protect against the workqueue changing the page list */ | 100 | /* protect against the workqueue changing the page list */ |
101 | mutex_lock(&fbdefio->lock); | 101 | mutex_lock(&fbdefio->lock); |
102 | 102 | ||
103 | /* | ||
104 | * We want the page to remain locked from ->page_mkwrite until | ||
105 | * the PTE is marked dirty to avoid page_mkclean() being called | ||
106 | * before the PTE is updated, which would leave the page ignored | ||
107 | * by defio. | ||
108 | * Do this by locking the page here and informing the caller | ||
109 | * about it with VM_FAULT_LOCKED. | ||
110 | */ | ||
111 | lock_page(page); | ||
112 | |||
103 | /* we loop through the pagelist before adding in order | 113 | /* we loop through the pagelist before adding in order |
104 | to keep the pagelist sorted */ | 114 | to keep the pagelist sorted */ |
105 | list_for_each_entry(cur, &fbdefio->pagelist, lru) { | 115 | list_for_each_entry(cur, &fbdefio->pagelist, lru) { |
@@ -121,7 +131,7 @@ page_already_added: | |||
121 | 131 | ||
122 | /* come back after delay to process the deferred IO */ | 132 | /* come back after delay to process the deferred IO */ |
123 | schedule_delayed_work(&info->deferred_work, fbdefio->delay); | 133 | schedule_delayed_work(&info->deferred_work, fbdefio->delay); |
124 | return 0; | 134 | return VM_FAULT_LOCKED; |
125 | } | 135 | } |
126 | 136 | ||
127 | static const struct vm_operations_struct fb_deferred_io_vm_ops = { | 137 | static const struct vm_operations_struct fb_deferred_io_vm_ops = { |