Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Aug 2000 15:50:04 -0700 (PDT)
From:      Tor.Egge@fast.no
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/20609: panic: vm_fault: fault on nofault entry, addr: cc4b3000 
Message-ID:  <200008152250.PAA20603@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/20609; it has been noted by GNATS.

From: Tor.Egge@fast.no
To: dillon@freebsd.org
Cc: freebsd-gnats-submit@freebsd.org
Subject: Re: kern/20609: panic: vm_fault: fault on nofault entry, addr: cc4b3000 
Date: Wed, 16 Aug 2000 00:43:05 +0200

 Here is a suggested fix.  Please review.
 
 Index: sys/i386/i386/machdep.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/i386/i386/machdep.c,v
 retrieving revision 1.401
 diff -u -r1.401 machdep.c
 --- sys/i386/i386/machdep.c	2000/08/13 05:17:46	1.401
 +++ sys/i386/i386/machdep.c	2000/08/15 22:39:49
 @@ -379,6 +379,7 @@
  			(nbuf*BKVASIZE) + (nswbuf*MAXPHYS) + pager_map_size);
  	buffer_map = kmem_suballoc(clean_map, &buffer_sva, &buffer_eva,
  				(nbuf*BKVASIZE));
 +	buffer_map->system_map = 1;
  	pager_map = kmem_suballoc(clean_map, &pager_sva, &pager_eva,
  				(nswbuf*MAXPHYS) + pager_map_size);
  	pager_map->system_map = 1;
 Index: sys/vm/vm_map.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/vm/vm_map.c,v
 retrieving revision 1.190
 diff -u -r1.190 vm_map.c
 --- sys/vm/vm_map.c	2000/05/14 18:46:40	1.190
 +++ sys/vm/vm_map.c	2000/08/15 22:39:49
 @@ -271,7 +271,10 @@
  	vm_map_t map;
  	vm_map_entry_t entry;
  {
 -	zfree((map->system_map || !mapentzone) ? kmapentzone : mapentzone, entry);
 +	if (map->system_map || !mapentzone)
 +		zfreei(kmapentzone, entry);
 +	else
 +		zfree(mapentzone, entry);
  }
  
  /*
 @@ -286,8 +289,10 @@
  {
  	vm_map_entry_t new_entry;
  
 -	new_entry = zalloc((map->system_map || !mapentzone) ? 
 -		kmapentzone : mapentzone);
 +	if (map->system_map || !mapentzone)
 +		new_entry = zalloci(kmapentzone);
 +	else
 +		new_entry = zalloc(mapentzone);
  	if (new_entry == NULL)
  	    panic("vm_map_entry_create: kernel resources exhausted");
  	return(new_entry);
 @@ -776,7 +781,7 @@
  	 * put this improvement.
  	 */
  
 -	if (entry->object.vm_object == NULL) {
 +	if (entry->object.vm_object == NULL && !map->system_map) {
  		vm_object_t object;
  		object = vm_object_allocate(OBJT_DEFAULT,
  				atop(entry->end - entry->start));
 @@ -832,7 +837,7 @@
  	 * put this improvement.
  	 */
  
 -	if (entry->object.vm_object == NULL) {
 +	if (entry->object.vm_object == NULL && !map->system_map) {
  		vm_object_t object;
  		object = vm_object_allocate(OBJT_DEFAULT,
  				atop(entry->end - entry->start));
 @@ -1287,7 +1292,8 @@
  					    atop(entry->end - entry->start));
  					entry->eflags &= ~MAP_ENTRY_NEEDS_COPY;
  
 -				} else if (entry->object.vm_object == NULL) {
 +				} else if (entry->object.vm_object == NULL &&
 +					   !map->system_map) {
  
  					entry->object.vm_object =
  					    vm_object_allocate(OBJT_DEFAULT,
 @@ -1477,7 +1483,8 @@
  						    &entry->offset,
  						    atop(entry->end - entry->start));
  						entry->eflags &= ~MAP_ENTRY_NEEDS_COPY;
 -					} else if (entry->object.vm_object == NULL) {
 +					} else if (entry->object.vm_object == NULL &&
 +						   !map->system_map) {
  						entry->object.vm_object =
  						    vm_object_allocate(OBJT_DEFAULT,
  							atop(entry->end - entry->start));
 @@ -2604,7 +2611,8 @@
  	/*
  	 * Create an object if necessary.
  	 */
 -	if (entry->object.vm_object == NULL) {
 +	if (entry->object.vm_object == NULL &&
 +	    !map->system_map) {
  		if (vm_map_lock_upgrade(map)) 
  			goto RetryLookup;
  
 Index: sys/vm/vm_fault.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/vm/vm_fault.c,v
 retrieving revision 1.112
 diff -u -r1.112 vm_fault.c
 --- sys/vm/vm_fault.c	2000/05/29 22:40:54	1.112
 +++ sys/vm/vm_fault.c	2000/08/15 22:39:49
 @@ -796,6 +796,7 @@
  		 * any swap backing since the page is now dirty.
  		 */
  		if (fault_flags & VM_FAULT_DIRTY) {
 +			int s;
  			if (fs.entry->eflags & MAP_ENTRY_NOSYNC) {
  				if (fs.m->dirty == 0)
  					vm_page_flag_set(fs.m, PG_NOSYNC);
 @@ -803,7 +804,9 @@
  				vm_page_flag_clear(fs.m, PG_NOSYNC);
  			}
  			vm_page_dirty(fs.m);
 +			s = splvm();
  			vm_pager_page_unswapped(fs.m);
 +			splx(s);
  		}
  	}
  
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200008152250.PAA20603>