Ian Kent d34b9e
autofs-5.0.5 - remove state machine timed wait
Ian Kent d34b9e
Ian Kent d34b9e
From: Ian Kent <raven@themaw.net>
Ian Kent d34b9e
Ian Kent d34b9e
We are seeing a problem using timed waits when running under KVM.
Ian Kent d34b9e
Ian Kent d34b9e
Using timed condition waits in the state machine (and in some other
Ian Kent d34b9e
places) has been used because of observed task throughput problems
Ian Kent d34b9e
in the past. Also, we've seen condition waits not reacting to signals
Ian Kent d34b9e
occassionaly.
Ian Kent d34b9e
Ian Kent d34b9e
But now we are seeing problems with the setup of the wait time within
Ian Kent d34b9e
KVM VMs causing the condition wait to go into a tight loop using
Ian Kent d34b9e
excessive CPU.
Ian Kent d34b9e
Ian Kent d34b9e
Changing the state queue handler to not use timed waits appears to
Ian Kent d34b9e
not have the previously observed throughput problems, hopefully we
Ian Kent d34b9e
won't see lost signals either.
Ian Kent d34b9e
---
Ian Kent d34b9e
Ian Kent d34b9e
 CHANGELOG      |    1 +
Ian Kent d34b9e
 daemon/state.c |   30 +++++++-----------------------
Ian Kent d34b9e
 2 files changed, 8 insertions(+), 23 deletions(-)
Ian Kent d34b9e
Ian Kent d34b9e
Ian Kent d34b9e
--- autofs-5.0.5.orig/CHANGELOG
Ian Kent d34b9e
+++ autofs-5.0.5/CHANGELOG
Ian Kent d34b9e
@@ -43,6 +43,7 @@
Ian Kent d34b9e
 - fix mapent becomes negative during lookup.
Ian Kent d34b9e
 - check each dc server individually.
Ian Kent d34b9e
 - fix negative cache included map lookup.
Ian Kent d34b9e
+- remove state machine timed wait.
Ian Kent d34b9e
 
Ian Kent d34b9e
 03/09/2009 autofs-5.0.5
Ian Kent d34b9e
 -----------------------
Ian Kent d34b9e
--- autofs-5.0.5.orig/daemon/state.c
Ian Kent d34b9e
+++ autofs-5.0.5/daemon/state.c
Ian Kent d34b9e
@@ -197,11 +197,11 @@ void expire_cleanup(void *arg)
Ian Kent d34b9e
 		}
Ian Kent d34b9e
 	}
Ian Kent d34b9e
 
Ian Kent d34b9e
+	st_set_done(ap);
Ian Kent d34b9e
+
Ian Kent d34b9e
 	if (next != ST_INVAL)
Ian Kent d34b9e
 		__st_add_task(ap, next);
Ian Kent d34b9e
 
Ian Kent d34b9e
-	st_set_done(ap);
Ian Kent d34b9e
-
Ian Kent d34b9e
 	st_mutex_unlock();
Ian Kent d34b9e
 
Ian Kent d34b9e
 	return;
Ian Kent d34b9e
@@ -332,11 +332,10 @@ static void do_readmap_cleanup(void *arg
Ian Kent d34b9e
 	st_mutex_lock();
Ian Kent d34b9e
 
Ian Kent d34b9e
 	ap->readmap_thread = 0;
Ian Kent d34b9e
-	st_ready(ap);
Ian Kent d34b9e
 	st_set_done(ap);
Ian Kent d34b9e
-
Ian Kent d34b9e
 	if (!ap->submount)
Ian Kent d34b9e
 		alarm_add(ap, ap->exp_runfreq);
Ian Kent d34b9e
+	st_ready(ap);
Ian Kent d34b9e
 
Ian Kent d34b9e
 	st_mutex_unlock();
Ian Kent d34b9e
 
Ian Kent d34b9e
@@ -1060,8 +1059,6 @@ static void *st_queue_handler(void *arg)
Ian Kent d34b9e
 {
Ian Kent d34b9e
 	struct list_head *head;
Ian Kent d34b9e
 	struct list_head *p;
Ian Kent d34b9e
-	struct timespec wait;
Ian Kent d34b9e
-	struct timeval now;
Ian Kent d34b9e
 	int status, ret;
Ian Kent d34b9e
 
Ian Kent d34b9e
 	st_mutex_lock();
Ian Kent d34b9e
@@ -1072,17 +1069,11 @@ static void *st_queue_handler(void *arg)
Ian Kent d34b9e
 		 * entry is added.
Ian Kent d34b9e
 		 */
Ian Kent d34b9e
 		head = &state_queue;
Ian Kent d34b9e
-		gettimeofday(&now, NULL);
Ian Kent d34b9e
-		wait.tv_sec = now.tv_sec + 1;
Ian Kent d34b9e
-		wait.tv_nsec = now.tv_usec * 1000;
Ian Kent d34b9e
 
Ian Kent d34b9e
 		while (list_empty(head)) {
Ian Kent d34b9e
-			status = pthread_cond_timedwait(&cond, &mutex, &wait);
Ian Kent d34b9e
-			if (status) {
Ian Kent d34b9e
-				if (status == ETIMEDOUT)
Ian Kent d34b9e
-					break;
Ian Kent d34b9e
+			status = pthread_cond_wait(&cond, &mutex);
Ian Kent d34b9e
+			if (status)
Ian Kent d34b9e
 				fatal(status);
Ian Kent d34b9e
-			}
Ian Kent d34b9e
 		}
Ian Kent d34b9e
 
Ian Kent d34b9e
 		p = head->next;
Ian Kent d34b9e
@@ -1108,18 +1099,11 @@ static void *st_queue_handler(void *arg)
Ian Kent d34b9e
 		}
Ian Kent d34b9e
 
Ian Kent d34b9e
 		while (1) {
Ian Kent d34b9e
-			gettimeofday(&now, NULL);
Ian Kent d34b9e
-			wait.tv_sec = now.tv_sec + 1;
Ian Kent d34b9e
-			wait.tv_nsec = now.tv_usec * 1000;
Ian Kent d34b9e
-
Ian Kent d34b9e
 			signaled = 0;
Ian Kent d34b9e
 			while (!signaled) {
Ian Kent d34b9e
-				status = pthread_cond_timedwait(&cond, &mutex, &wait);
Ian Kent d34b9e
-				if (status) {
Ian Kent d34b9e
-					if (status == ETIMEDOUT)
Ian Kent d34b9e
-						break;
Ian Kent d34b9e
+				status = pthread_cond_wait(&cond, &mutex);
Ian Kent d34b9e
+				if (status)
Ian Kent d34b9e
 					fatal(status);
Ian Kent d34b9e
-				}
Ian Kent d34b9e
 			}
Ian Kent d34b9e
 
Ian Kent d34b9e
 			head = &state_queue;