svn commit: r243342 - head/sys/kern

Konstantin Belousov kib at FreeBSD.org
Tue Nov 20 15:45:49 UTC 2012


Author: kib
Date: Tue Nov 20 15:45:48 2012
New Revision: 243342
URL: http://svnweb.freebsd.org/changeset/base/243342

Log:
  Schedule garbage collection run for the in-flight rights passed over
  the unix domain sockets to the next tick, coalescing the serial calls
  until the collection fires.  The thought is that more work for the
  collector could arise in the near time, allowing to clean more and not
  spend too much CPU on repeated collection when there is no garbage.
  
  Currently the collection task is fired immediately upon unix domain
  socket close if there are any rights in flight, which caused excessive
  CPU usage and too long blocking of the threads waiting for
  unp_list_lock and unp_link_rwlock in write mode.
  
  Robert noted that it would be nice if we could find some heuristic by
  which we decide whether to run GC a bit more quickly.  E.g., if the
  number of UNIX domain sockets is close to its resource limit, but not
  quite.
  
  Reported and tested by:	Markus Gebert <markus.gebert at hostpoint.ch>
  Reviewed by:	rwatson
  MFC after:	2 weeks

Modified:
  head/sys/kern/uipc_usrreq.c

Modified: head/sys/kern/uipc_usrreq.c
==============================================================================
--- head/sys/kern/uipc_usrreq.c	Tue Nov 20 15:33:48 2012	(r243341)
+++ head/sys/kern/uipc_usrreq.c	Tue Nov 20 15:45:48 2012	(r243342)
@@ -131,7 +131,7 @@ static const struct sockaddr	sun_noname 
  * reentrance in the UNIX domain socket, file descriptor, and socket layer
  * code.  See unp_gc() for a full description.
  */
-static struct task	unp_gc_task;
+static struct timeout_task unp_gc_task;
 
 /*
  * The close of unix domain sockets attached as SCM_RIGHTS is
@@ -672,7 +672,7 @@ uipc_detach(struct socket *so)
 	if (vp)
 		vrele(vp);
 	if (local_unp_rights)
-		taskqueue_enqueue(taskqueue_thread, &unp_gc_task);
+		taskqueue_enqueue_timeout(taskqueue_thread, &unp_gc_task, -1);
 }
 
 static int
@@ -1784,7 +1784,7 @@ unp_init(void)
 	LIST_INIT(&unp_shead);
 	LIST_INIT(&unp_sphead);
 	SLIST_INIT(&unp_defers);
-	TASK_INIT(&unp_gc_task, 0, unp_gc, NULL);
+	TIMEOUT_TASK_INIT(taskqueue_thread, &unp_gc_task, 0, unp_gc, NULL);
 	TASK_INIT(&unp_defer_task, 0, unp_process_defers, NULL);
 	UNP_LINK_LOCK_INIT();
 	UNP_LIST_LOCK_INIT();


More information about the svn-src-head mailing list