Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 *  include/linux/userfaultfd_k.h
  4 *
  5 *  Copyright (C) 2015  Red Hat, Inc.
  6 *
  7 */
  8
  9#ifndef _LINUX_USERFAULTFD_K_H
 10#define _LINUX_USERFAULTFD_K_H
 11
 12#ifdef CONFIG_USERFAULTFD
 13
 14#include <linux/userfaultfd.h> /* linux/include/uapi/linux/userfaultfd.h */
 15
 16#include <linux/fcntl.h>
 17#include <linux/mm.h>
 18#include <asm-generic/pgtable_uffd.h>
 19
 20/*
 21 * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
 22 * new flags, since they might collide with O_* ones. We want
 23 * to re-use O_* flags that couldn't possibly have a meaning
 24 * from userfaultfd, in order to leave a free define-space for
 25 * shared O_* flags.
 26 */
 27#define UFFD_CLOEXEC O_CLOEXEC
 28#define UFFD_NONBLOCK O_NONBLOCK
 29
 30#define UFFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK)
 31#define UFFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS)
 32
 33extern int sysctl_unprivileged_userfaultfd;
 34
 35extern vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason);
 36
 37extern ssize_t mcopy_atomic(struct mm_struct *dst_mm, unsigned long dst_start,
 38			    unsigned long src_start, unsigned long len,
 39			    bool *mmap_changing, __u64 mode);
 40extern ssize_t mfill_zeropage(struct mm_struct *dst_mm,
 41			      unsigned long dst_start,
 42			      unsigned long len,
 43			      bool *mmap_changing);
 44extern int mwriteprotect_range(struct mm_struct *dst_mm,
 45			       unsigned long start, unsigned long len,
 46			       bool enable_wp, bool *mmap_changing);
 47
 48/* mm helpers */
 49static inline bool is_mergeable_vm_userfaultfd_ctx(struct vm_area_struct *vma,
 50					struct vm_userfaultfd_ctx vm_ctx)
 51{
 52	return vma->vm_userfaultfd_ctx.ctx == vm_ctx.ctx;
 53}
 54
 55static inline bool userfaultfd_missing(struct vm_area_struct *vma)
 56{
 57	return vma->vm_flags & VM_UFFD_MISSING;
 58}
 59
 60static inline bool userfaultfd_wp(struct vm_area_struct *vma)
 61{
 62	return vma->vm_flags & VM_UFFD_WP;
 63}
 64
 65static inline bool userfaultfd_pte_wp(struct vm_area_struct *vma,
 66				      pte_t pte)
 67{
 68	return userfaultfd_wp(vma) && pte_uffd_wp(pte);
 69}
 70
 71static inline bool userfaultfd_huge_pmd_wp(struct vm_area_struct *vma,
 72					   pmd_t pmd)
 73{
 74	return userfaultfd_wp(vma) && pmd_uffd_wp(pmd);
 75}
 76
 77static inline bool userfaultfd_armed(struct vm_area_struct *vma)
 78{
 79	return vma->vm_flags & (VM_UFFD_MISSING | VM_UFFD_WP);
 80}
 81
 82extern int dup_userfaultfd(struct vm_area_struct *, struct list_head *);
 83extern void dup_userfaultfd_complete(struct list_head *);
 84
 85extern void mremap_userfaultfd_prep(struct vm_area_struct *,
 86				    struct vm_userfaultfd_ctx *);
 87extern void mremap_userfaultfd_complete(struct vm_userfaultfd_ctx *,
 88					unsigned long from, unsigned long to,
 89					unsigned long len);
 90
 91extern bool userfaultfd_remove(struct vm_area_struct *vma,
 92			       unsigned long start,
 93			       unsigned long end);
 94
 95extern int userfaultfd_unmap_prep(struct vm_area_struct *vma,
 96				  unsigned long start, unsigned long end,
 97				  struct list_head *uf);
 98extern void userfaultfd_unmap_complete(struct mm_struct *mm,
 99				       struct list_head *uf);
100
101#else /* CONFIG_USERFAULTFD */
102
103/* mm helpers */
104static inline vm_fault_t handle_userfault(struct vm_fault *vmf,
105				unsigned long reason)
106{
107	return VM_FAULT_SIGBUS;
108}
109
110static inline bool is_mergeable_vm_userfaultfd_ctx(struct vm_area_struct *vma,
111					struct vm_userfaultfd_ctx vm_ctx)
112{
113	return true;
114}
115
116static inline bool userfaultfd_missing(struct vm_area_struct *vma)
117{
118	return false;
119}
120
121static inline bool userfaultfd_wp(struct vm_area_struct *vma)
122{
123	return false;
124}
125
126static inline bool userfaultfd_pte_wp(struct vm_area_struct *vma,
127				      pte_t pte)
128{
129	return false;
130}
131
132static inline bool userfaultfd_huge_pmd_wp(struct vm_area_struct *vma,
133					   pmd_t pmd)
134{
135	return false;
136}
137
138
139static inline bool userfaultfd_armed(struct vm_area_struct *vma)
140{
141	return false;
142}
143
144static inline int dup_userfaultfd(struct vm_area_struct *vma,
145				  struct list_head *l)
146{
147	return 0;
148}
149
150static inline void dup_userfaultfd_complete(struct list_head *l)
151{
152}
153
154static inline void mremap_userfaultfd_prep(struct vm_area_struct *vma,
155					   struct vm_userfaultfd_ctx *ctx)
156{
157}
158
159static inline void mremap_userfaultfd_complete(struct vm_userfaultfd_ctx *ctx,
160					       unsigned long from,
161					       unsigned long to,
162					       unsigned long len)
163{
164}
165
166static inline bool userfaultfd_remove(struct vm_area_struct *vma,
167				      unsigned long start,
168				      unsigned long end)
169{
170	return true;
171}
172
173static inline int userfaultfd_unmap_prep(struct vm_area_struct *vma,
174					 unsigned long start, unsigned long end,
175					 struct list_head *uf)
176{
177	return 0;
178}
179
180static inline void userfaultfd_unmap_complete(struct mm_struct *mm,
181					      struct list_head *uf)
182{
183}
184
185#endif /* CONFIG_USERFAULTFD */
186
187#endif /* _LINUX_USERFAULTFD_K_H */