Patch "mm/madvise.c: fix madvise() infinite loop under special circumstances" has been added to the 3.18-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm/madvise.c: fix madvise() infinite loop under special circumstances
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mm-madvise.c-fix-madvise-infinite-loop-under-special-circumstances.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6ea8d958a2c95a1d514015d4e29ba21a8c0a1a91Mon Sep 17 00:00:00 2001
From: chenjie <[email protected]>
Date: Wed, 29 Nov 2017 16:10:54 -0800
Subject: mm/madvise.c: fix madvise() infinite loop under special circumstances
From: chenjie <[email protected]>
commit 6ea8d958a2c95a1d514015d4e29ba21a8c0a1a91 upstream.
MADVISE_WILLNEED has always been a noop for DAX (formerly XIP) mappings. Unfortunately madvise_willneed() doesn't communicate this information properly to the generic madvise syscall implementation. The calling convention is quite subtle there. madvise_vma() is supposed to either return an error or update &prev otherwise the main loop will never advance to the next vma and it will keep looping for ever without a way to get out of the kernel.
It seems this has been broken since introduction. Nobody has noticed because nobody seems to be using MADVISE_WILLNEED on these DAX mappings.
--- mm/madvise.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
mm/madvise.c +1 -2
@@ -221,9 +221,9 @@ static long madvise_willneed(struct vm_a {struct file *file = vma->vm_file; + *prev = vma;#ifdef CONFIG_SWAP if (!file ||mapping_cap_swap_backed (file->f_mapping)) { - *prev = vma;if (!file)force_swapin_readahead (vma, start, end);else
@@ -241,7 +241,6 @@ static long madvise_willneed(struct vm_areturn 0 ; } - *prev = vma; start = ((start - vma->vm_start) >>PAGE_SHIFT ) + vma->vm_pgoff;if (end > vma->vm_end) end = vma->vm_end;
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/mm-madvise.c-fix-madvise-infinite-loop-under-special-circumstances.patch