Subject: Re: Extreme slowdown
To: Reinoud Zandijk <imago@kabel065011.kabel.utwente.nl>
From: Richard Earnshaw <rearnsha@arm.com>
List: port-arm32
Date: 02/24/2001 16:29:58
>
> Have any of you seen this behaviour before? or have a clue as to where to
> find it ? I suspect its in the vidcconsole and/or pmap for i've seen some
> DIAGNOSTIC stuff there that might take this time too.
A profiling kernel might help.
There are some nasty diagnostics in pmap.c, which should probably be moved
to DEBUG.
arm32/pmap.c:
#ifdef DIAGNOSTIC
for (npv = pv; npv; npv = npv->pv_next)
if (pmap == npv->pv_pmap && va == npv->pv_va)
panic("pmap_enter_pv: already in pv_tab pv
%p: %
08lx/%p/%p",
pv, pv->pv_va, pv->pv_pmap, pv->
pv_next);
#endif
...
[there seem to be 3 cases like this one, note it uses vm_physseg_find,
which is horrendously expensive (does a binary search)!]
#ifdef DIAGNOSTIC
int bank, off;
if ((bank = vm_physseg_find(atop(pa), &off)) != -1) {
struct pv_entry *pv;
pv = &vm_physmem[bank].pmseg.pvent[off];
if (pv->pv_pmap != NULL)
panic("pmap_kenter_pa: %08lx multiply mapped\n",
pa);
}
#endif
R.