From: Kefeng Wang <wangkefeng.wang@huawei.com> To: <catalin.marinas@arm.com>, <will@kernel.org>, <akpm@linux-foundation.org>, <linux-arm-kernel@lists.infradead.org>, <linux-kernel@vger.kernel.org> Cc: <linux-mm@kvack.org>, <hch@infradead.org>, <arnd@arndb.de>, <anshuman.khandual@arm.com>, Kefeng Wang <wangkefeng.wang@huawei.com> Subject: [PATCH v5 4/6] mm: ioremap: Add ioremap/iounmap_allowed() Date: Tue, 7 Jun 2022 20:50:25 +0800 [thread overview] Message-ID: <20220607125027.44946-5-wangkefeng.wang@huawei.com> (raw) In-Reply-To: <20220607125027.44946-1-wangkefeng.wang@huawei.com> Add special hook for architecture to verify addr, size or prot when ioremap() or iounmap(), which will make the generic ioremap more useful. ioremap_allowed() return a bool, - true means continue to remap - false means skip remap and return directly iounmap_allowed() return a bool, - true means continue to vunmap - false code means skip vunmap and return directly Meanwhile, only vunmap the address when it is in vmalloc area as the generic ioremap only returns vmalloc addresses. Acked-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> --- include/asm-generic/io.h | 26 ++++++++++++++++++++++++++ mm/ioremap.c | 11 ++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index b76379628a02..db5b890eaff7 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -964,6 +964,32 @@ static inline void iounmap(volatile void __iomem *addr) #elif defined(CONFIG_GENERIC_IOREMAP) #include <linux/pgtable.h> +/* + * Arch code can implement the following two hooks when using GENERIC_IOREMAP + * ioremap_allowed() return a bool, + * - true means continue to remap + * - false means skip remap and return directly + * iounmap_allowed() return a bool, + * - true means continue to vunmap + * - false means skip vunmap and return directly + */ +#ifndef ioremap_allowed +#define ioremap_allowed ioremap_allowed +static inline bool ioremap_allowed(phys_addr_t phys_addr, size_t size, + unsigned long prot) +{ + return true; +} +#endif + +#ifndef iounmap_allowed +#define iounmap_allowed iounmap_allowed +static inline bool iounmap_allowed(void *addr) +{ + return true; +} +#endif + void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, unsigned long prot); void iounmap(volatile void __iomem *addr); diff --git a/mm/ioremap.c b/mm/ioremap.c index e1d008e8f87f..8652426282cc 100644 --- a/mm/ioremap.c +++ b/mm/ioremap.c @@ -28,6 +28,9 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, phys_addr -= offset; size = PAGE_ALIGN(size + offset); + if (!ioremap_allowed(phys_addr, size, prot)) + return NULL; + area = get_vm_area_caller(size, VM_IOREMAP, __builtin_return_address(0)); if (!area) @@ -47,6 +50,12 @@ EXPORT_SYMBOL(ioremap_prot); void iounmap(volatile void __iomem *addr) { - vunmap((void *)((unsigned long)addr & PAGE_MASK)); + void *vaddr = (void *)((unsigned long)addr & PAGE_MASK); + + if (!iounmap_allowed(vaddr)) + return; + + if (is_vmalloc_addr(vaddr)) + vunmap(vaddr); } EXPORT_SYMBOL(iounmap); -- 2.35.3
WARNING: multiple messages have this Message-ID (diff)
From: Kefeng Wang <wangkefeng.wang@huawei.com> To: <catalin.marinas@arm.com>, <will@kernel.org>, <akpm@linux-foundation.org>, <linux-arm-kernel@lists.infradead.org>, <linux-kernel@vger.kernel.org> Cc: <linux-mm@kvack.org>, <hch@infradead.org>, <arnd@arndb.de>, <anshuman.khandual@arm.com>, Kefeng Wang <wangkefeng.wang@huawei.com> Subject: [PATCH v5 4/6] mm: ioremap: Add ioremap/iounmap_allowed() Date: Tue, 7 Jun 2022 20:50:25 +0800 [thread overview] Message-ID: <20220607125027.44946-5-wangkefeng.wang@huawei.com> (raw) In-Reply-To: <20220607125027.44946-1-wangkefeng.wang@huawei.com> Add special hook for architecture to verify addr, size or prot when ioremap() or iounmap(), which will make the generic ioremap more useful. ioremap_allowed() return a bool, - true means continue to remap - false means skip remap and return directly iounmap_allowed() return a bool, - true means continue to vunmap - false code means skip vunmap and return directly Meanwhile, only vunmap the address when it is in vmalloc area as the generic ioremap only returns vmalloc addresses. Acked-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> --- include/asm-generic/io.h | 26 ++++++++++++++++++++++++++ mm/ioremap.c | 11 ++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index b76379628a02..db5b890eaff7 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -964,6 +964,32 @@ static inline void iounmap(volatile void __iomem *addr) #elif defined(CONFIG_GENERIC_IOREMAP) #include <linux/pgtable.h> +/* + * Arch code can implement the following two hooks when using GENERIC_IOREMAP + * ioremap_allowed() return a bool, + * - true means continue to remap + * - false means skip remap and return directly + * iounmap_allowed() return a bool, + * - true means continue to vunmap + * - false means skip vunmap and return directly + */ +#ifndef ioremap_allowed +#define ioremap_allowed ioremap_allowed +static inline bool ioremap_allowed(phys_addr_t phys_addr, size_t size, + unsigned long prot) +{ + return true; +} +#endif + +#ifndef iounmap_allowed +#define iounmap_allowed iounmap_allowed +static inline bool iounmap_allowed(void *addr) +{ + return true; +} +#endif + void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, unsigned long prot); void iounmap(volatile void __iomem *addr); diff --git a/mm/ioremap.c b/mm/ioremap.c index e1d008e8f87f..8652426282cc 100644 --- a/mm/ioremap.c +++ b/mm/ioremap.c @@ -28,6 +28,9 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, phys_addr -= offset; size = PAGE_ALIGN(size + offset); + if (!ioremap_allowed(phys_addr, size, prot)) + return NULL; + area = get_vm_area_caller(size, VM_IOREMAP, __builtin_return_address(0)); if (!area) @@ -47,6 +50,12 @@ EXPORT_SYMBOL(ioremap_prot); void iounmap(volatile void __iomem *addr) { - vunmap((void *)((unsigned long)addr & PAGE_MASK)); + void *vaddr = (void *)((unsigned long)addr & PAGE_MASK); + + if (!iounmap_allowed(vaddr)) + return; + + if (is_vmalloc_addr(vaddr)) + vunmap(vaddr); } EXPORT_SYMBOL(iounmap); -- 2.35.3 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-06-07 12:41 UTC|newest] Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-06-07 12:50 [PATCH v5 0/6] arm64: Cleanup ioremap() and support ioremap_prot() Kefeng Wang 2022-06-07 12:50 ` Kefeng Wang 2022-06-07 12:50 ` [PATCH v5 1/6] ARM: mm: kill unused runtime hook arch_iounmap() Kefeng Wang 2022-06-07 12:50 ` Kefeng Wang 2022-06-07 15:40 ` Russell King (Oracle) 2022-06-07 15:40 ` Russell King (Oracle) 2022-06-14 5:47 ` kernel test robot 2022-06-14 5:47 ` kernel test robot 2022-06-14 6:12 ` Kefeng Wang 2022-06-14 6:12 ` Kefeng Wang 2022-06-14 6:12 ` Kefeng Wang 2022-06-07 12:50 ` [PATCH v5 2/6] mm: ioremap: Use more sensibly name in ioremap_prot() Kefeng Wang 2022-06-07 12:50 ` Kefeng Wang 2022-06-08 4:16 ` Baoquan He 2022-06-08 4:16 ` Baoquan He 2022-06-08 7:22 ` Baoquan He 2022-06-08 7:22 ` Baoquan He 2022-06-08 6:09 ` Christoph Hellwig 2022-06-08 6:09 ` Christoph Hellwig 2022-06-08 7:04 ` Baoquan He 2022-06-08 7:04 ` Baoquan He 2022-06-10 9:22 ` [PATCH v5 resend 2/6] mm: ioremap: Use more sensible " Kefeng Wang 2022-06-10 9:22 ` Kefeng Wang 2022-06-07 12:50 ` [PATCH v5 3/6] mm: ioremap: Setup phys_addr of struct vm_struct Kefeng Wang 2022-06-07 12:50 ` Kefeng Wang 2022-06-07 12:50 ` Kefeng Wang [this message] 2022-06-07 12:50 ` [PATCH v5 4/6] mm: ioremap: Add ioremap/iounmap_allowed() Kefeng Wang 2022-06-08 4:18 ` Baoquan He 2022-06-08 4:18 ` Baoquan He 2022-06-08 6:10 ` Christoph Hellwig 2022-06-08 6:10 ` Christoph Hellwig 2022-06-07 12:50 ` [PATCH v5 5/6] arm64: mm: Convert to GENERIC_IOREMAP Kefeng Wang 2022-06-07 12:50 ` Kefeng Wang 2022-06-07 12:50 ` [PATCH v5 6/6] arm64: Add HAVE_IOREMAP_PROT support Kefeng Wang 2022-06-07 12:50 ` Kefeng Wang 2022-06-14 3:21 ` [PATCH v5 0/6] arm64: Cleanup ioremap() and support ioremap_prot() Kefeng Wang 2022-06-14 3:21 ` Kefeng Wang 2022-06-27 11:06 ` Kefeng Wang 2022-06-27 11:06 ` Kefeng Wang 2022-06-27 11:14 ` Will Deacon 2022-06-27 11:14 ` Will Deacon 2022-06-27 11:19 ` Kefeng Wang 2022-06-27 11:19 ` Kefeng Wang 2022-06-27 13:00 ` Will Deacon 2022-06-27 13:00 ` Will Deacon
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220607125027.44946-5-wangkefeng.wang@huawei.com \ --to=wangkefeng.wang@huawei.com \ --cc=akpm@linux-foundation.org \ --cc=anshuman.khandual@arm.com \ --cc=arnd@arndb.de \ --cc=catalin.marinas@arm.com \ --cc=hch@infradead.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.