Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

relay: nopage

Convert relay from nopage to fault.
Remove redundant vma range checks.
Switch from OOM to SIGBUS if the resource is not available.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Tom Zanussi <zanussi@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Nick Piggin and committed by
Linus Torvalds
a1e09612 f2df3f65

+9 -15
+9 -15
kernel/relay.c
··· 37 37 } 38 38 39 39 /* 40 - * nopage() vm_op implementation for relay file mapping. 40 + * fault() vm_op implementation for relay file mapping. 41 41 */ 42 - static struct page *relay_buf_nopage(struct vm_area_struct *vma, 43 - unsigned long address, 44 - int *type) 42 + static int relay_buf_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 45 43 { 46 44 struct page *page; 47 45 struct rchan_buf *buf = vma->vm_private_data; 48 - unsigned long offset = address - vma->vm_start; 46 + pgoff_t pgoff = vmf->pgoff; 49 47 50 - if (address > vma->vm_end) 51 - return NOPAGE_SIGBUS; /* Disallow mremap */ 52 48 if (!buf) 53 - return NOPAGE_OOM; 49 + return VM_FAULT_OOM; 54 50 55 - page = vmalloc_to_page(buf->start + offset); 51 + page = vmalloc_to_page(buf->start + (pgoff << PAGE_SHIFT)); 56 52 if (!page) 57 - return NOPAGE_OOM; 53 + return VM_FAULT_SIGBUS; 58 54 get_page(page); 55 + vmf->page = page; 59 56 60 - if (type) 61 - *type = VM_FAULT_MINOR; 62 - 63 - return page; 57 + return 0; 64 58 } 65 59 66 60 /* 67 61 * vm_ops for relay file mappings. 68 62 */ 69 63 static struct vm_operations_struct relay_file_mmap_ops = { 70 - .nopage = relay_buf_nopage, 64 + .fault = relay_buf_fault, 71 65 .close = relay_file_mmap_close, 72 66 }; 73 67