diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/mm.h | 44 | ||||
-rw-r--r-- | include/media/videobuf2-memops.h | 11 |
2 files changed, 49 insertions, 6 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); |
diff --git a/include/media/videobuf2-memops.h b/include/media/videobuf2-memops.h index 9f36641a6781..6513c7ec3116 100644 --- a/include/media/videobuf2-memops.h +++ b/include/media/videobuf2-memops.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define _MEDIA_VIDEOBUF2_MEMOPS_H | 15 | #define _MEDIA_VIDEOBUF2_MEMOPS_H |
16 | 16 | ||
17 | #include <media/videobuf2-core.h> | 17 | #include <media/videobuf2-core.h> |
18 | #include <linux/mm.h> | ||
18 | 19 | ||
19 | /** | 20 | /** |
20 | * struct vb2_vmarea_handler - common vma refcount tracking handler | 21 | * struct vb2_vmarea_handler - common vma refcount tracking handler |
@@ -31,11 +32,9 @@ struct vb2_vmarea_handler { | |||
31 | 32 | ||
32 | extern const struct vm_operations_struct vb2_common_vm_ops; | 33 | extern const struct vm_operations_struct vb2_common_vm_ops; |
33 | 34 | ||
34 | int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, | 35 | struct frame_vector *vb2_create_framevec(unsigned long start, |
35 | struct vm_area_struct **res_vma, dma_addr_t *res_pa); | 36 | unsigned long length, |
36 | 37 | bool write); | |
37 | struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma); | 38 | void vb2_destroy_framevec(struct frame_vector *vec); |
38 | void vb2_put_vma(struct vm_area_struct *vma); | ||
39 | |||
40 | 39 | ||
41 | #endif | 40 | #endif |