* [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear, set}_uncached
@ 2022-10-08 5:24 Stafford Horne
2022-10-08 5:26 ` Stafford Horne
0 siblings, 1 reply; 4+ messages in thread
From: Stafford Horne @ 2022-10-08 5:24 UTC (permalink / raw)
To: linux-kernel; +Cc: Jonas Bonn, Jann Horn, Steven Price, openrisc
From: Jann Horn <jannh@google.com>
Since commit 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page
walker"), walk_page_range() on kernel ranges won't work anymore,
walk_page_range_novma() must be used instead.
Note: I don't have an openrisc development setup, so this is completely
untested.
Fixes: 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page walker")
Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Stafford Horne <shorne@gmail.com>
---
Since v1:
- Repost to include LKML.
- Added my SOB
- I tested this by booking this on the qemu virt platform and it works fine.
arch/openrisc/kernel/dma.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
index a82b2caaa560..b3edbb33b621 100644
--- a/arch/openrisc/kernel/dma.c
+++ b/arch/openrisc/kernel/dma.c
@@ -74,10 +74,10 @@ void *arch_dma_set_uncached(void *cpu_addr, size_t size)
* We need to iterate through the pages, clearing the dcache for
* them and setting the cache-inhibit bit.
*/
- mmap_read_lock(&init_mm);
- error = walk_page_range(&init_mm, va, va + size, &set_nocache_walk_ops,
- NULL);
- mmap_read_unlock(&init_mm);
+ mmap_write_lock(&init_mm);
+ error = walk_page_range_novma(&init_mm, va, va + size,
+ &set_nocache_walk_ops, NULL, NULL);
+ mmap_write_unlock(&init_mm);
if (error)
return ERR_PTR(error);
@@ -88,11 +88,11 @@ void arch_dma_clear_uncached(void *cpu_addr, size_t size)
{
unsigned long va = (unsigned long)cpu_addr;
- mmap_read_lock(&init_mm);
+ mmap_write_lock(&init_mm);
/* walk_page_range shouldn't be able to fail here */
- WARN_ON(walk_page_range(&init_mm, va, va + size,
- &clear_nocache_walk_ops, NULL));
- mmap_read_unlock(&init_mm);
+ WARN_ON(walk_page_range_novma(&init_mm, va, va + size,
+ &clear_nocache_walk_ops, NULL, NULL));
+ mmap_write_unlock(&init_mm);
}
void arch_sync_dma_for_device(phys_addr_t addr, size_t size,
--
2.37.2
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear, set}_uncached
2022-10-08 5:24 [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear, set}_uncached Stafford Horne
@ 2022-10-08 5:26 ` Stafford Horne
0 siblings, 0 replies; 4+ messages in thread
From: Stafford Horne @ 2022-10-08 5:26 UTC (permalink / raw)
To: linux-kernel; +Cc: Jonas Bonn, openrisc, Steven Price, Jann Horn
Sorry, meant to tag this as v2. But I missed the command line option as I am on
a new system and was working on getting aliases and other things setup to send
this mail.
-Stafford
On Sat, Oct 08, 2022 at 06:24:21AM +0100, Stafford Horne wrote:
> From: Jann Horn <jannh@google.com>
>
> Since commit 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page
> walker"), walk_page_range() on kernel ranges won't work anymore,
> walk_page_range_novma() must be used instead.
>
> Note: I don't have an openrisc development setup, so this is completely
> untested.
>
> Fixes: 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page walker")
> Signed-off-by: Jann Horn <jannh@google.com>
> Signed-off-by: Stafford Horne <shorne@gmail.com>
> ---
> Since v1:
> - Repost to include LKML.
> - Added my SOB
> - I tested this by booking this on the qemu virt platform and it works fine.
>
> arch/openrisc/kernel/dma.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
> index a82b2caaa560..b3edbb33b621 100644
> --- a/arch/openrisc/kernel/dma.c
> +++ b/arch/openrisc/kernel/dma.c
> @@ -74,10 +74,10 @@ void *arch_dma_set_uncached(void *cpu_addr, size_t size)
> * We need to iterate through the pages, clearing the dcache for
> * them and setting the cache-inhibit bit.
> */
> - mmap_read_lock(&init_mm);
> - error = walk_page_range(&init_mm, va, va + size, &set_nocache_walk_ops,
> - NULL);
> - mmap_read_unlock(&init_mm);
> + mmap_write_lock(&init_mm);
> + error = walk_page_range_novma(&init_mm, va, va + size,
> + &set_nocache_walk_ops, NULL, NULL);
> + mmap_write_unlock(&init_mm);
>
> if (error)
> return ERR_PTR(error);
> @@ -88,11 +88,11 @@ void arch_dma_clear_uncached(void *cpu_addr, size_t size)
> {
> unsigned long va = (unsigned long)cpu_addr;
>
> - mmap_read_lock(&init_mm);
> + mmap_write_lock(&init_mm);
> /* walk_page_range shouldn't be able to fail here */
> - WARN_ON(walk_page_range(&init_mm, va, va + size,
> - &clear_nocache_walk_ops, NULL));
> - mmap_read_unlock(&init_mm);
> + WARN_ON(walk_page_range_novma(&init_mm, va, va + size,
> + &clear_nocache_walk_ops, NULL, NULL));
> + mmap_write_unlock(&init_mm);
> }
>
> void arch_sync_dma_for_device(phys_addr_t addr, size_t size,
> --
> 2.37.2
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear, set}_uncached
@ 2022-10-06 18:33 Jann Horn
2022-10-08 5:07 ` [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear,set}_uncached Stafford Horne
0 siblings, 1 reply; 4+ messages in thread
From: Jann Horn @ 2022-10-06 18:33 UTC (permalink / raw)
To: Jonas Bonn, Stefan Kristiansson, Stafford Horne, openrisc
Since commit 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page
walker"), walk_page_range() on kernel ranges won't work anymore,
walk_page_range_novma() must be used instead.
Note: I don't have an openrisc development setup, so this is completely
untested.
Fixes: 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page walker")
Signed-off-by: Jann Horn <jannh@google.com>
---
Normally I would CC stable on a patch like this, but openrisc is mostly an
in-development thing, so fixing stable kernels doesn't matter much, I assume?
arch/openrisc/kernel/dma.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
index a82b2caaa560d..b3edbb33b621d 100644
--- a/arch/openrisc/kernel/dma.c
+++ b/arch/openrisc/kernel/dma.c
@@ -74,10 +74,10 @@ void *arch_dma_set_uncached(void *cpu_addr, size_t size)
* We need to iterate through the pages, clearing the dcache for
* them and setting the cache-inhibit bit.
*/
- mmap_read_lock(&init_mm);
- error = walk_page_range(&init_mm, va, va + size, &set_nocache_walk_ops,
- NULL);
- mmap_read_unlock(&init_mm);
+ mmap_write_lock(&init_mm);
+ error = walk_page_range_novma(&init_mm, va, va + size,
+ &set_nocache_walk_ops, NULL, NULL);
+ mmap_write_unlock(&init_mm);
if (error)
return ERR_PTR(error);
@@ -88,11 +88,11 @@ void arch_dma_clear_uncached(void *cpu_addr, size_t size)
{
unsigned long va = (unsigned long)cpu_addr;
- mmap_read_lock(&init_mm);
+ mmap_write_lock(&init_mm);
/* walk_page_range shouldn't be able to fail here */
- WARN_ON(walk_page_range(&init_mm, va, va + size,
- &clear_nocache_walk_ops, NULL));
- mmap_read_unlock(&init_mm);
+ WARN_ON(walk_page_range_novma(&init_mm, va, va + size,
+ &clear_nocache_walk_ops, NULL, NULL));
+ mmap_write_unlock(&init_mm);
}
void arch_sync_dma_for_device(phys_addr_t addr, size_t size,
base-commit: 7e6739b9336e61fe23ca4e2c8d1fda8f19f979bf
--
2.38.0.rc1.362.ged0d419d3c-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear,set}_uncached
2022-10-06 18:33 Jann Horn
@ 2022-10-08 5:07 ` Stafford Horne
0 siblings, 0 replies; 4+ messages in thread
From: Stafford Horne @ 2022-10-08 5:07 UTC (permalink / raw)
To: Jann Horn; +Cc: Jonas Bonn, openrisc
On Thu, Oct 06, 2022 at 08:33:01PM +0200, Jann Horn wrote:
> Since commit 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page
> walker"), walk_page_range() on kernel ranges won't work anymore,
> walk_page_range_novma() must be used instead.
>
> Note: I don't have an openrisc development setup, so this is completely
> untested.
>
> Fixes: 8782fb61cc848 ("mm: pagewalk: Fix race between unmap and page walker")
> Signed-off-by: Jann Horn <jannh@google.com>
This looks good to me, I will queue it for 6.1 fixes.
> ---
> Normally I would CC stable on a patch like this, but openrisc is mostly an
> in-development thing, so fixing stable kernels doesn't matter much, I assume?
In general we try to keep stable releases stable buy backporting OpenRISC patches
as well. Just having the 'Fixes' tag should trigger to get this patched
backported to stable. We should at least cc the LKML though.
-Stafford
> arch/openrisc/kernel/dma.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
> index a82b2caaa560d..b3edbb33b621d 100644
> --- a/arch/openrisc/kernel/dma.c
> +++ b/arch/openrisc/kernel/dma.c
> @@ -74,10 +74,10 @@ void *arch_dma_set_uncached(void *cpu_addr, size_t size)
> * We need to iterate through the pages, clearing the dcache for
> * them and setting the cache-inhibit bit.
> */
> - mmap_read_lock(&init_mm);
> - error = walk_page_range(&init_mm, va, va + size, &set_nocache_walk_ops,
> - NULL);
> - mmap_read_unlock(&init_mm);
> + mmap_write_lock(&init_mm);
> + error = walk_page_range_novma(&init_mm, va, va + size,
> + &set_nocache_walk_ops, NULL, NULL);
> + mmap_write_unlock(&init_mm);
>
> if (error)
> return ERR_PTR(error);
> @@ -88,11 +88,11 @@ void arch_dma_clear_uncached(void *cpu_addr, size_t size)
> {
> unsigned long va = (unsigned long)cpu_addr;
>
> - mmap_read_lock(&init_mm);
> + mmap_write_lock(&init_mm);
> /* walk_page_range shouldn't be able to fail here */
> - WARN_ON(walk_page_range(&init_mm, va, va + size,
> - &clear_nocache_walk_ops, NULL));
> - mmap_read_unlock(&init_mm);
> + WARN_ON(walk_page_range_novma(&init_mm, va, va + size,
> + &clear_nocache_walk_ops, NULL, NULL));
> + mmap_write_unlock(&init_mm);
> }
>
> void arch_sync_dma_for_device(phys_addr_t addr, size_t size,
>
> base-commit: 7e6739b9336e61fe23ca4e2c8d1fda8f19f979bf
> --
> 2.38.0.rc1.362.ged0d419d3c-goog
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-10-08 5:26 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-08 5:24 [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear, set}_uncached Stafford Horne
2022-10-08 5:26 ` Stafford Horne
-- strict thread matches above, loose matches on Subject: below --
2022-10-06 18:33 Jann Horn
2022-10-08 5:07 ` [PATCH] openrisc: Fix pagewalk usage in arch_dma_{clear,set}_uncached Stafford Horne
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox