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 2e872f92dbac..79ad29a8a60a 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; |
@@ -1198,6 +1199,49 @@ long get_user_pages_unlocked(struct task_struct *tsk, struct mm_struct *mm, | |||
1198 | int write, int force, struct page **pages); | 1199 | int write, int force, struct page **pages); |
1199 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, | 1200 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
1200 | struct page **pages); | 1201 | struct page **pages); |
1202 | |||
1203 | /* Container for pinned pfns / pages */ | ||
1204 | struct frame_vector { | ||
1205 | unsigned int nr_allocated; /* Number of frames we have space for */ | ||
1206 | unsigned int nr_frames; /* Number of frames stored in ptrs array */ | ||
1207 | bool got_ref; /* Did we pin pages by getting page ref? */ | ||
1208 | bool is_pfns; /* Does array contain pages or pfns? */ | ||
1209 | void *ptrs[0]; /* Array of pinned pfns / pages. Use | ||
1210 | * pfns_vector_pages() or pfns_vector_pfns() | ||
1211 | * for access */ | ||
1212 | }; | ||
1213 | |||
1214 | struct frame_vector *frame_vector_create(unsigned int nr_frames); | ||
1215 | void frame_vector_destroy(struct frame_vector *vec); | ||
1216 | int get_vaddr_frames(unsigned long start, unsigned int nr_pfns, | ||
1217 | bool write, bool force, struct frame_vector *vec); | ||
1218 | void put_vaddr_frames(struct frame_vector *vec); | ||
1219 | int frame_vector_to_pages(struct frame_vector *vec); | ||
1220 | void frame_vector_to_pfns(struct frame_vector *vec); | ||
1221 | |||
1222 | static inline unsigned int frame_vector_count(struct frame_vector *vec) | ||
1223 | { | ||
1224 | return vec->nr_frames; | ||
1225 | } | ||
1226 | |||
1227 | static inline struct page **frame_vector_pages(struct frame_vector *vec) | ||
1228 | { | ||
1229 | if (vec->is_pfns) { | ||
1230 | int err = frame_vector_to_pages(vec); | ||
1231 | |||
1232 | if (err) | ||
1233 | return ERR_PTR(err); | ||
1234 | } | ||
1235 | return (struct page **)(vec->ptrs); | ||
1236 | } | ||
1237 | |||
1238 | static inline unsigned long *frame_vector_pfns(struct frame_vector *vec) | ||
1239 | { | ||
1240 | if (!vec->is_pfns) | ||
1241 | frame_vector_to_pfns(vec); | ||
1242 | return (unsigned long *)(vec->ptrs); | ||
1243 | } | ||
1244 | |||
1201 | struct kvec; | 1245 | struct kvec; |
1202 | int get_kernel_pages(const struct kvec *iov, int nr_pages, int write, | 1246 | int get_kernel_pages(const struct kvec *iov, int nr_pages, int write, |
1203 | struct page **pages); | 1247 | struct page **pages); |