changeset 970:4574571f2d00

6337564 kcage_cageout() daemon thread hangs up when kernel_cage_enable=1
author vb70745
date Tue, 22 Nov 2005 13:37:40 -0800
parents d3e3a7657934
children 4c0e728a52f0
files usr/src/uts/common/os/mem_cage.c
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/os/mem_cage.c	Tue Nov 22 12:35:05 2005 -0800
+++ b/usr/src/uts/common/os/mem_cage.c	Tue Nov 22 13:37:40 2005 -0800
@@ -249,6 +249,7 @@
 pgcnt_t kcage_desfree;
 pgcnt_t kcage_minfree;
 pgcnt_t kcage_throttlefree;
+pgcnt_t	kcage_reserve;
 int kcage_maxwait = 10;	/* in seconds */
 
 /* when we use lp for kmem we start the cage at a higher initial value */
@@ -918,6 +919,7 @@
 	static pgcnt_t init_desfree;
 	static pgcnt_t init_minfree;
 	static pgcnt_t init_throttlefree;
+	static pgcnt_t init_reserve;
 
 	/* TODO: any reason to take more care than this with live editing? */
 	mutex_enter(&kcage_cageout_mutex);
@@ -929,11 +931,13 @@
 		init_desfree = kcage_desfree;
 		init_minfree = kcage_minfree;
 		init_throttlefree = kcage_throttlefree;
+		init_reserve = kcage_reserve;
 	} else {
 		kcage_lotsfree = init_lotsfree;
 		kcage_desfree = init_desfree;
 		kcage_minfree = init_minfree;
 		kcage_throttlefree = init_throttlefree;
+		kcage_reserve = init_reserve;
 	}
 
 	if (kcage_lotsfree == 0)
@@ -948,6 +952,9 @@
 	if (kcage_throttlefree == 0)
 		kcage_throttlefree = MAX(32, kcage_minfree / 2);
 
+	if (kcage_reserve == 0)
+		kcage_reserve = MIN(32, kcage_throttlefree / 2);
+
 	mutex_exit(&freemem_lock);
 	mutex_exit(&kcage_cageout_mutex);
 
@@ -1030,9 +1037,10 @@
 	}
 
 	/*
-	 * Don't throttle real-time threads.
+	 * Don't throttle real-time threads if kcage_freemem > kcage_reserve.
 	 */
-	if (DISP_PRIO(curthread) > maxclsyspri) {
+	if (DISP_PRIO(curthread) > maxclsyspri &&
+	    kcage_freemem > kcage_reserve) {
 		KCAGE_STAT_INCR(kct_exempt);	/* unprotected incr. */
 		return (KCT_CRIT);
 	}