diff options
Diffstat (limited to 'lib/test_hmm.c')
| -rw-r--r-- | lib/test_hmm.c | 24 | 
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/test_hmm.c b/lib/test_hmm.c index e2ce8f9b7605..767538089a62 100644 --- a/lib/test_hmm.c +++ b/lib/test_hmm.c @@ -1086,9 +1086,33 @@ static long dmirror_fops_unlocked_ioctl(struct file *filp,  	return 0;  } +static int dmirror_fops_mmap(struct file *file, struct vm_area_struct *vma) +{ +	unsigned long addr; + +	for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) { +		struct page *page; +		int ret; + +		page = alloc_page(GFP_KERNEL | __GFP_ZERO); +		if (!page) +			return -ENOMEM; + +		ret = vm_insert_page(vma, addr, page); +		if (ret) { +			__free_page(page); +			return ret; +		} +		put_page(page); +	} + +	return 0; +} +  static const struct file_operations dmirror_fops = {  	.open		= dmirror_fops_open,  	.release	= dmirror_fops_release, +	.mmap		= dmirror_fops_mmap,  	.unlocked_ioctl = dmirror_fops_unlocked_ioctl,  	.llseek		= default_llseek,  	.owner		= THIS_MODULE,  |