Re: powerpc64/pmap.c trouble report

Eric Grosse <[email protected]> Thu, 6 Jun 2024 23:37:22 -0700
Newsgroups gmane.os.openbsd.ppc
Message-ID <CAHfGVNdFA-xRcZnvwT8fMf0qKhgy0j3G6f+QMXRv2FGV1yfHXg@mail.gmail.com>
Is the large (greater than 2^32) value of pr_nget below
exceptional? My crashes only happen for long-running
heavy workloads so a big value seems plausible but
maybe there is some limit I'm supposed to reconfigure
for such workloads?

panic: pmap_enter: failed to allocate pted
Stopped at      panic+0x134:    ori r0,r0,0x0
    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND

 234577  13111   8889  0x18000001          0    3  go

 491287  13050   8889   0xa001007          0    2  asm
 331460  14455   8889  0x1a000003          0    5  asm
  66317  80047   8889  0x1a000003          0    1  compile
 331134  57997   8889  0x1a000003  0x4000000    0  go
 240615  91938   8889  0x1a000003  0x4000000    6  go
*247303  89969   8889  0x1a000003  0x4000000    4K go
  28756  33586      0     0x14000      0x200    7  pagedaemon
panic+0x134

pmap_enter+0x218

uvm_km_kmemalloc_pla+0x1f4
uvm_uarea_alloc+0x70

thread_fork+0xd8

sys___tfork+0xc4
syscall+0x530

trap+0x5dc

trapagain+0x4
--- syscall (number 8) ---
End of kernel: 0x457c99db0 lr 0x4bddd2604


ddb{4}>show struct pool pmap_pted_pool

struct pmap_pted_pool at 0x1089a98 (424 bytes) {pr_lock =3D {prl_mtx =3D {m=
tx_owner
 =3D (void *)0x0, mtx_wantipl =3D 7, mtx_oldipl =3D 0}, prl_rwlock =3D {rwl=
_owner =3D 0, r
wl_name =3D (const unsigned char *)0x700000000}}, pr_lock_ops =3D (const po=
ol_lock_

ops *)0xfc4950, pr_poollist =3D {sqe_next =3D (struct pool *)0x10898f0}, pr=
_emptypa
ges =3D {tqh_first =3D (struct pool_page_header *)0x0, tqh_last =3D 0x1089a=
b8}, pr_fu
llpages =3D {tqh_first =3D (struct pool_page_header *)0xc00000003e3b2f90, t=
qh_last =3D
 0xc00000014b344f90}, pr_partpages =3D {tqh_first =3D (struct pool_page_hea=
der *)0x
c000000140250f90, tqh_last =3D 0xc000000146821f90}, pr_curpage =3D (struct =
pool_pag
e_header *)0x0, pr_size =3D 56, pr_minitems =3D 20, pr_minpages =3D 1, pr_m=
axpages =3D 8
, pr_npages =3D 4632, pr_itemsperpage =3D 71, pr_slack =3D 0, pr_nitems =3D=
 328872, pr_
nout =3D 328870, pr_hardlimit =3D 4294967295, pr_serial =3D 14, pr_pgsize =
=3D 4096, pr_
pgmask =3D 18446744073709547520, pr_alloc =3D (struct pool_allocator *)0xfe=
9b40, pr
_wchan =3D (const unsigned char *)0xeb08e4, pr_flags =3D 0, pr_ipl =3D 7, p=
r_phtree =3D
 {rbh_root =3D {rbt_root =3D (struct rb_entry *)0x0}}, pr_cache =3D (struct=
 cpumem *)
0x0, pr_cache_magic =3D [0,0], pr_cache_lock =3D {prl_mtx =3D {mtx_owner =
=3D (void *)0x
0, mtx_wantipl =3D 0, mtx_oldipl =3D 0}, prl_rwlock =3D {rwl_owner =3D 0, r=
wl_name =3D (c
onst unsigned char *)0x0}}, pr_cache_lists =3D {tqh_first =3D (struct pool_=
cache_it
em *)0x0, tqh_last =3D 0x0}, pr_cache_nitems =3D 0, pr_cache_items =3D 0, p=
r_cache_co
ntention =3D 0, pr_cache_contention_prev =3D 0, pr_cache_timestamp =3D 0, p=
r_cache_ng
c =3D 0, pr_cache_nout =3D 0, pr_align =3D 8, pr_maxcolors =3D 2, pr_phoffs=
et =3D 3984, p
r_hardlimit_warning =3D (const unsigned char *)0x0, pr_hardlimit_ratecap =
=3D {tv_se

c =3D 0, tv_usec =3D 0}, pr_hardlimit_warning_last =3D {tv_sec =3D 0, tv_us=
ec =3D 0}, pr_
requests_lock =3D {prl_mtx =3D {mtx_owner =3D (void *)0x0, mtx_wantipl =3D =
7, mtx_oldip
l =3D 0}, prl_rwlock =3D {rwl_owner =3D 0, rwl_name =3D (const unsigned cha=
r *)0x700000
000}}, pr_requests =3D {tqh_first =3D (struct pool_request *)0x0, tqh_last =
=3D 0x1089
be8}, pr_requesting =3D 0, pr_nget =3D 5523479116, pr_nfail =3D 13, pr_nput=
 =3D 5523150
246, pr_npagealloc =3D 1387529, pr_npagefree =3D 1382897, pr_hiwat =3D 1007=
2, pr_nidl
e =3D 0, pr_crange =3D (const kmem_pa_mode *)0xfc60b0}


ddb{4}>show struct pool pmap_vp_pool

struct pmap_vp_pool at 0x10898f0 (424 bytes) {pr_lock =3D {prl_mtx =3D {mtx=
_owner =3D
 (void *)0x0, mtx_wantipl =3D 7, mtx_oldipl =3D 7}, prl_rwlock =3D {rwl_own=
er =3D 0, rw
l_name =3D (const unsigned char *)0x700000007}}, pr_lock_ops =3D (const poo=
l_lock_o

ps *)0xfc4950, pr_poollist =3D {sqe_next =3D (struct pool *)0x1089c40}, pr_=
emptypag
es =3D {tqh_first =3D (struct pool_page_header *)0xc0000001449f7af0, tqh_la=
st =3D 0xc
000000142a861d8}, pr_fullpages =3D {tqh_first =3D (struct pool_page_header =
*)0xc000
00003e3bbd20, tqh_last =3D 0xc00000014d3f9248}, pr_partpages =3D {tqh_first=
 =3D (stru
ct pool_page_header *)0xc00000003c3e9250, tqh_last =3D 0xc00000014a4e4d28},=
 pr_cu
rpage =3D (struct pool_page_header *)0xc00000014a4e4d28, pr_size =3D 2048, =
pr_minit
ems =3D 10, pr_minpages =3D 5, pr_maxpages =3D 8, pr_npages =3D 17150, pr_i=
temsperpage =3D
 2, pr_slack =3D 0, pr_nitems =3D 34300, pr_nout =3D 34255, pr_hardlimit =
=3D 4294967295
, pr_serial =3D 13, pr_pgsize =3D 4096, pr_pgmask =3D 18446744073709547520,=
 pr_alloc =3D

 (struct pool_allocator *)0xfe9b40, pr_wchan =3D (const unsigned char *)0xe=
e10ef,
 pr_flags =3D 0, pr_ipl =3D 7, pr_phtree =3D {rbh_root =3D {rbt_root =3D (s=
truct rb_entry
 *)0xc00000013f618a08}}, pr_cache =3D (struct cpumem *)0x0, pr_cache_magic =
=3D [0,0
], pr_cache_lock =3D {prl_mtx =3D {mtx_owner =3D (void *)0x0, mtx_wantipl =
=3D 0, mtx_ol
dipl =3D 0}, prl_rwlock =3D {rwl_owner =3D 0, rwl_name =3D (const unsigned =
char *)0x0}}
, pr_cache_lists =3D {tqh_first =3D (struct pool_cache_item *)0x0, tqh_last=
 =3D 0x0},
 pr_cache_nitems =3D 0, pr_cache_items =3D 0, pr_cache_contention =3D 0, pr=
_cache_con
tention_prev =3D 0, pr_cache_timestamp =3D 0, pr_cache_ngc =3D 0, pr_cache_=
nout =3D 0, p
r_align =3D 8, pr_maxcolors =3D 1, pr_phoffset =3D 0, pr_hardlimit_warning =
=3D (const u
nsigned char *)0x0, pr_hardlimit_ratecap =3D {tv_sec =3D 0, tv_usec =3D 0},=
 pr_hardli

mit_warning_last =3D {tv_sec =3D 0, tv_usec =3D 0}, pr_requests_lock =3D {p=
rl_mtx =3D {mt
x_owner =3D (void *)0x0, mtx_wantipl =3D 7, mtx_oldipl =3D 0}, prl_rwlock =
=3D {rwl_owne
r =3D 0, rwl_name =3D (const unsigned char *)0x700000000}}, pr_requests =3D=
 {tqh_firs
t =3D (struct pool_request *)0x0, tqh_last =3D 0x1089a40}, pr_requesting =
=3D 0, pr_ng

et =3D 147054103, pr_nfail =3D 0, pr_nput =3D 147019848, pr_npagealloc =3D =
6817420, pr_
npagefree =3D 6800270, pr_hiwat =3D 20556, pr_nidle =3D 17, pr_crange =3D (=
const kmem_p

a_mode *)0xfc60b0}


ddb{4}> show struct pool pmap_pmap_pool

struct pmap_pmap_pool at 0x1089c40 (424 bytes) {pr_lock =3D {prl_mtx =3D {m=
tx_owner
 =3D (void *)0x0, mtx_wantipl =3D 7, mtx_oldipl =3D 0}, prl_rwlock =3D {rwl=
_owner =3D 0, r

wl_name =3D (const unsigned char *)0x700000000}}, pr_lock_ops =3D (const po=
ol_lock_
ops *)0xfc4950, pr_poollist =3D {sqe_next =3D (struct pool *)0x104b5c0}, pr=
_emptypa

ges =3D {tqh_first =3D (struct pool_page_header *)0xc00000014ef78f90, tqh_l=
ast =3D 0x
c00000014ef78f90}, pr_fullpages =3D {tqh_first =3D (struct pool_page_header=
 *)0x0, t
qh_last =3D 0x1089c70}, pr_partpages =3D {tqh_first =3D (struct pool_page_h=
eader *)0x
c00000003e3aef90, tqh_last =3D 0xc000000149c6ef90}, pr_curpage =3D (struct =
pool_pag
e_header *)0xc00000003e3aef90, pr_size =3D 48, pr_minitems =3D 2, pr_minpag=
es =3D 1, p
r_maxpages =3D 8, pr_npages =3D 3, pr_itemsperpage =3D 83, pr_slack =3D 0, =
pr_nitems =3D 2
49, pr_nout =3D 138, pr_hardlimit =3D 4294967295, pr_serial =3D 12, pr_pgsi=
ze =3D 4096,
 pr_pgmask =3D 18446744073709547520, pr_alloc =3D (struct pool_allocator *)=
0xfe9b40
, pr_wchan =3D (const unsigned char *)0xe91044, pr_flags =3D 0, pr_ipl =3D =
7, pr_phtr
ee =3D {rbh_root =3D {rbt_root =3D (struct rb_entry *)0x0}}, pr_cache =3D (=
struct cpume
m *)0x0, pr_cache_magic =3D [0,0], pr_cache_lock =3D {prl_mtx =3D {mtx_owne=
r =3D (void *
)0x0, mtx_wantipl =3D 0, mtx_oldipl =3D 0}, prl_rwlock =3D {rwl_owner =3D 0=
, rwl_name =3D
 (const unsigned char *)0x0}}, pr_cache_lists =3D {tqh_first =3D (struct po=
ol_cache
_item *)0x0, tqh_last =3D 0x0}, pr_cache_nitems =3D 0, pr_cache_items =3D 0=
, pr_cache
_contention =3D 0, pr_cache_contention_prev =3D 0, pr_cache_timestamp =3D 0=
, pr_cache
_ngc =3D 0, pr_cache_nout =3D 0, pr_align =3D 8, pr_maxcolors =3D 1, pr_pho=
ffset =3D 3984
, pr_hardlimit_warning =3D (const unsigned char *)0x0, pr_hardlimit_ratecap=
 =3D {tv
_sec =3D 0, tv_usec =3D 0}, pr_hardlimit_warning_last =3D {tv_sec =3D 0, tv=
_usec =3D 0}, p
r_requests_lock =3D {prl_mtx =3D {mtx_owner =3D (void *)0x0, mtx_wantipl =
=3D 7, mtx_old
ipl =3D 0}, prl_rwlock =3D {rwl_owner =3D 0, rwl_name =3D (const unsigned c=
har *)0x7000
00000}}, pr_requests =3D {tqh_first =3D (struct pool_request *)0x0, tqh_las=
t =3D 0x10
89d90}, pr_requesting =3D 0, pr_nget =3D 1113457, pr_nfail =3D 0, pr_nput =
=3D 1113319, p
r_npagealloc =3D 3, pr_npagefree =3D 0, pr_hiwat =3D 3, pr_nidle =3D 1, pr_=
crange =3D (co
nst kmem_pa_mode *)0xfc60b0}

ddb{4}>

On Wed, Jun 5, 2024 at 12:16=E2=80=AFPM Miod Vallat <[email protected]> wrote:
>
> > There's a corruption...
> >
> > > ddb{7}> show panic
> > >  cpu6: kernel diagnostic assertion "((flags & PGO_LOCKED) !=3D 0 && r=
w_lock_held(
> > > uobj->vmobjlock)) || (flags & PGO_LOCKED) =3D=3D 0" failed: file "/sy=
s/uvm/uvm_vnod
> > > e.c", line 953
> > >
> > > *cpu7: assertwaitok: non-zero mutex count: 1
> > > ddb{7}> trace
> > > panic+0x134
> > > assertwaitok+0xf8
> > > mi_switch+0x5c
> > > sleep_finish+0x160
> > > rw_enter+0x1cc
> > > vm_map_lock_read_ln+0x38
> > > uvmfault_lookup+0x114
> > > uvm_fault_check+0x68
> > > uvm_fault+0x12c
> > > trap+0x7a4
> > > trapagain+0x4
> > > --- trap (type 0x300) ---
> > > phtree_RBT_COMPARE+0x28
> > > pool_do_put+0x94
> > > pool_put+0x94
> >            ^^^^
> > ...inside this pool.  Which of the 3 is it?  Can someone with a ppc64
> > figure out?
>
> It's pmap_vp_pool.