Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Aug 2001 13:51:29 -0700 (PDT)
From:      Matt Dillon <dillon@earth.backplane.com>
To:        Steve Shorter <steve@nomad.tor.lets.net>
Cc:        freebsd-stable@FreeBSD.ORG
Subject:   Re: VM exhaustion and kernel hangs
Message-ID:  <200108212051.f7LKpTK66953@earth.backplane.com>
References:  <20010821115724.A2562@nomad.lets.net> <200108211820.f7LIKZf65278@earth.backplane.com> <20010821144406.A2733@nomad.lets.net> <200108211907.f7LJ7DK65902@earth.backplane.com> <20010821162641.B2788@nomad.lets.net>

next in thread | previous in thread | raw e-mail | index | archive | help

:
:On Tue, Aug 21, 2001 at 12:07:13PM -0700, Matt Dillon wrote:
:> 
:>     Also, just to throw this out... swap over NFS is not actually all that
:>     bad a thing to do, especially with FreeBSD-4.x and modern switched
:>     100BaseTX ethernet links.
:
:	That is a consideration.
:
:	Thanks for your help in this matter.
:
:I am still interested in making a patch based on diffs from 
:4.3-STABLE and 4.3-SECURITY. Would this be easy to do or have there been a
:lot of kernel changes that affect this issue. Is it good enough to look
:at killproc() and vm_pagout.c or is there more to it than that.
:
:	thanx - steve 

    Sure.  If you are comfortable building from a mod'd source tree, here
    is the relevant log and diff set.  It should be very easy to patch in.

						-Matt


dillon      2001/06/13 00:26:59 PDT

  Modified files:        (Branch: RELENG_4)
    sys/vm               vm_map.c vm_map.h vm_pageout.c 
  Log:
  MFC the two out-of-swap fixes (kill the correct process and start blasting
  away at processes a little earlier, before the machine begins to lockup)
  
  Revision   Changes    Path
  1.187.2.9  +36 -1     src/sys/vm/vm_map.c
  1.54.2.2   +2 -1      src/sys/vm/vm_map.h
  1.151.2.8  +9 -4      src/sys/vm/vm_pageout.c


    
Index: vm_map.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_map.c,v
retrieving revision 1.187.2.8
retrieving revision 1.187.2.9
diff -u -r1.187.2.8 -r1.187.2.9
--- vm_map.c	2001/03/14 07:05:05	1.187.2.8
+++ vm_map.c	2001/06/13 07:26:58	1.187.2.9
@@ -61,7 +61,7 @@
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
  *
- * $FreeBSD: src/sys/vm/vm_map.c,v 1.187.2.8 2001/03/14 07:05:05 dillon Exp $
+ * $FreeBSD: src/sys/vm/vm_map.c,v 1.187.2.9 2001/06/13 07:26:58 dillon Exp $
  */
 
 /*
@@ -218,6 +218,41 @@
 		zfree(vmspace_zone, vm);
 	}
 }
+
+/*
+ * vmspace_swap_count() - count the approximate swap useage in pages for a
+ *			  vmspace.
+ *
+ *	Swap useage is determined by taking the proportional swap used by
+ *	VM objects backing the VM map.  To make up for fractional losses,
+ *	if the VM object has any swap use at all the associated map entries
+ *	count for at least 1 swap page.
+ */
+int
+vmspace_swap_count(struct vmspace *vmspace)
+{
+	vm_map_t map = &vmspace->vm_map;
+	vm_map_entry_t cur;
+	int count = 0;
+
+	for (cur = map->header.next; cur != &map->header; cur = cur->next) {
+		vm_object_t object;
+
+		if ((cur->eflags & MAP_ENTRY_IS_SUB_MAP) == 0 &&
+		    (object = cur->object.vm_object) != NULL &&
+		    object->type == OBJT_SWAP
+		) {
+			int n = (cur->end - cur->start) / PAGE_SIZE;
+
+			if (object->un_pager.swp.swp_bcount) {
+				count += object->un_pager.swp.swp_bcount *
+				    SWAP_META_PAGES * n / object->size + 1;
+			}
+		}
+	}
+	return(count);
+}
+
 
 /*
  *	vm_map_create:
Index: vm_map.h
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_map.h,v
retrieving revision 1.54.2.1
retrieving revision 1.54.2.2
diff -u -r1.54.2.1 -r1.54.2.2
--- vm_map.h	2001/03/14 07:05:06	1.54.2.1
+++ vm_map.h	2001/06/13 07:26:58	1.54.2.2
@@ -61,7 +61,7 @@
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
  *
- * $FreeBSD: src/sys/vm/vm_map.h,v 1.54.2.1 2001/03/14 07:05:06 dillon Exp $
+ * $FreeBSD: src/sys/vm/vm_map.h,v 1.54.2.2 2001/06/13 07:26:58 dillon Exp $
  */
 
 /*
@@ -375,6 +375,7 @@
 void vm_freeze_copyopts __P((vm_object_t, vm_pindex_t, vm_pindex_t));
 int vm_map_stack __P((vm_map_t, vm_offset_t, vm_size_t, vm_prot_t, vm_prot_t, int));
 int vm_map_growstack __P((struct proc *p, vm_offset_t addr));
+int vmspace_swap_count __P((struct vmspace *vmspace));
 
 #endif
 #endif				/* _VM_MAP_ */
Index: vm_pageout.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_pageout.c,v
retrieving revision 1.151.2.7
retrieving revision 1.151.2.8
diff -u -r1.151.2.7 -r1.151.2.8
--- vm_pageout.c	2000/12/30 01:51:12	1.151.2.7
+++ vm_pageout.c	2001/06/13 07:26:58	1.151.2.8
@@ -65,7 +65,7 @@
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
  *
- * $FreeBSD: src/sys/vm/vm_pageout.c,v 1.151.2.7 2000/12/30 01:51:12 dillon Exp $
+ * $FreeBSD: src/sys/vm/vm_pageout.c,v 1.151.2.8 2001/06/13 07:26:58 dillon Exp $
  */
 
 /*
@@ -1094,10 +1094,14 @@
 	}
 
 	/*
-	 * make sure that we have swap space -- if we are low on memory and
-	 * swap -- then kill the biggest process.
+	 * If we are out of swap and were not able to reach our paging
+	 * target, kill the largest process.
 	 */
+	if ((vm_swap_size < 64 && vm_page_count_min()) ||
+	    (swap_pager_full && vm_paging_target() > 0)) {
+#if 0
 	if ((vm_swap_size < 64 || swap_pager_full) && vm_page_count_min()) {
+#endif
 		bigproc = NULL;
 		bigsize = 0;
 		for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) {
@@ -1119,7 +1123,8 @@
 			/*
 			 * get the process size
 			 */
-			size = vmspace_resident_count(p->p_vmspace);
+			size = vmspace_resident_count(p->p_vmspace) +
+				vmspace_swap_count(p->p_vmspace);
 			/*
 			 * if the this process is bigger than the biggest one
 			 * remember it.



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




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