Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Aug 2013 13:20:17 +0000 (UTC)
From:      Davide Italiano <davide@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r254655 - projects/umtx/sys/kern
Message-ID:  <201308221320.r7MDKH4h093265@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davide
Date: Thu Aug 22 13:20:17 2013
New Revision: 254655
URL: http://svnweb.freebsd.org/changeset/base/254655

Log:
  Add hooks for process_exit/process_exec so taht schedctl structures
  are deallocated (avoiding a leakage). This rely on EVENTHANDLER so we
  need to push forward the time when schedctl_init() is called during
  boot process.

Modified:
  projects/umtx/sys/kern/kern_schedctl.c

Modified: projects/umtx/sys/kern/kern_schedctl.c
==============================================================================
--- projects/umtx/sys/kern/kern_schedctl.c	Thu Aug 22 12:49:28 2013	(r254654)
+++ projects/umtx/sys/kern/kern_schedctl.c	Thu Aug 22 13:20:17 2013	(r254655)
@@ -26,6 +26,8 @@
 
 #include <sys/param.h>
 #include <sys/kernel.h>
+#include <sys/event.h>
+#include <sys/eventhandler.h>
 #include <sys/lock.h>
 #include <sys/mutex.h>
 #include <sys/proc.h>
@@ -59,6 +61,7 @@ static size_t	bitmap_len;		/* # of bits 
  */
 int	schedctl(struct thread *td, struct schedctl_args *uap);
 void	schedctl_thread_exit(struct thread *td);
+void	schedctl_proc_exit(void);
 
 static int
 schedctl_alloc_page(struct proc *p, shpage_t **ret)
@@ -192,6 +195,31 @@ schedctl_init(void)
 	bitmap_len = avail_pagesize / sizeof(shstate_t);
 	shpage_zone = uma_zcreate("schedctl structures", sizeof(shpage_t), NULL,
 	    NULL, NULL, NULL, 0, 0);
+	EVENTHANDLER_REGISTER(process_exit, schedctl_proc_exit, NULL,
+	    EVENTHANDLER_PRI_ANY);
+	EVENTHANDLER_REGISTER(process_exec, schedctl_proc_exit, NULL,
+	    EVENTHANDLER_PRI_ANY);
+}
+
+void
+schedctl_proc_exit(void)
+{
+	struct proc *p;
+	shpage_t *sh_pg;
+	vm_map_t map;
+
+	printf("ping \n");
+	p = curthread->td_proc;
+	map = &p->p_vmspace->vm_map;
+	SLIST_FOREACH(sh_pg, &(p->p_shpg), pg_next) {
+		vm_map_remove(map, sh_pg->usraddr,
+		    sh_pg->usraddr + PAGE_SIZE);
+		pmap_qremove(sh_pg->pageaddr, 1);
+		kva_free(sh_pg->pageaddr, PAGE_SIZE);
+		vm_object_deallocate(sh_pg->shared_page_obj);
+		SLIST_REMOVE(&(p->p_shpg), sh_pg, page_shared, pg_next);
+		uma_zfree(shpage_zone, sh_pg);
+	}
 }
 
 /*
@@ -232,6 +260,6 @@ schedctl_thread_exit(struct thread *td)
 }
 
 /*
- * XXX: SI_SUB_KMEM is the right place to call schedctl_init?
+ * XXX: SI_SUB_SYSCALLS is the right place to call schedctl_init?
  */
-SYSINIT(schedctl, SI_SUB_KMEM, SI_ORDER_ANY, schedctl_init, NULL);
+SYSINIT(schedctl, SI_SUB_SYSCALLS, SI_ORDER_ANY, schedctl_init, NULL);



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