Patch "device-dax: implement ->split() to catch invalid munmap attempts" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
device-dax: implement ->split() to catch invalid munmap attempts
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:
device-dax-implement-split-to-catch-invalid-munmap-attempts.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
9702cffdbf2129516db679e4467db81e1cd287daMon Sep 17 00:00:00 2001
From: Dan Williams <[email protected]>
Date: Wed, 29 Nov 2017 16:10:32 -0800
Subject: device-dax: implement ->split() to catch invalid munmap attempts
From: Dan Williams <[email protected]>
commit 9702cffdbf2129516db679e4467db81e1cd287da upstream.
Similar to how device-dax enforces that the 'address', 'offset', and 'len' parameters to mmap() be aligned to the device's fundamental alignment, the same constraints apply to munmap(). Implement ->split() to fail munmap calls that violate the alignment constraint.
Otherwise, we later fail VM_BUG_ON checks in the unmap_page_range() path with crash signatures of the form:
vma ffff8800b60c8a88 start 00007f88c0000000 end 00007f88c0e00000
next (null) prev (null) mm ffff8800b61150c0
prot 8000000000000027 anon_vma (null) vm_ops ffffffffa0091240
pgoff 0 file ffff8800b638ef80 private_data (null)
flags: 0x380000fb(read|write|shared|mayread|maywrite|mayexec|mayshare|softdirty|mixedmap|hugepage)
------------[ cut here ]------------
kernel BUG at mm/huge_memory.c:2014!
[..]
RIP: 0010:__split_huge_pud+0x12a/0x180
[..]
Call Trace:
unmap_page_range+0x245/0xa40
? __vma_adjust+0x301/0x990
unmap_vmas+0x4c/0xa0
unmap_region+0xae/0x120
? __vma_rb_erase+0x11a/0x230
do_munmap+0x276/0x410
vm_munmap+0x6a/0xa0
SyS_munmap+0x1d/0x30--- drivers/dax/device.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/dax/device.c +12 -0
@@ -427,9 +427,21 @@ static int dev_dax_fault(struct vm_faultreturn dev_dax_huge_fault (vmf,PE_SIZE_PTE ); } +static int dev_dax_split (struct vm_area_struct *vma,unsigned long addr) +{ +struct file *filp = vma->vm_file; +struct dev_dax *dev_dax = filp->private_data; +struct dax_region *dax_region = dev_dax->region; + +if (!IS_ALIGNED (addr, dax_region->align)) +return -EINVAL ; +return 0 ; +} +static const struct vm_operations_struct dax_vm_ops = { .fault = dev_dax_fault, .huge_fault = dev_dax_huge_fault, + .split = dev_dax_split, };static int dax_mmap (struct file *filp,struct vm_area_struct *vma)
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/mm-hugetlbfs-introduce-split-to-vm_operations_struct.patch queue-4.14/ib-core-disable-memory-registration-of-filesystem-dax-vmas.patch queue-4.14/mm-introduce-get_user_pages_longterm.patch queue-4.14/mm-fail-get_vaddr_frames-for-filesystem-dax-mappings.patch queue-4.14/device-dax-implement-split-to-catch-invalid-munmap-attempts.patch queue-4.14/v4l2-disable-filesystem-dax-mapping-support.patch queue-4.14/mm-fix-device-dax-pud-write-faults-triggered-by-get_user_pages.patch queue-4.14/mm-madvise.c-fix-madvise-infinite-loop-under-special-circumstances.patch