Subject: Re: kmem_map panic status...
To: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
From: David Brownlee <abs@netbsd.org>
List: port-sun3
Date: 11/03/2000 11:22:03
	If this works can we try to get it into 1.4.3?

                David/absolute
			       -- www.netbsd.org: A pmap for every occasion --


On Fri, 3 Nov 2000, Izumi Tsutsui wrote:

> In <20001103032403.F12144@radicalmedia.com>
> phiber@radicalmedia.com wrote:
>
> > So what's the current status of the kmem_map panic problem?  Seems like you
> > had tracked it down and were about to fix it.  Were you successful?  If so,
>
> I believe it was fixed.
>
> > would you mind making a diff available against 1.4.2 for those of us who don't
> > live life in the fast lane?
>
> Here it is. (Mostly same with diffs between rev 1.54 and 1.55)
> I have not tried on 1.4.x, but it should work.
> ---
> Izumi Tsutsui
> tsutsui@ceres.dti.ne.jp
>
>
> --- pmap.c.orig	Fri Nov  3 18:49:37 2000
> +++ pmap.c	Fri Nov  3 18:53:29 2000
> @@ -364,9 +364,11 @@
>  #define	NUM_KERN_PTES	(KVAS_SIZE >> MMU_TIC_SHIFT)
>
>  /*************************** MISCELANEOUS MACROS *************************/
> -#define PMAP_LOCK()	;	/* Nothing, for now */
> -#define PMAP_UNLOCK()	;	/* same. */
> -#define	NULL 0
> +#define pmap_lock(pmap) simple_lock(&pmap->pm_lock)
> +#define pmap_unlock(pmap) simple_unlock(&pmap->pm_lock)
> +#define pmap_add_ref(pmap) ++pmap->pm_refcount
> +#define pmap_del_ref(pmap) --pmap->pm_refcount
> +#define pmap_refcount(pmap) pmap->pm_refcount
>
>  static INLINE void *      mmu_ptov __P((vm_offset_t pa));
>  static INLINE vm_offset_t mmu_vtop __P((void * va));
> @@ -843,6 +845,7 @@
>  	kernel_pmap.pm_a_tmgr = NULL;
>  	kernel_pmap.pm_a_phys = kernAphys;
>  	kernel_pmap.pm_refcount = 1; /* always in use */
> +	simple_lock_init(&kernel_pmap.pm_lock);
>
>  	kernel_crp.rp_attr = MMU_LONG_DTE_LU | MMU_DT_LONG;
>  	kernel_crp.rp_addr = kernAphys;
> @@ -2560,6 +2563,8 @@
>  	bzero(pmap, sizeof(struct pmap));
>  	pmap->pm_a_tmgr = NULL;
>  	pmap->pm_a_phys = kernAphys;
> +	pmap->pm_refcount = 1;
> +	simple_lock_init(&pmap->pm_lock);
>  }
>
>  /* pmap_release				INTERFACE
> @@ -2622,9 +2627,9 @@
>  	if (pmap == NULL)
>  		return;
>
> -	/* pmap_lock(pmap); */
> -	pmap->pm_refcount++;
> -	/* pmap_unlock(pmap); */
> +	pmap_lock(pmap);
> +	pmap_add_ref(pmap);
> +	pmap_unlock(pmap);
>  }
>
>  /* pmap_dereference			INTERNAL
> @@ -2641,9 +2646,9 @@
>  	if (pmap == NULL)
>  		return 0;
>
> -	/* pmap_lock(pmap); */
> -	rtn = --pmap->pm_refcount;
> -	/* pmap_unlock(pmap); */
> +	pmap_lock(pmap);
> +	rtn = pmap_del_ref(pmap);
> +	pmap_unlock(pmap);
>
>  	return rtn;
>  }
>