Patch "mm/madvise.c: fix madvise() infinite loop under special circumstances" has been added to the 4.14-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 4.14-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-4.14 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 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
mm/madvise.c +1 -3
@@ -276,15 +276,14 @@ static long madvise_willneed(struct vm_a {struct file *file = vma->vm_file; + *prev = vma;#ifdef CONFIG_SWAP if (!file) { - *prev = vma;force_swapin_readahead (vma, start, end);return 0 ; }if (shmem_mapping (file->f_mapping)) { - *prev = vma;force_shm_swapin_readahead (vma, start, end, file->f_mapping);return 0 ;
@@ -299,7 +298,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-4.14/mm-madvise.c-fix-madvise-infinite-loop-under-special-circumstances.patch