From owner-svn-src-projects@FreeBSD.ORG Mon Aug 19 20:46:15 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 171C7DE5; Mon, 19 Aug 2013 20:46:15 +0000 (UTC) (envelope-from davide@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 05CE327D8; Mon, 19 Aug 2013 20:46:15 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7JKkEda034861; Mon, 19 Aug 2013 20:46:14 GMT (envelope-from davide@svn.freebsd.org) Received: (from davide@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7JKkEt7034858; Mon, 19 Aug 2013 20:46:14 GMT (envelope-from davide@svn.freebsd.org) Message-Id: <201308192046.r7JKkEt7034858@svn.freebsd.org> From: Davide Italiano Date: Mon, 19 Aug 2013 20:46:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254541 - in projects/umtx/sys: kern sys X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Aug 2013 20:46:15 -0000 Author: davide Date: Mon Aug 19 20:46:14 2013 New Revision: 254541 URL: http://svnweb.freebsd.org/changeset/base/254541 Log: - Unset the proper bit in the bitmap that keeps track which structures are in use and which aren't when the thread exits. - Protect the bitmap using PROC_SLOCK. Discussed with: attilio[1] Pointed out by: jhb[2] Modified: projects/umtx/sys/kern/kern_schedctl.c projects/umtx/sys/kern/kern_thread.c projects/umtx/sys/sys/schedctl.h Modified: projects/umtx/sys/kern/kern_schedctl.c ============================================================================== --- projects/umtx/sys/kern/kern_schedctl.c Mon Aug 19 18:57:58 2013 (r254540) +++ projects/umtx/sys/kern/kern_schedctl.c Mon Aug 19 20:46:14 2013 (r254541) @@ -58,6 +58,7 @@ static size_t bitmap_len; /* # of bits * Public prototypes. */ int schedctl(struct thread *td, struct schedctl_args *uap); +void schedctl_thread_exit(struct thread *td); static int schedctl_alloc_page(struct proc *p, shpage_t **ret) @@ -82,9 +83,9 @@ schedctl_alloc_page(struct proc *p, shpa pmap_qenter(spg->pageaddr, &m, 1); /* Map in userspace */ - PROC_LOCK(p); + PROC_SLOCK(p); SLIST_INSERT_HEAD(&(p->p_shpg), spg, pg_next); - PROC_UNLOCK(p); + PROC_SUNLOCK(p); map = &p->p_vmspace->vm_map; vm_object_reference(spg->shared_page_obj); @@ -126,6 +127,7 @@ schedctl_shared_alloc(struct thread *td, sh_pg = NULL; p = curproc; KASSERT(p != NULL, ("proc should never be NULL")); + PROC_SLOCK(p); if (!SLIST_EMPTY(&(p->p_shpg))) { /* @@ -140,9 +142,11 @@ schedctl_shared_alloc(struct thread *td, } } if (sh_pg == NULL) { + PROC_SUNLOCK(p); error = schedctl_alloc_page(p, &sh_pg); if (error != 0) return (ENOMEM); + PROC_SLOCK(p); } /* Now were's (mostly) sure there's room for allocation. */ @@ -152,6 +156,7 @@ schedctl_shared_alloc(struct thread *td, KASSERT(idx != -1, ("schedctl_page_alloc: invalid bitmap index")); *usroff = sh_pg->usraddr + (sizeof(shstate_t) * idx); *krnoff = sh_pg->pageaddr + (sizeof(shstate_t) * idx); + PROC_SUNLOCK(p); return (0); } @@ -190,6 +195,43 @@ schedctl_init(void) } /* + * thread_exit() hook. + */ +void +schedctl_thread_exit(struct thread *td) +{ + struct proc *p; + shpage_t *sh_pg; + vm_offset_t end, shptr, start; + int idx; + + if (td->td_schedctl == NULL) + return; + p = td->td_proc; + shptr = (vm_offset_t)td->td_schedctl; + SLIST_FOREACH(sh_pg, &(p->p_shpg), pg_next) { + start = (vm_offset_t)sh_pg->pageaddr; + end = (vm_offset_t)start + PAGE_SIZE; + if ((shptr >= start) && (shptr < end)) + break; + } + KASSERT(sh_pg != NULL, ("schedctl_thread_exit: can't find shpage_t")); + idx = 0; + while (start <= end) { + if (shptr == start) + break; + start += sizeof(shstate_t); + idx++; + } + KASSERT(idx <= bitmap_len, ("schedctl_thread_exit: invalid bmp idx")); + setbit(&(sh_pg->bitmap), idx); + sh_pg->available++; + td->td_schedctl->sh_state = STATE_FREE; + td->td_schedctl = NULL; + td->td_usrschedctl = NULL; +} + +/* * XXX: SI_SUB_KMEM is the right place to call schedctl_init? */ SYSINIT(schedctl, SI_SUB_KMEM, SI_ORDER_ANY, schedctl_init, NULL); Modified: projects/umtx/sys/kern/kern_thread.c ============================================================================== --- projects/umtx/sys/kern/kern_thread.c Mon Aug 19 18:57:58 2013 (r254540) +++ projects/umtx/sys/kern/kern_thread.c Mon Aug 19 20:46:14 2013 (r254541) @@ -416,6 +416,7 @@ thread_exit(void) AUDIT_SYSCALL_EXIT(0, td); #endif umtx_thread_exit(td); + schedctl_thread_exit(td); /* * drop FPU & debug register state storage, or any other * architecture specific resources that Modified: projects/umtx/sys/sys/schedctl.h ============================================================================== --- projects/umtx/sys/sys/schedctl.h Mon Aug 19 18:57:58 2013 (r254540) +++ projects/umtx/sys/sys/schedctl.h Mon Aug 19 20:46:14 2013 (r254541) @@ -66,7 +66,7 @@ typedef struct page_shared shpage_t; * Function prototypes. */ void schedctl_init(void); -void schedctl_thread_cleanup(struct thread *); -void schedctl_proc_cleanup(void); +void schedctl_thread_exit(struct thread *); +void schedctl_proc_exit(void); #endif /* _SYS_SCHEDCTL_H_ */