Thorsten Blum <[email protected]> writes:
> If lv1_put_iopte() fails in dma_ioc0_map_pages(), the error path
> decrements iopage but keeps using the failed mapping's offset. As a
> result, it repeatedly tries to invalidate the failed IOPTE slot and
> leaves the already installed IOPTEs valid.
>
> Recompute offset and invalidate the installed IOPTEs instead.
>
Nice catch! I wonder how did you catch this?
Do you have ps3 console where you somehow ran into this ;)
Or was it a manual inspection?
I wonder whether PS3 consoles are still being used?
> Fixes: 6bb5cf102541 ("[POWERPC] PS3: System-bus rework")
Looks like this was from 2007.
However, the change looks good to me. So:
Reviewed-by: Ritesh Harjani (IBM) <[email protected]>
> Cc: [email protected]
> Signed-off-by: Thorsten Blum <[email protected]>
> ---
> arch/powerpc/platforms/ps3/mm.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c
> index 20fc5b68faee..315a32fd75b1 100644
> --- a/arch/powerpc/platforms/ps3/mm.c
> +++ b/arch/powerpc/platforms/ps3/mm.c
> @@ -615,6 +615,7 @@ static int dma_ioc0_map_pages(struct ps3_dma_region *r,
> unsigned long phys_addr,
>
> fail_map:
> for (iopage--; 0 <= iopage; iopage--) {
> + offset = (1 << r->page_size) * iopage;
> lv1_put_iopte(0,
> c->bus_addr + offset,
> c->lpar_addr + offset,