On 11/09/25(Thu) 17:12, Miod Vallat wrote:
> > Note that NetBSD also calls pmap_kenter_pa(9) in this case. So maybe
> > there's a fix for landisk out there.  Anyone care about landisk?
> 
> I'm not sure of this, but to begin with, it appears we lack that fix,
> which I am testing at the moment (without the asserts), diff at the
> end of this mail.

ok mpi@

> revision 1.86
> date: 2021-09-02 07:55:56 +0000;  author: rin;  state: Exp;  lines: +14 -5;  
> commitid: wUuIRmZIbubS0m7D;
> PR port-sh3/56381
> 
> pmap_enter() returns ENOMEM if __pmap_pte_alloc() fails and PMAP_CANFAIL
> flag is specified. In this case, remove pv via __pmap_pv_remove() if it is
> added to p-v map list via __pmap_pv_enter().
> 
> Otherwise, pmap becomes an inconsistent state, which results in an infinite
> loop in pmap_page_protect(), as reported in the PR.
> 
> Also, KASSERT's are added for sure, in order to detect the infinite loops.
> 
> Great thanks to chs@ for finding out this bug!!
> 
> Index: pmap.c
> ===================================================================
> RCS file: /OpenBSD/src/sys/arch/sh/sh/pmap.c,v
> diff -u -p -r1.30 pmap.c
> --- pmap.c    1 Jan 2023 19:49:17 -0000       1.30
> +++ pmap.c    11 Sep 2025 17:10:04 -0000
> @@ -357,8 +357,11 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd
>       else {
>               pte = __pmap_pte_alloc(pmap, va);
>               if (pte == NULL) {
> -                     if (flags & PMAP_CANFAIL)
> +                     if (flags & PMAP_CANFAIL) {
> +                             if (pg != NULL)
> +                                     __pmap_pv_remove(pmap, pg, va);
>                               return ENOMEM;
> +                     }
>                       panic("pmap_enter: cannot allocate pte");
>               }
>       }


Reply via email to