[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;
  }
  
  /*