Blame view

kernel/linux-rt-4.4.41/include/linux/userfaultfd_k.h 2.1 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  /*
   *  include/linux/userfaultfd_k.h
   *
   *  Copyright (C) 2015  Red Hat, Inc.
   *
   */
  
  #ifndef _LINUX_USERFAULTFD_K_H
  #define _LINUX_USERFAULTFD_K_H
  
  #ifdef CONFIG_USERFAULTFD
  
  #include <linux/userfaultfd.h> /* linux/include/uapi/linux/userfaultfd.h */
  
  #include <linux/fcntl.h>
  
  /*
   * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
   * new flags, since they might collide with O_* ones. We want
   * to re-use O_* flags that couldn't possibly have a meaning
   * from userfaultfd, in order to leave a free define-space for
   * shared O_* flags.
   */
  #define UFFD_CLOEXEC O_CLOEXEC
  #define UFFD_NONBLOCK O_NONBLOCK
  
  #define UFFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK)
  #define UFFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS)
  
  extern int handle_userfault(struct vm_area_struct *vma, unsigned long address,
  			    unsigned int flags, unsigned long reason);
  
  extern ssize_t mcopy_atomic(struct mm_struct *dst_mm, unsigned long dst_start,
  			    unsigned long src_start, unsigned long len);
  extern ssize_t mfill_zeropage(struct mm_struct *dst_mm,
  			      unsigned long dst_start,
  			      unsigned long len);
  
  /* mm helpers */
  static inline bool is_mergeable_vm_userfaultfd_ctx(struct vm_area_struct *vma,
  					struct vm_userfaultfd_ctx vm_ctx)
  {
  	return vma->vm_userfaultfd_ctx.ctx == vm_ctx.ctx;
  }
  
  static inline bool userfaultfd_missing(struct vm_area_struct *vma)
  {
  	return vma->vm_flags & VM_UFFD_MISSING;
  }
  
  static inline bool userfaultfd_armed(struct vm_area_struct *vma)
  {
  	return vma->vm_flags & (VM_UFFD_MISSING | VM_UFFD_WP);
  }
  
  #else /* CONFIG_USERFAULTFD */
  
  /* mm helpers */
  static inline int handle_userfault(struct vm_area_struct *vma,
  				   unsigned long address,
  				   unsigned int flags,
  				   unsigned long reason)
  {
  	return VM_FAULT_SIGBUS;
  }
  
  static inline bool is_mergeable_vm_userfaultfd_ctx(struct vm_area_struct *vma,
  					struct vm_userfaultfd_ctx vm_ctx)
  {
  	return true;
  }
  
  static inline bool userfaultfd_missing(struct vm_area_struct *vma)
  {
  	return false;
  }
  
  static inline bool userfaultfd_armed(struct vm_area_struct *vma)
  {
  	return false;
  }
  
  #endif /* CONFIG_USERFAULTFD */
  
  #endif /* _LINUX_USERFAULTFD_K_H */