Skip to content

Commit

Permalink
userfaultfd: provide pid in userfault msg
Browse files Browse the repository at this point in the history
It could be useful for calculating downtime during postcopy live
migration per vCPU.  Side observer or application itself will be
informed about proper task's sleep during userfaultfd processing.

Process's thread id is being provided when user requeste it by setting
UFFD_FEATURE_THREAD_ID bit into uffdio_api.features.

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Alexey Perevalov <[email protected]>
Signed-off-by: Andrea Arcangeli <[email protected]>
Cc: "Dr. David Alan Gilbert" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: Mike Kravetz <[email protected]>
Cc: Mike Rapoport <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Alexey Perevalov authored and torvalds committed Sep 7, 2017
1 parent 2376dd7 commit 9d4ac93
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
8 changes: 6 additions & 2 deletions fs/userfaultfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ static inline void msg_init(struct uffd_msg *msg)

static inline struct uffd_msg userfault_msg(unsigned long address,
unsigned int flags,
unsigned long reason)
unsigned long reason,
unsigned int features)
{
struct uffd_msg msg;
msg_init(&msg);
Expand All @@ -202,6 +203,8 @@ static inline struct uffd_msg userfault_msg(unsigned long address,
* write protect fault.
*/
msg.arg.pagefault.flags |= UFFD_PAGEFAULT_FLAG_WP;
if (features & UFFD_FEATURE_THREAD_ID)
msg.arg.pagefault.ptid = task_pid_vnr(current);
return msg;
}

Expand Down Expand Up @@ -422,7 +425,8 @@ int handle_userfault(struct vm_fault *vmf, unsigned long reason)

init_waitqueue_func_entry(&uwq.wq, userfaultfd_wake_function);
uwq.wq.private = current;
uwq.msg = userfault_msg(vmf->address, vmf->flags, reason);
uwq.msg = userfault_msg(vmf->address, vmf->flags, reason,
ctx->features);
uwq.ctx = ctx;
uwq.waken = false;

Expand Down
10 changes: 7 additions & 3 deletions include/uapi/linux/userfaultfd.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
UFFD_FEATURE_EVENT_UNMAP | \
UFFD_FEATURE_MISSING_HUGETLBFS | \
UFFD_FEATURE_MISSING_SHMEM | \
UFFD_FEATURE_SIGBUS)
UFFD_FEATURE_SIGBUS | \
UFFD_FEATURE_THREAD_ID)
#define UFFD_API_IOCTLS \
((__u64)1 << _UFFDIO_REGISTER | \
(__u64)1 << _UFFDIO_UNREGISTER | \
Expand Down Expand Up @@ -79,6 +80,7 @@ struct uffd_msg {
struct {
__u64 flags;
__u64 address;
__u32 ptid;
} pagefault;

struct {
Expand Down Expand Up @@ -158,8 +160,9 @@ struct uffdio_api {
* UFFD_FEATURE_SIGBUS feature means no page-fault
* (UFFD_EVENT_PAGEFAULT) event will be delivered, instead
* a SIGBUS signal will be sent to the faulting process.
* The application process can enable this behavior by adding
* it to uffdio_api.features.
*
* UFFD_FEATURE_THREAD_ID pid of the page faulted task_struct will
* be returned, if feature is not requested 0 will be returned.
*/
#define UFFD_FEATURE_PAGEFAULT_FLAG_WP (1<<0)
#define UFFD_FEATURE_EVENT_FORK (1<<1)
Expand All @@ -169,6 +172,7 @@ struct uffdio_api {
#define UFFD_FEATURE_MISSING_SHMEM (1<<5)
#define UFFD_FEATURE_EVENT_UNMAP (1<<6)
#define UFFD_FEATURE_SIGBUS (1<<7)
#define UFFD_FEATURE_THREAD_ID (1<<8)
__u64 features;

__u64 ioctls;
Expand Down

0 comments on commit 9d4ac93

Please sign in to comment.