diff options
Diffstat (limited to 'include/linux/mm.h')
-rw-r--r-- | include/linux/mm.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index fda728e3c27d..91c08f6f0dc9 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/shrinker.h> | 20 | #include <linux/shrinker.h> |
21 | #include <linux/resource.h> | 21 | #include <linux/resource.h> |
22 | #include <linux/page_ext.h> | 22 | #include <linux/page_ext.h> |
23 | #include <linux/err.h> | ||
23 | 24 | ||
24 | struct mempolicy; | 25 | struct mempolicy; |
25 | struct anon_vma; | 26 | struct anon_vma; |
@@ -1214,6 +1215,49 @@ long get_user_pages_unlocked(struct task_struct *tsk, struct mm_struct *mm, | |||
1214 | int write, int force, struct page **pages); | 1215 | int write, int force, struct page **pages); |
1215 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, | 1216 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
1216 | struct page **pages); | 1217 | struct page **pages); |
1218 | |||
1219 | /* Container for pinned pfns / pages */ | ||
1220 | struct frame_vector { | ||
1221 | unsigned int nr_allocated; /* Number of frames we have space for */ | ||
1222 | unsigned int nr_frames; /* Number of frames stored in ptrs array */ | ||
1223 | bool got_ref; /* Did we pin pages by getting page ref? */ | ||
1224 | bool is_pfns; /* Does array contain pages or pfns? */ | ||
1225 | void *ptrs[0]; /* Array of pinned pfns / pages. Use | ||
1226 | * pfns_vector_pages() or pfns_vector_pfns() | ||
1227 | * for access */ | ||
1228 | }; | ||
1229 | |||
1230 | struct frame_vector *frame_vector_create(unsigned int nr_frames); | ||
1231 | void frame_vector_destroy(struct frame_vector *vec); | ||
1232 | int get_vaddr_frames(unsigned long start, unsigned int nr_pfns, | ||
1233 | bool write, bool force, struct frame_vector *vec); | ||
1234 | void put_vaddr_frames(struct frame_vector *vec); | ||
1235 | int frame_vector_to_pages(struct frame_vector *vec); | ||
1236 | void frame_vector_to_pfns(struct frame_vector *vec); | ||
1237 | |||
1238 | static inline unsigned int frame_vector_count(struct frame_vector *vec) | ||
1239 | { | ||
1240 | return vec->nr_frames; | ||
1241 | } | ||
1242 | |||
1243 | static inline struct page **frame_vector_pages(struct frame_vector *vec) | ||
1244 | { | ||
1245 | if (vec->is_pfns) { | ||
1246 | int err = frame_vector_to_pages(vec); | ||
1247 | |||
1248 | if (err) | ||
1249 | return ERR_PTR(err); | ||
1250 | } | ||
1251 | return (struct page **)(vec->ptrs); | ||
1252 | } | ||
1253 | |||
1254 | static inline unsigned long *frame_vector_pfns(struct frame_vector *vec) | ||
1255 | { | ||
1256 | if (!vec->is_pfns) | ||
1257 | frame_vector_to_pfns(vec); | ||
1258 | return (unsigned long *)(vec->ptrs); | ||
1259 | } | ||
1260 | |||
1217 | struct kvec; | 1261 | struct kvec; |
1218 | int get_kernel_pages(const struct kvec *iov, int nr_pages, int write, | 1262 | int get_kernel_pages(const struct kvec *iov, int nr_pages, int write, |
1219 | struct page **pages); | 1263 | struct page **pages); |