diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-11 19:42:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-11 19:42:39 -0400 |
commit | 06a660ada2064bbdcd09aeb8173f2ad128c71978 (patch) | |
tree | 1d0172ca83bd0a8c2186fcb41ae750420d7acb14 /include/linux/mm.h | |
parent | d9b44fe30fb8637b23f804eab2e7afbce129d714 (diff) | |
parent | 63540f01917c0d8b03b9813a0d6539469b163139 (diff) |
Merge tag 'media/v4.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab:
"A series of patches that move part of the code used to allocate memory
from the media subsystem to the mm subsystem"
[ The mm parts have been acked by VM people, and the series was
apparently in -mm for a while - Linus ]
* tag 'media/v4.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
[media] drm/exynos: Convert g2d_userptr_get_dma_addr() to use get_vaddr_frames()
[media] media: vb2: Remove unused functions
[media] media: vb2: Convert vb2_dc_get_userptr() to use frame vector
[media] media: vb2: Convert vb2_vmalloc_get_userptr() to use frame vector
[media] media: vb2: Convert vb2_dma_sg_get_userptr() to use frame vector
[media] vb2: Provide helpers for mapping virtual addresses
[media] media: omap_vout: Convert omap_vout_uservirt_to_phys() to use get_vaddr_pfns()
[media] mm: Provide new get_vaddr_frames() helper
[media] vb2: Push mmap_sem down to memops
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); |