Performance of SheevaPlug on 8-stable
Mark Tinguely
tinguely at casselton.net
Mon Mar 22 14:55:06 UTC 2010
On Mon, 08 Mar 2010 16:50:58, Grzegorz Bernacki said:
> This is probably caused by mechanism which turns of cache for shared pages.
> When I add applied following path:
>
> diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c
> index 390dc3c..d17c0cc 100644
> --- a/sys/arm/arm/pmap.c
> +++ b/sys/arm/arm/pmap.c
> @@ -1401,6 +1401,8 @@ pmap_fix_cache(struct vm_page *pg, pmap_t pm, vm_offset_t va)
> */
>
> TAILQ_FOREACH(pv, &pg->md.pv_list, pv_list) {
> + if (pv->pv_flags & PVF_EXEC)
> + return;
> /* generate a count of the pv_entry uses */
> if (pv->pv_flags & PVF_WRITE) {
> if (pv->pv_pmap == pmap_kernel())
>
> execution time of 'test' program is:
> mv78100-4# time ./test
> 5.000u 0.000s 0:05.40 99.8% 40+1324k 0+0io 0pf+0w
>
> and without this path is:
> mv78100-4# time ./test
> 295.000u 0.000s 4:56.01 99.7% 40+1322k 0+0io 0pf+0w
>
>
> I think we need to handle executable pages in different way.
>
> grzesiek
Good going Oliver and thank-you on the pmap_enter_pv kernel map patch Revision
205425.
Last week, before this patch, Maks Verver was so kind to put some statements
in the VM (vm_page_free_toq()) for the SheevaPlug because I could not cause
these paths with the Gumstix emulator. Maks, could you add to
vm_phys_free_pages():
if (m->md.pv_kva)
+ {
+ printf("vm_phys_free_pages: md.pv_kva 0x%08x\n", m->md.pv_kva);
m->md.pv_kva = 0;
+ }
Even on the Gumstix emulator with the current patch, pmap_fix_cache() still
has many executable pages that have both a kernel and user pv_entry. Looks
like something like the above patch is still needed.
--Mark Tinguely.
More information about the freebsd-arm
mailing list