Skip to content

Commit

Permalink
relay: nopage
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Tom Zanussi <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Nick Piggin authored and Linus Torvalds committed Feb 6, 2008
1 parent f2df3f6 commit a1e0961
Showing 1 changed file with 9 additions and 15 deletions.
24 changes: 9 additions & 15 deletions kernel/relay.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,37 +37,31 @@ static void relay_file_mmap_close(struct vm_area_struct *vma)
}

/*
* nopage() vm_op implementation for relay file mapping.
* fault() vm_op implementation for relay file mapping.
*/
static struct page *relay_buf_nopage(struct vm_area_struct *vma,
unsigned long address,
int *type)
static int relay_buf_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
struct page *page;
struct rchan_buf *buf = vma->vm_private_data;
unsigned long offset = address - vma->vm_start;
pgoff_t pgoff = vmf->pgoff;

if (address > vma->vm_end)
return NOPAGE_SIGBUS; /* Disallow mremap */
if (!buf)
return NOPAGE_OOM;
return VM_FAULT_OOM;

page = vmalloc_to_page(buf->start + offset);
page = vmalloc_to_page(buf->start + (pgoff << PAGE_SHIFT));
if (!page)
return NOPAGE_OOM;
return VM_FAULT_SIGBUS;
get_page(page);
vmf->page = page;

if (type)
*type = VM_FAULT_MINOR;

return page;
return 0;
}

/*
* vm_ops for relay file mappings.
*/
static struct vm_operations_struct relay_file_mmap_ops = {
.nopage = relay_buf_nopage,
.fault = relay_buf_fault,
.close = relay_file_mmap_close,
};

Expand Down

0 comments on commit a1e0961

Please sign in to comment.