mspec: convert nopfn to fault

[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>
This commit is contained in:
Nick Piggin 2008-07-23 21:27:00 -07:00 committed by Linus Torvalds
parent ffc6421f07
commit efe9e77997
1 changed files with 14 additions and 9 deletions

View File

@ -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) {
@ -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,
};
/*