On Tue, Jul 3, 2018 at 6:09 PM, Matthew Wilcox <wi...@infradead.org> wrote: > Like vm_insert_pfn_prot(), but returns a vm_fault_t instead of an errno. > Also unexport vm_insert_pfn_prot as it has no modular users. > > Signed-off-by: Matthew Wilcox <wi...@infradead.org> > ---
Any comment on this patch ? > include/linux/mm.h | 2 ++ > mm/memory.c | 47 ++++++++++++++++++++++++++++++---------------- > 2 files changed, 33 insertions(+), 16 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 1a9d6bd97f00..3cb763a38642 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -2441,6 +2441,8 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned > long addr, > unsigned long pfn); > int vm_insert_pfn_prot(struct vm_area_struct *vma, unsigned long addr, > unsigned long pfn, pgprot_t pgprot); > +vm_fault_t vmf_insert_pfn_prot(struct vm_area_struct *vma, unsigned long > addr, > + unsigned long pfn, pgprot_t pgprot); > int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr, > pfn_t pfn); > vm_fault_t vmf_insert_mixed_mkwrite(struct vm_area_struct *vma, > diff --git a/mm/memory.c b/mm/memory.c > index b9ebd883e27c..caecb4d995ac 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -1852,21 +1852,6 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned > long addr, > } > EXPORT_SYMBOL(vm_insert_pfn); > > -/** > - * vm_insert_pfn_prot - insert single pfn into user vma with specified pgprot > - * @vma: user vma to map to > - * @addr: target user address of this page > - * @pfn: source kernel pfn > - * @pgprot: pgprot flags for the inserted page > - * > - * This is exactly like vm_insert_pfn, except that it allows drivers to > - * to override pgprot on a per-page basis. > - * > - * This only makes sense for IO mappings, and it makes no sense for > - * cow mappings. In general, using multiple vmas is preferable; > - * vm_insert_pfn_prot should only be used if using multiple VMAs is > - * impractical. > - */ > int vm_insert_pfn_prot(struct vm_area_struct *vma, unsigned long addr, > unsigned long pfn, pgprot_t pgprot) > { > @@ -1893,7 +1878,37 @@ int vm_insert_pfn_prot(struct vm_area_struct *vma, > unsigned long addr, > > return ret; > } > -EXPORT_SYMBOL(vm_insert_pfn_prot); > + > +/** > + * vmf_insert_pfn_prot - insert single pfn into user vma with specified > pgprot > + * @vma: user vma to map to > + * @addr: target user address of this page > + * @pfn: source kernel pfn > + * @pgprot: pgprot flags for the inserted page > + * > + * This is exactly like vmf_insert_pfn(), except that it allows drivers to > + * to override pgprot on a per-page basis. > + * > + * This only makes sense for IO mappings, and it makes no sense for > + * COW mappings. In general, using multiple vmas is preferable; > + * vm_insert_pfn_prot should only be used if using multiple VMAs is > + * impractical. > + * > + * Return: vm_fault_t value. > + */ > +vm_fault_t vmf_insert_pfn_prot(struct vm_area_struct *vma, unsigned long > addr, > + unsigned long pfn, pgprot_t pgprot) > +{ > + int err = vm_insert_pfn_prot(vma, addr, pfn, pgprot); > + > + if (err == -ENOMEM) > + return VM_FAULT_OOM; > + if (err < 0 && err != -EBUSY) > + return VM_FAULT_SIGBUS; > + > + return VM_FAULT_NOPAGE; > +} > +EXPORT_SYMBOL(vmf_insert_pfn_prot); > > static bool vm_mixed_ok(struct vm_area_struct *vma, pfn_t pfn) > { > -- > 2.18.0 >