[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 10/21] userfaultfd: add new syscall to provide m
From: |
Pavel Emelyanov |
Subject: |
Re: [Qemu-devel] [PATCH 10/21] userfaultfd: add new syscall to provide memory externalization |
Date: |
Thu, 5 Mar 2015 20:57:59 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 |
> +int handle_userfault(struct vm_area_struct *vma, unsigned long address,
> + unsigned int flags, unsigned long reason)
> +{
> + struct mm_struct *mm = vma->vm_mm;
> + struct userfaultfd_ctx *ctx;
> + struct userfaultfd_wait_queue uwq;
> +
> + BUG_ON(!rwsem_is_locked(&mm->mmap_sem));
> +
> + ctx = vma->vm_userfaultfd_ctx.ctx;
> + if (!ctx)
> + return VM_FAULT_SIGBUS;
> +
> + BUG_ON(ctx->mm != mm);
> +
> + VM_BUG_ON(reason & ~(VM_UFFD_MISSING|VM_UFFD_WP));
> + VM_BUG_ON(!(reason & VM_UFFD_MISSING) ^ !!(reason & VM_UFFD_WP));
> +
> + /*
> + * If it's already released don't get it. This avoids to loop
> + * in __get_user_pages if userfaultfd_release waits on the
> + * caller of handle_userfault to release the mmap_sem.
> + */
> + if (unlikely(ACCESS_ONCE(ctx->released)))
> + return VM_FAULT_SIGBUS;
> +
> + /* check that we can return VM_FAULT_RETRY */
> + if (unlikely(!(flags & FAULT_FLAG_ALLOW_RETRY))) {
> + /*
> + * Validate the invariant that nowait must allow retry
> + * to be sure not to return SIGBUS erroneously on
> + * nowait invocations.
> + */
> + BUG_ON(flags & FAULT_FLAG_RETRY_NOWAIT);
> +#ifdef CONFIG_DEBUG_VM
> + if (printk_ratelimit()) {
> + printk(KERN_WARNING
> + "FAULT_FLAG_ALLOW_RETRY missing %x\n", flags);
> + dump_stack();
> + }
> +#endif
> + return VM_FAULT_SIGBUS;
> + }
> +
> + /*
> + * Handle nowait, not much to do other than tell it to retry
> + * and wait.
> + */
> + if (flags & FAULT_FLAG_RETRY_NOWAIT)
> + return VM_FAULT_RETRY;
> +
> + /* take the reference before dropping the mmap_sem */
> + userfaultfd_ctx_get(ctx);
> +
> + /* be gentle and immediately relinquish the mmap_sem */
> + up_read(&mm->mmap_sem);
> +
> + init_waitqueue_func_entry(&uwq.wq, userfaultfd_wake_function);
> + uwq.wq.private = current;
> + uwq.address = userfault_address(address, flags, reason);
Since we report only the virtual address of the fault, this will make
difficulties
for task monitoring the address space of some other task. Like this:
Let's assume a task creates a userfaultfd, activates one, registers several
VMAs
in it and then sends the ufd descriptor to other task. If later the first task
will
remap those VMAs and will start touching pages, the monitor will start
receiving
fault addresses using which it will not be able to guess the exact vma the
requests come from.
Thanks,
Pavel
- [Qemu-devel] [PATCH 17/21] userfaultfd: remap_pages: swp_entry_swapcount() preparation, (continued)
- [Qemu-devel] [PATCH 17/21] userfaultfd: remap_pages: swp_entry_swapcount() preparation, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 12/21] userfaultfd: activate syscall, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 11/21] userfaultfd: buildsystem activation, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 08/21] userfaultfd: teach vma_merge to merge across vma->vm_userfaultfd_ctx, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 01/21] userfaultfd: waitqueue: add nr wake parameter to __wake_up_locked_key, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 13/21] userfaultfd: UFFDIO_COPY|UFFDIO_ZEROPAGE uAPI, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 15/21] userfaultfd: UFFDIO_COPY and UFFDIO_ZEROPAGE, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 20/21] userfaultfd: UFFDIO_REMAP, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 07/21] userfaultfd: call handle_userfault() for userfaultfd_missing() faults, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 10/21] userfaultfd: add new syscall to provide memory externalization, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 21/21] userfaultfd: add userfaultfd_wp mm helpers, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 19/21] userfaultfd: remap_pages: UFFDIO_REMAP preparation, Andrea Arcangeli, 2015/03/05
- Re: [Qemu-devel] [PATCH 19/21] userfaultfd: remap_pages: UFFDIO_REMAP preparation, Pavel Emelyanov, 2015/03/05
- [Qemu-devel] [PATCH 04/21] userfaultfd: linux/userfaultfd_k.h, Andrea Arcangeli, 2015/03/05
- [Qemu-devel] [PATCH 14/21] userfaultfd: mcopy_atomic|mfill_zeropage: UFFDIO_COPY|UFFDIO_ZEROPAGE preparation, Andrea Arcangeli, 2015/03/05