rare pmap.c bug
Olivier Houchard
mlfbsd at ci0.org
Sat Nov 17 09:19:31 PST 2007
On Wed, Nov 14, 2007 at 04:26:57PM -0600, Mark Tinguely wrote:
>
> I think there is a small bug in the allocation of the L1 domain numbers ARM
> pmap.c BUT it is my guess that no one should ever see in real life.
> why? because you have to reuse the L1 9 times AT ONE TIME to trigger the
> bug. My gut thinks reusing the L1 twice AT ONE TIME is rare.
>
> pmap_init_l1() allocates the array l1->l1_domain_free to equal:
>
> {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0 }
> l1->l1_domain_free[15] is the initial value.
>
> l1->l1_domain_first = 1
>
> pmap_alloc_l1() allocated the odd domain numbers.
>
> domain = l1->l1_domain_first (1)
> l1->l1_domain_first = l1->l1_domain_free[domain] (3)
>
> next pmap_alloc_l1() **without calling pmap_free_l1()**:
>
> domain = l1->l1_domain_first (3)
> l1->l1_domain_first = l1->l1_domain_free[domain] (5)
>
> next pmap_alloc_l1() **without calling pmap_free_l1()**:
>
> domain = l1->l1_domain_first (5)
> l1->l1_domain_first = l1->l1_domain_free[domain] (7)
>
> ...
>
> domain = l1->l1_domain_first (15)
> l1->l1_domain_first = l1->l1_domain_free[domain] (0)
>
> on the 9th pmap_alloc_l1() **without calling pmap_free_l1()**:
>
> domain = l1->l1_domain_first (0) <- Kernel domain!
> l1->l1_domain_first = l1->l1_domain_free[domain] (2)
>
> It is extremely unlikely that people are running enough processes on an ARM
> machine to ever trigger the bug. A simple fix would be to increment the
> l1->l1_domain_free array by 1. But the 15th call to pmap_alloc_l1() will
> leave the l1->l1_domain_first wrong with could cause problems with the next
> pmap_free_l1(). A zero value could be given a special meaning to pmap_free_l1().
>
> I find it even more interesting idea to just pull the preallocated L1s out;
> preallocate a couple L1 in an idleloop for perfomance; implement pmap_copy()
> to decrease page faults after a fork ...
>
Hi,
Indeed it can be a problem. I'll see how easy it would be to allocate the L1
tables when we need it.
Thanks for reporting !
Olivier
More information about the freebsd-arm
mailing list