Skip to content

Commit

Permalink
mspec: convert nopfn to fault
Browse files Browse the repository at this point in the history
[akpm@linux-foundation.org: remove unused variable]
Signed-off-by: Nick Piggin <npiggin@suse.de>
Acked-by: Jes Sorensen <jes@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Nick Piggin authored and Linus Torvalds committed Jul 24, 2008
1 parent ffc6421 commit efe9e77
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions drivers/char/mspec.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,25 +193,23 @@ mspec_close(struct vm_area_struct *vma)
}

/*
* mspec_nopfn
* mspec_fault
*
* Creates a mspec page and maps it to user space.
*/
static unsigned long
mspec_nopfn(struct vm_area_struct *vma, unsigned long address)
static int
mspec_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
unsigned long paddr, maddr;
unsigned long pfn;
int index;
pgoff_t index = vmf->pgoff;
struct vma_data *vdata = vma->vm_private_data;

BUG_ON(address < vdata->vm_start || address >= vdata->vm_end);
index = (address - vdata->vm_start) >> PAGE_SHIFT;
maddr = (volatile unsigned long) vdata->maddr[index];
if (maddr == 0) {
maddr = uncached_alloc_page(numa_node_id(), 1);
if (maddr == 0)
return NOPFN_OOM;
return VM_FAULT_OOM;

spin_lock(&vdata->lock);
if (vdata->maddr[index] == 0) {
Expand All @@ -231,13 +229,20 @@ mspec_nopfn(struct vm_area_struct *vma, unsigned long address)

pfn = paddr >> PAGE_SHIFT;

return pfn;
/*
* vm_insert_pfn can fail with -EBUSY, but in that case it will
* be because another thread has installed the pte first, so it
* is no problem.
*/
vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);

return VM_FAULT_NOPAGE;
}

static struct vm_operations_struct mspec_vm_ops = {
.open = mspec_open,
.close = mspec_close,
.nopfn = mspec_nopfn
.fault = mspec_fault,
};

/*
Expand Down

0 comments on commit efe9e77

Please sign in to comment.