Return to BSD News archive
Path: sserve!manuel.anu.edu.au!munnari.oz.au!sgiblab!darwin.sura.net!Sirius.dfn.de!math.fu-berlin.de!news.netmbx.de!Germany.EU.net!mcsun!sunic!dkuug!dkuug!flshub!phk
From: phk@data.fls.dk (Poul-Henning Kamp)
Newsgroups: comp.unix.bsd
Subject: [386bsd] PATCH: performance of kernel improved 16.6%
Message-ID: <1992Oct22.194403.19713@data.fls.dk>
Date: 22 Oct 92 19:44:03 GMT
Organization: FLS Data A/S, Valby, Copenhagen, Denmark.
Lines: 200
What is does:
=============
This patch cuts a quite large chunk of the processing in the kernel.
For some unfortunate reasons pmap.c is a focal point from a performance
point of view, this patch improves things a bit, but it is still the
most used routine in the kernel. The 16.6% is actually the percentage
'system-time' is cut when doing a make kernel on my machine.
What to do:
===========
Apply all of the applicable patches from the 'patch-kit'.
Apply patch with:
patch -d/ -p0 < patch_file
rebuild your kernel.
enjoy,
Poul-Henning
diff -r -C2 /ref/usr/src/sys.386bsd//i386/i386/pmap.c /usr/src/sys.386bsd//i386/i386/pmap.c
*** /ref/usr/src/sys.386bsd//i386/i386/pmap.c Sun Jul 12 16:27:37 1992
--- /usr/src/sys.386bsd//i386/i386/pmap.c Thu Oct 22 11:46:33 1992
***************
*** 537,551 ****
void
pmap_remove(pmap, sva, eva)
! register struct pmap *pmap;
! vm_offset_t sva, eva;
{
! register vm_offset_t pa, va;
! register pt_entry_t *pte;
! register pv_entry_t pv, npv;
! register int ix;
! pmap_t ptpmap;
! int *pde, s, bits;
! boolean_t firstpage = TRUE;
! boolean_t flushcache = FALSE;
#ifdef DEBUG
pt_entry_t opte;
--- 537,551 ----
void
pmap_remove(pmap, sva, eva)
! struct pmap *pmap;
! register vm_offset_t sva;
! register vm_offset_t eva;
{
! register pt_entry_t *ptp,*ptq;
! vm_offset_t va;
! vm_offset_t pa;
! pt_entry_t *pte;
! pv_entry_t pv, npv;
! int ix;
! int s, bits;
#ifdef DEBUG
pt_entry_t opte;
***************
*** 558,565 ****
return;
#ifdef DEBUG
remove_stats.calls++;
#endif
! for (va = sva; va < eva; va += PAGE_SIZE) {
/*
* Weed out invalid mappings.
--- 558,586 ----
return;
+ /* are we current address space or kernel? */
+ if (pmap->pm_pdir[PTDPTDI].pd_pfnum == PTDpde.pd_pfnum
+ || pmap == kernel_pmap)
+ ptp=PTmap;
+
+ /* otherwise, we are alternate address space */
+ else {
+ if (pmap->pm_pdir[PTDPTDI].pd_pfnum
+ != APTDpde.pd_pfnum) {
+ APTDpde = pmap->pm_pdir[PTDPTDI];
+ tlbflush();
+ }
+ ptp=APTmap;
+ }
#ifdef DEBUG
remove_stats.calls++;
#endif
!
! /* this is essential since we must check the PDE(sva) for precense */
! while (sva <= eva && !pmap_pde_v(pmap_pde(pmap, sva)))
! sva = (sva & PD_MASK) + (1<<PD_SHIFT);
! sva = i386_btop(sva);
! eva = i386_btop(eva);
!
! for (; sva < eva; sva++) {
/*
* Weed out invalid mappings.
***************
*** 567,579 ****
* always allocated, and in kernel virtual.
*/
! if (!pmap_pde_v(pmap_pde(pmap, va)))
! continue;
! pte = pmap_pte(pmap, va);
! if (pte == 0)
continue;
pa = pmap_pte_pa(pte);
! if (pa == 0)
! continue;
#ifdef DEBUG
opte = *pte;
--- 588,615 ----
* always allocated, and in kernel virtual.
*/
! ptq=ptp+sva;
! while((sva & 0x3ff) && !pmap_pte_pa(ptq))
! {
! if(++sva >= eva)
! return;
! ptq++;
! }
!
! if(!(sva & 0x3ff)) /* Only check once in a while */
! {
! if (!pmap_pde_v(pmap_pde(pmap, i386_ptob(sva))))
! {
! /* We can race ahead here, straight to next pde.. */
! sva = (sva & 0xffc00) + (1<<10) -1 ;
continue;
+ }
+ }
+ if(!pmap_pte_pa(ptp+sva))
+ continue;
+
+ pte = ptp + sva;
pa = pmap_pte_pa(pte);
! va = i386_ptob(sva);
#ifdef DEBUG
opte = *pte;
***************
*** 744,747 ****
--- 780,784 ----
int i386prot;
boolean_t firstpage = TRUE;
+ register pt_entry_t *ptp;
#ifdef DEBUG
***************
*** 759,762 ****
--- 796,813 ----
return;
+ /* are we current address space or kernel? */
+ if (pmap->pm_pdir[PTDPTDI].pd_pfnum == PTDpde.pd_pfnum
+ || pmap == kernel_pmap)
+ ptp=PTmap;
+
+ /* otherwise, we are alternate address space */
+ else {
+ if (pmap->pm_pdir[PTDPTDI].pd_pfnum
+ != APTDpde.pd_pfnum) {
+ APTDpde = pmap->pm_pdir[PTDPTDI];
+ tlbflush();
+ }
+ ptp=APTmap;
+ }
for (va = sva; va < eva; va += PAGE_SIZE) {
/*
***************
*** 773,778 ****
}
! pte = pmap_pte(pmap, va);
! if (pte == 0) panic("pmap_protect: cannot happen");
/*
--- 824,828 ----
}
! pte = ptp + i386_btop(va);
/*
diff -r -C2 /ref/usr/src/sys.386bsd//vm/vm_pager.c /usr/src/sys.386bsd//vm/vm_pager.c
*** /ref/usr/src/sys.386bsd//vm/vm_pager.c Tue Dec 24 14:24:23 1991
--- /usr/src/sys.386bsd//vm/vm_pager.c Thu Oct 22 11:42:03 1992
***************
*** 233,237 ****
m = PHYS_TO_VM_PAGE(pmap_extract(vm_map_pmap(pager_map), kva));
#endif
- pmap_remove(vm_map_pmap(pager_map), kva, kva + PAGE_SIZE);
kmem_free_wakeup(pager_map, kva, PAGE_SIZE);
#ifdef DEBUG
--- 233,236 ----
--
phk@data.fls.dk || $HOME
Poul-Henning Kamp ||
FLS DATA A/S || sweet
Phone: (+45) 36 18 12 35 ||