mirror of https://github.com/torvalds/linux.git
mm: abstract io_remap_pfn_range() based on PFN
The only instances in which we customise this function are ones in which we customise the PFN used. Instances where architectures were not passing the pgprot value through pgprot_decrypted() are ones where pgprot_decrypted() was a no-op anyway, so we can simply always pass pgprot through this function. Use this fact to simplify the use of io_remap_pfn_range(), by abstracting the PFN via io_remap_pfn_range_pfn() and using this instead of providing a general io_remap_pfn_range() function per-architecture. Link: https://lkml.kernel.org/r/d086191bf431b58ce3b231b4f4f555d080f60327.1760959442.git.lorenzo.stoakes@oracle.com Suggested-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Cc: Alexander Gordeev <agordeev@linux.ibm.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andreas Larsson <andreas@gaisler.com> Cc: Andrey Konovalov <andreyknvl@gmail.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Baoquan He <bhe@redhat.com> Cc: Chatre, Reinette <reinette.chatre@intel.com> Cc: Christian Borntraeger <borntraeger@linux.ibm.com> Cc: Christian Brauner <brauner@kernel.org> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Dave Jiang <dave.jiang@intel.com> Cc: Dave Martin <dave.martin@arm.com> Cc: Dave Young <dyoung@redhat.com> Cc: David Hildenbrand <david@redhat.com> Cc: David S. Miller <davem@davemloft.net> Cc: Dmitriy Vyukov <dvyukov@google.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Guo Ren <guoren@kernel.org> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Hugh Dickins <hughd@google.com> Cc: James Morse <james.morse@arm.com> Cc: Jan Kara <jack@suse.cz> Cc: Jann Horn <jannh@google.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Kevin Tian <kevin.tian@intel.com> Cc: Konstantin Komarov <almaz.alexandrovich@paragon-software.com> Cc: Liam Howlett <liam.howlett@oracle.com> Cc: "Luck, Tony" <tony.luck@intel.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Nicolas Pitre <nico@fluxnic.net> Cc: Oscar Salvador <osalvador@suse.de> Cc: Pedro Falcato <pfalcato@suse.de> Cc: Robin Murohy <robin.murphy@arm.com> Cc: Sumanth Korikkar <sumanthk@linux.ibm.com> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Sven Schnelle <svens@linux.ibm.com> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Cc: "Uladzislau Rezki (Sony)" <urezki@gmail.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Vishal Verma <vishal.l.verma@intel.com> Cc: Vivek Goyal <vgoyal@redhat.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Will Deacon <will@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
51e38e7d40
commit
c707a68f94
|
|
@ -263,7 +263,4 @@ void update_mmu_cache_range(struct vm_fault *vmf, struct vm_area_struct *vma,
|
||||||
#define update_mmu_cache(vma, addr, ptep) \
|
#define update_mmu_cache(vma, addr, ptep) \
|
||||||
update_mmu_cache_range(NULL, vma, addr, ptep, 1)
|
update_mmu_cache_range(NULL, vma, addr, ptep, 1)
|
||||||
|
|
||||||
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
|
||||||
remap_pfn_range(vma, vaddr, pfn, size, prot)
|
|
||||||
|
|
||||||
#endif /* __ASM_CSKY_PGTABLE_H */
|
#endif /* __ASM_CSKY_PGTABLE_H */
|
||||||
|
|
|
||||||
|
|
@ -94,12 +94,13 @@ phys_addr_t fixup_bigphys_addr(phys_addr_t phys_addr, phys_addr_t size)
|
||||||
return phys_addr;
|
return phys_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long vaddr,
|
static inline unsigned long io_remap_pfn_range_pfn(unsigned long pfn,
|
||||||
unsigned long pfn, unsigned long size, pgprot_t prot)
|
unsigned long size)
|
||||||
{
|
{
|
||||||
phys_addr_t phys_addr = fixup_bigphys_addr(pfn << PAGE_SHIFT, size);
|
phys_addr_t phys_addr = fixup_bigphys_addr(pfn << PAGE_SHIFT, size);
|
||||||
|
|
||||||
return remap_pfn_range(vma, vaddr, phys_addr >> PAGE_SHIFT, size, prot);
|
return phys_addr >> PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(io_remap_pfn_range);
|
EXPORT_SYMBOL(io_remap_pfn_range_pfn);
|
||||||
|
|
||||||
#endif /* CONFIG_MIPS_FIXUP_BIGPHYS_ADDR */
|
#endif /* CONFIG_MIPS_FIXUP_BIGPHYS_ADDR */
|
||||||
|
|
|
||||||
|
|
@ -604,9 +604,8 @@ static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_MIPS_FIXUP_BIGPHYS_ADDR
|
#ifdef CONFIG_MIPS_FIXUP_BIGPHYS_ADDR
|
||||||
phys_addr_t fixup_bigphys_addr(phys_addr_t addr, phys_addr_t size);
|
phys_addr_t fixup_bigphys_addr(phys_addr_t addr, phys_addr_t size);
|
||||||
int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long vaddr,
|
unsigned long io_remap_pfn_range_pfn(unsigned long pfn, unsigned long size);
|
||||||
unsigned long pfn, unsigned long size, pgprot_t prot);
|
#define io_remap_pfn_range_pfn io_remap_pfn_range_pfn
|
||||||
#define io_remap_pfn_range io_remap_pfn_range
|
|
||||||
#else
|
#else
|
||||||
#define fixup_bigphys_addr(addr, size) (addr)
|
#define fixup_bigphys_addr(addr, size) (addr)
|
||||||
#endif /* CONFIG_MIPS_FIXUP_BIGPHYS_ADDR */
|
#endif /* CONFIG_MIPS_FIXUP_BIGPHYS_ADDR */
|
||||||
|
|
|
||||||
|
|
@ -395,12 +395,8 @@ __get_iospace (unsigned long addr)
|
||||||
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
||||||
#define GET_PFN(pfn) (pfn & 0x0fffffffUL)
|
#define GET_PFN(pfn) (pfn & 0x0fffffffUL)
|
||||||
|
|
||||||
int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long,
|
static inline unsigned long io_remap_pfn_range_pfn(unsigned long pfn,
|
||||||
unsigned long, pgprot_t);
|
unsigned long size)
|
||||||
|
|
||||||
static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
|
||||||
unsigned long from, unsigned long pfn,
|
|
||||||
unsigned long size, pgprot_t prot)
|
|
||||||
{
|
{
|
||||||
unsigned long long offset, space, phys_base;
|
unsigned long long offset, space, phys_base;
|
||||||
|
|
||||||
|
|
@ -408,9 +404,9 @@ static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
||||||
space = GET_IOSPACE(pfn);
|
space = GET_IOSPACE(pfn);
|
||||||
phys_base = offset | (space << 32ULL);
|
phys_base = offset | (space << 32ULL);
|
||||||
|
|
||||||
return remap_pfn_range(vma, from, phys_base >> PAGE_SHIFT, size, prot);
|
return phys_base >> PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
#define io_remap_pfn_range io_remap_pfn_range
|
#define io_remap_pfn_range_pfn io_remap_pfn_range_pfn
|
||||||
|
|
||||||
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
|
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
|
||||||
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
|
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
|
||||||
|
|
|
||||||
|
|
@ -1048,9 +1048,6 @@ int page_in_phys_avail(unsigned long paddr);
|
||||||
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
||||||
#define GET_PFN(pfn) (pfn & 0x0fffffffffffffffUL)
|
#define GET_PFN(pfn) (pfn & 0x0fffffffffffffffUL)
|
||||||
|
|
||||||
int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long,
|
|
||||||
unsigned long, pgprot_t);
|
|
||||||
|
|
||||||
void adi_restore_tags(struct mm_struct *mm, struct vm_area_struct *vma,
|
void adi_restore_tags(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||||
unsigned long addr, pte_t pte);
|
unsigned long addr, pte_t pte);
|
||||||
|
|
||||||
|
|
@ -1084,9 +1081,8 @@ static inline int arch_unmap_one(struct mm_struct *mm,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
static inline unsigned long io_remap_pfn_range_pfn(unsigned long pfn,
|
||||||
unsigned long from, unsigned long pfn,
|
unsigned long size)
|
||||||
unsigned long size, pgprot_t prot)
|
|
||||||
{
|
{
|
||||||
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
||||||
int space = GET_IOSPACE(pfn);
|
int space = GET_IOSPACE(pfn);
|
||||||
|
|
@ -1094,9 +1090,9 @@ static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
||||||
|
|
||||||
phys_base = offset | (((unsigned long) space) << 32UL);
|
phys_base = offset | (((unsigned long) space) << 32UL);
|
||||||
|
|
||||||
return remap_pfn_range(vma, from, phys_base >> PAGE_SHIFT, size, prot);
|
return phys_base >> PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
#define io_remap_pfn_range io_remap_pfn_range
|
#define io_remap_pfn_range_pfn io_remap_pfn_range_pfn
|
||||||
|
|
||||||
static inline unsigned long __untagged_addr(unsigned long start)
|
static inline unsigned long __untagged_addr(unsigned long start)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -3684,15 +3684,24 @@ static inline vm_fault_t vmf_insert_page(struct vm_area_struct *vma,
|
||||||
return VM_FAULT_NOPAGE;
|
return VM_FAULT_NOPAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef io_remap_pfn_range
|
#ifndef io_remap_pfn_range_pfn
|
||||||
static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
static inline unsigned long io_remap_pfn_range_pfn(unsigned long pfn,
|
||||||
unsigned long addr, unsigned long pfn,
|
unsigned long size)
|
||||||
unsigned long size, pgprot_t prot)
|
|
||||||
{
|
{
|
||||||
return remap_pfn_range(vma, addr, pfn, size, pgprot_decrypted(prot));
|
return pfn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
||||||
|
unsigned long addr, unsigned long orig_pfn,
|
||||||
|
unsigned long size, pgprot_t orig_prot)
|
||||||
|
{
|
||||||
|
const unsigned long pfn = io_remap_pfn_range_pfn(orig_pfn, size);
|
||||||
|
const pgprot_t prot = pgprot_decrypted(orig_prot);
|
||||||
|
|
||||||
|
return remap_pfn_range(vma, addr, pfn, size, prot);
|
||||||
|
}
|
||||||
|
|
||||||
static inline vm_fault_t vmf_error(int err)
|
static inline vm_fault_t vmf_error(int err)
|
||||||
{
|
{
|
||||||
if (err == -ENOMEM)
|
if (err == -ENOMEM)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue