mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	mm: add a io_mapping_map_user helper
Add a helper that calls remap_pfn_range for an struct io_mapping, relying on the pgprot pre-validation done when creating the mapping instead of doing it at runtime. Link: https://lkml.kernel.org/r/20210326055505.1424432-3-hch@lst.de Signed-off-by: Christoph Hellwig <hch@lst.de> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									74ffa5a3e6
								
							
						
					
					
						commit
						1fbaf8fc12
					
				
					 4 changed files with 36 additions and 0 deletions
				
			
		|  | @ -220,3 +220,6 @@ io_mapping_free(struct io_mapping *iomap) | |||
| } | ||||
| 
 | ||||
| #endif /* _LINUX_IO_MAPPING_H */ | ||||
| 
 | ||||
| int io_mapping_map_user(struct io_mapping *iomap, struct vm_area_struct *vma, | ||||
| 		unsigned long addr, unsigned long pfn, unsigned long size); | ||||
|  |  | |||
|  | @ -871,4 +871,7 @@ config MAPPING_DIRTY_HELPERS | |||
| config KMAP_LOCAL | ||||
| 	bool | ||||
| 
 | ||||
| # struct io_mapping based helper.  Selected by drivers that need them | ||||
| config IO_MAPPING | ||||
| 	bool | ||||
| endmenu | ||||
|  |  | |||
|  | @ -120,3 +120,4 @@ obj-$(CONFIG_MEMFD_CREATE) += memfd.o | |||
| obj-$(CONFIG_MAPPING_DIRTY_HELPERS) += mapping_dirty_helpers.o | ||||
| obj-$(CONFIG_PTDUMP_CORE) += ptdump.o | ||||
| obj-$(CONFIG_PAGE_REPORTING) += page_reporting.o | ||||
| obj-$(CONFIG_IO_MAPPING) += io-mapping.o | ||||
|  |  | |||
							
								
								
									
										29
									
								
								mm/io-mapping.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								mm/io-mapping.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| // SPDX-License-Identifier: GPL-2.0-only
 | ||||
| 
 | ||||
| #include <linux/mm.h> | ||||
| #include <linux/io-mapping.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * io_mapping_map_user - remap an I/O mapping to userspace | ||||
|  * @iomap: the source io_mapping | ||||
|  * @vma: user vma to map to | ||||
|  * @addr: target user address to start at | ||||
|  * @pfn: physical address of kernel memory | ||||
|  * @size: size of map area | ||||
|  * | ||||
|  *  Note: this is only safe if the mm semaphore is held when called. | ||||
|  */ | ||||
| int io_mapping_map_user(struct io_mapping *iomap, struct vm_area_struct *vma, | ||||
| 		unsigned long addr, unsigned long pfn, unsigned long size) | ||||
| { | ||||
| 	vm_flags_t expected_flags = VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP; | ||||
| 
 | ||||
| 	if (WARN_ON_ONCE((vma->vm_flags & expected_flags) != expected_flags)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	/* We rely on prevalidation of the io-mapping to skip track_pfn(). */ | ||||
| 	return remap_pfn_range_notrack(vma, addr, pfn, size, | ||||
| 		__pgprot((pgprot_val(iomap->prot) & _PAGE_CACHE_MASK) | | ||||
| 			 (pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK))); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(io_mapping_map_user); | ||||
		Loading…
	
		Reference in a new issue
	
	 Christoph Hellwig
						Christoph Hellwig