+SYSCALL_DEFINE2(refpage_create, const void *__user, content, unsigned long,
+ flags)
+{
+ unsigned long content_addr = (unsigned long)content;
+ struct page *userpage;
+ struct refpage_private_data *private_data;
+ int fd;
+
+ if (flags != 0)
+ return -EINVAL;
+
+ if ((content_addr & (PAGE_SIZE - 1)) != 0 ||
+ get_user_pages(content_addr, 1, 0, &userpage, 0) != 1)
+ return -EFAULT;
+
+ private_data = kzalloc(sizeof(struct refpage_private_data), GFP_KERNEL);
+ if (!private_data) {
+ put_page(userpage);
+ return -ENOMEM;
+ }
+
+ private_data->refpage = alloc_page(GFP_KERNEL);
+ if (!private_data->refpage) {
+ kfree(private_data);
+ put_page(userpage);
+ return -ENOMEM;
+ }
+
+ copy_highpage(private_data->refpage, userpage);
+ arch_prep_refpage_private_data(private_data);
+ put_page(userpage);
+
+ fd = anon_inode_getfd("[refpage]", &refpage_file_operations,
+ private_data, O_RDONLY | O_CLOEXEC);
+ if (fd < 0)
+ put_refpage_private_data(private_data);
+
+ return fd;
+}
Hi,
some questions:
1. is there any upper limit or can a simple process effectively flood
the system with alloc_page(GFP_KERNEL)? (does ulimit -n apply or is it
/proc/sys/fs/file-max)
2. Shouldn't there be a GFP_ACCOUNT or am I missing something important?
3. How does this interact with MADV_DONTNEED? I assume we'll be able to
zap the mapped refpage and on refault, we'll map in the refpage again,
correct?
--
Thanks,
David / dhildenb