On Tue, 16 Jun 2009, Andrea Arcangeli wrote:Good, This solve another issue that you probably dont hit beacuse you work with the madvise version:
On Tue, Jun 16, 2009 at 09:05:27PM +0300, Izik Eidus wrote:
So the question is: is this thing is by desgin? (that kernel thread cant call get_user_pages???), should i use something like switch_mm()??I think switch_mm trick should be used for page faults, but gup
shouldn't require it because it gets the 'mm' as parameter and the
current->mm has to be irrelevant. current->mm is only relevant for
gup-fast (obviously :). So I think the only bit that needs fixing is
grab_swap_token to not run if current->mm is null.
Looks like Izik and I hit the same problem (otherwise running well):
I too decided we needn't do more than avoid the issue in grab_swap_token.
(I've a feeling someone has hit this issue before with some other thread,
though I've no idea which - does RHEL include a patch like this perhaps?).
[PATCH] mm: grab_swap_token back out if no mm
If a kthread happens to use get_user_pages() on an mm (as KSM does),
there's a chance that it will end up trying to read in a swap page,
and oops in grab_swap_token() because the kthread has no mm:
nothing clever, just avoid that case.
Signed-off-by: Hugh Dickins <hugh.dickins@xxxxxxxxxxxxx>
---
mm/thrash.c | 3 +++
1 file changed, 3 insertions(+)
--- 2.6.30-mm1/mm/thrash.c 2007-07-09 00:32:17.000000000 +0100
+++ linux/mm/thrash.c 2009-06-15 19:44:53.000000000 +0100
@@ -30,6 +30,9 @@ void grab_swap_token(void)
{
int current_interval;
+ if (!current->mm) /* kthread doing get_user_pages on an mm */
+ return;
+
global_faults++;
current_interval = global_faults - current->mm->faultstamp;