[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: options DIAGNOSTIC
>まあ、修正を入れるか入れないかの判断はお任せします ;-)
あう。:-)
pool にして問題が出るってことはないと思うんですが、pmreal をどう
しようか悩んでしまいます。pool を使うなら (powerpc では)常に
pmreal == pmap なので struct pcb から pmreal を抜いてしまうのが
正しいと思いますが、それだと将来もし malloc に戻ることがあったら
面倒で。
劇的な(%ぐらい)変化があればやっちゃうんですけどねー。
試してみた状態の差分も書いておきます。pool まわりは少し行をいれ
かえたこと以外は筒井さんのと同一です。
*** pmap.c.orig Mon Sep 25 00:26:34 2000
--- pmap.c Sun Oct 29 23:25:36 2000
***************
*** 33,38 ****
--- 33,39 ----
#include <sys/param.h>
#include <sys/malloc.h>
+ #include <sys/pool.h>
#include <sys/proc.h>
#include <sys/user.h>
#include <sys/queue.h>
***************
*** 56,61 ****
--- 57,63 ----
LIST_HEAD(pte_ovtab, pte_ovfl) *potable; /* Overflow entries for ptable */
struct pmap kernel_pmap_;
+ struct pool pmap_pmap_pool; /* memory pool for pmap structures */
int physmem;
static int npgs;
***************
*** 579,584 ****
--- 581,592 ----
attr += sz;
}
+ /*
+ * Initialize the pmap pool.
+ */
+ pool_init(&pmap_pmap_pool, sizeof(struct pmap), 0, 0, 0, "pmappl",
+ 0, pool_page_alloc_nointr, pool_page_free_nointr, M_VMPMAP);
+
pmap_initialized = 1;
splx(s);
}
***************
*** 605,611 ****
{
struct pmap *pm;
! pm = (struct pmap *)malloc(sizeof *pm, M_VMPMAP, M_WAITOK);
bzero((caddr_t)pm, sizeof *pm);
pmap_pinit(pm);
return pm;
--- 613,619 ----
{
struct pmap *pm;
! pm = pool_get(&pmap_pmap_pool, PR_WAITOK);
bzero((caddr_t)pm, sizeof *pm);
pmap_pinit(pm);
return pm;
***************
*** 656,662 ****
{
if (--pm->pm_refs == 0) {
pmap_release(pm);
! free((caddr_t)pm, M_VMPMAP);
}
}
--- 664,670 ----
{
if (--pm->pm_refs == 0) {
pmap_release(pm);
! pool_put(&pmap_pmap_pool, pm);
}
}
***************
*** 1414,1421 ****
--- 1422,1433 ----
*/
if (pcb->pcb_pm != pmap) {
pcb->pcb_pm = pmap;
+ #if 0
(void) pmap_extract(pmap_kernel(), (vaddr_t)pcb->pcb_pm,
(paddr_t *)&pcb->pcb_pmreal);
+ #else
+ pcb->pcb_pmreal = pcb->pcb_pm;
+ #endif
}
if (p == curproc) {
*** vm_machdep.c~ Tue Aug 22 03:46:04 2000
--- vm_machdep.c Sun Oct 29 23:20:05 2000
***************
*** 89,96 ****
--- 89,99 ----
*pcb = p1->p_addr->u_pcb;
pcb->pcb_pm = p2->p_vmspace->vm_map.pmap;
+ #if 0
(void) pmap_extract(pmap_kernel(), (vaddr_t)pcb->pcb_pm,
(paddr_t *)&pcb->pcb_pmreal);
+ #endif
+ pcb->pcb_pmreal = pcb->pcb_pm;
/*
* Setup the trap frame for the new process
***************
*** 139,146 ****
--- 142,152 ----
{
struct pcb *pcb = &p->p_addr->u_pcb;
+ #if 0
(void) pmap_extract(pmap_kernel(), (vaddr_t)pcb->pcb_pm,
(paddr_t *)&pcb->pcb_pmreal);
+ #endif
+ pcb->pcb_pmreal = pcb->pcb_pm;
}
/*