mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
Merge tag 'topic/iomem-mmap-vs-gup-2021-02-22' of git://anongit.freedesktop.org/drm/drm
Pull follow_pfn() updates from Daniel Vetter: "Fixes around VM_FPNMAP and follow_pfn: - replace mm/frame_vector.c by get_user_pages in misc/habana and drm/exynos drivers, then move that into media as it's sole user - close race in generic_access_phys - s390 pci ioctl fix of this series landed in 5.11 already - properly revoke iomem mappings (/dev/mem, pci files)" * tag 'topic/iomem-mmap-vs-gup-2021-02-22' of git://anongit.freedesktop.org/drm/drm: PCI: Revoke mappings like devmem PCI: Also set up legacy files only after sysfs init sysfs: Support zapping of binary attr mmaps resource: Move devmem revoke code to resource framework /dev/mem: Only set filp->f_mapping PCI: Obey iomem restrictions for procfs mmap mm: Close race in generic_access_phys media: videobuf2: Move frame_vector into media subsystem mm/frame-vector: Use FOLL_LONGTERM misc/habana: Use FOLL_LONGTERM for userptr misc/habana: Stop using frame_vector helpers drm/exynos: Use FOLL_LONGTERM for g2d cmdlists drm/exynos: Stop using frame_vector helpers
This commit is contained in:
@@ -593,7 +593,8 @@ struct vm_operations_struct {
|
||||
vm_fault_t (*pfn_mkwrite)(struct vm_fault *vmf);
|
||||
|
||||
/* called by access_process_vm when get_user_pages() fails, typically
|
||||
* for use by special VMAs that can switch between memory and hardware
|
||||
* for use by special VMAs. See also generic_access_phys() for a generic
|
||||
* implementation useful for any iomem mapping.
|
||||
*/
|
||||
int (*access)(struct vm_area_struct *vma, unsigned long addr,
|
||||
void *buf, int len, int write);
|
||||
@@ -1761,48 +1762,6 @@ int account_locked_vm(struct mm_struct *mm, unsigned long pages, bool inc);
|
||||
int __account_locked_vm(struct mm_struct *mm, unsigned long pages, bool inc,
|
||||
struct task_struct *task, bool bypass_rlim);
|
||||
|
||||
/* Container for pinned pfns / pages */
|
||||
struct frame_vector {
|
||||
unsigned int nr_allocated; /* Number of frames we have space for */
|
||||
unsigned int nr_frames; /* Number of frames stored in ptrs array */
|
||||
bool got_ref; /* Did we pin pages by getting page ref? */
|
||||
bool is_pfns; /* Does array contain pages or pfns? */
|
||||
void *ptrs[]; /* Array of pinned pfns / pages. Use
|
||||
* pfns_vector_pages() or pfns_vector_pfns()
|
||||
* for access */
|
||||
};
|
||||
|
||||
struct frame_vector *frame_vector_create(unsigned int nr_frames);
|
||||
void frame_vector_destroy(struct frame_vector *vec);
|
||||
int get_vaddr_frames(unsigned long start, unsigned int nr_pfns,
|
||||
unsigned int gup_flags, struct frame_vector *vec);
|
||||
void put_vaddr_frames(struct frame_vector *vec);
|
||||
int frame_vector_to_pages(struct frame_vector *vec);
|
||||
void frame_vector_to_pfns(struct frame_vector *vec);
|
||||
|
||||
static inline unsigned int frame_vector_count(struct frame_vector *vec)
|
||||
{
|
||||
return vec->nr_frames;
|
||||
}
|
||||
|
||||
static inline struct page **frame_vector_pages(struct frame_vector *vec)
|
||||
{
|
||||
if (vec->is_pfns) {
|
||||
int err = frame_vector_to_pages(vec);
|
||||
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
return (struct page **)(vec->ptrs);
|
||||
}
|
||||
|
||||
static inline unsigned long *frame_vector_pfns(struct frame_vector *vec)
|
||||
{
|
||||
if (!vec->is_pfns)
|
||||
frame_vector_to_pfns(vec);
|
||||
return (unsigned long *)(vec->ptrs);
|
||||
}
|
||||
|
||||
struct kvec;
|
||||
int get_kernel_pages(const struct kvec *iov, int nr_pages, int write,
|
||||
struct page **pages);
|
||||
|
Reference in New Issue
Block a user