Module Name: src Committed By: pooka Date: Mon Apr 12 22:15:32 UTC 2010
Modified Files: src/sys/conf: files src/sys/kern: kern_lwp.c src/sys/sys: lwp.h Added Files: src/sys/kern: subr_lwp_specificdata.c Log Message: Separate lwp specificdata data structure management from lwp cpu/vm management. No functional change. (specificdata routines went from kern_lwp.c to subr_lwp_specificdata.c) To generate a diff of this commit: cvs rdiff -u -r1.985 -r1.986 src/sys/conf/files cvs rdiff -u -r1.143 -r1.144 src/sys/kern/kern_lwp.c cvs rdiff -u -r0 -r1.1 src/sys/kern/subr_lwp_specificdata.c cvs rdiff -u -r1.129 -r1.130 src/sys/sys/lwp.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/conf/files diff -u src/sys/conf/files:1.985 src/sys/conf/files:1.986 --- src/sys/conf/files:1.985 Fri Apr 9 10:09:49 2010 +++ src/sys/conf/files Mon Apr 12 22:15:32 2010 @@ -1,4 +1,4 @@ -# $NetBSD: files,v 1.985 2010/04/09 10:09:49 nonaka Exp $ +# $NetBSD: files,v 1.986 2010/04/12 22:15:32 pooka Exp $ # @(#)files.newconf 7.5 (Berkeley) 5/10/93 version 20090313 @@ -1510,6 +1510,7 @@ file kern/subr_kobj_vfs.c file kern/subr_lockdebug.c file kern/subr_log.c +file kern/subr_lwp_specificdata.c file kern/subr_once.c file kern/subr_optstr.c file kern/subr_percpu.c Index: src/sys/kern/kern_lwp.c diff -u src/sys/kern/kern_lwp.c:1.143 src/sys/kern/kern_lwp.c:1.144 --- src/sys/kern/kern_lwp.c:1.143 Fri Apr 9 11:47:17 2010 +++ src/sys/kern/kern_lwp.c Mon Apr 12 22:15:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_lwp.c,v 1.143 2010/04/09 11:47:17 njoly Exp $ */ +/* $NetBSD: kern_lwp.c,v 1.144 2010/04/12 22:15:31 pooka Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -209,7 +209,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.143 2010/04/09 11:47:17 njoly Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.144 2010/04/12 22:15:31 pooka Exp $"); #include "opt_ddb.h" #include "opt_lockdebug.h" @@ -247,7 +247,6 @@ struct pool lwp_uc_pool; static pool_cache_t lwp_cache; -static specificdata_domain_t lwp_specificdata_domain; /* DTrace proc provider probes */ SDT_PROBE_DEFINE(proc,,,lwp_create, @@ -269,8 +268,7 @@ pool_init(&lwp_uc_pool, sizeof(ucontext_t), 0, 0, 0, "lwpucpl", &pool_allocator_nointr, IPL_NONE); - lwp_specificdata_domain = specificdata_domain_create(); - KASSERT(lwp_specificdata_domain != NULL); + lwpinit_specificdata(); lwp_sys_init(); lwp_cache = pool_cache_init(sizeof(lwp_t), MIN_LWP_ALIGNMENT, 0, 0, "lwppl", NULL, IPL_NONE, NULL, NULL, NULL); @@ -829,7 +827,7 @@ fd_free(); /* Delete the specificdata while it's still safe to sleep. */ - specificdata_fini(lwp_specificdata_domain, &l->l_specdataref); + lwp_finispecific(l) /* * Release our cached credentials. @@ -1513,91 +1511,6 @@ } /* - * lwp_specific_key_create -- - * Create a key for subsystem lwp-specific data. - */ -int -lwp_specific_key_create(specificdata_key_t *keyp, specificdata_dtor_t dtor) -{ - - return (specificdata_key_create(lwp_specificdata_domain, keyp, dtor)); -} - -/* - * lwp_specific_key_delete -- - * Delete a key for subsystem lwp-specific data. - */ -void -lwp_specific_key_delete(specificdata_key_t key) -{ - - specificdata_key_delete(lwp_specificdata_domain, key); -} - -/* - * lwp_initspecific -- - * Initialize an LWP's specificdata container. - */ -void -lwp_initspecific(struct lwp *l) -{ - int error; - - error = specificdata_init(lwp_specificdata_domain, &l->l_specdataref); - KASSERT(error == 0); -} - -/* - * lwp_finispecific -- - * Finalize an LWP's specificdata container. - */ -void -lwp_finispecific(struct lwp *l) -{ - - specificdata_fini(lwp_specificdata_domain, &l->l_specdataref); -} - -/* - * lwp_getspecific -- - * Return lwp-specific data corresponding to the specified key. - * - * Note: LWP specific data is NOT INTERLOCKED. An LWP should access - * only its OWN SPECIFIC DATA. If it is necessary to access another - * LWP's specifc data, care must be taken to ensure that doing so - * would not cause internal data structure inconsistency (i.e. caller - * can guarantee that the target LWP is not inside an lwp_getspecific() - * or lwp_setspecific() call). - */ -void * -lwp_getspecific(specificdata_key_t key) -{ - - return (specificdata_getspecific_unlocked(lwp_specificdata_domain, - &curlwp->l_specdataref, key)); -} - -void * -_lwp_getspecific_by_lwp(struct lwp *l, specificdata_key_t key) -{ - - return (specificdata_getspecific_unlocked(lwp_specificdata_domain, - &l->l_specdataref, key)); -} - -/* - * lwp_setspecific -- - * Set lwp-specific data corresponding to the specified key. - */ -void -lwp_setspecific(specificdata_key_t key, void *data) -{ - - specificdata_setspecific(lwp_specificdata_domain, - &curlwp->l_specdataref, key, data); -} - -/* * Allocate a new lwpctl structure for a user LWP. */ int Index: src/sys/sys/lwp.h diff -u src/sys/sys/lwp.h:1.129 src/sys/sys/lwp.h:1.130 --- src/sys/sys/lwp.h:1.129 Tue Apr 6 13:50:22 2010 +++ src/sys/sys/lwp.h Mon Apr 12 22:15:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: lwp.h,v 1.129 2010/04/06 13:50:22 christos Exp $ */ +/* $NetBSD: lwp.h,v 1.130 2010/04/12 22:15:31 pooka Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -327,6 +327,7 @@ void lwp_unsleep(lwp_t *, bool); uint64_t lwp_pctr(void); +void lwpinit_specificdata(void); int lwp_specific_key_create(specificdata_key_t *, specificdata_dtor_t); void lwp_specific_key_delete(specificdata_key_t); void lwp_initspecific(lwp_t *); Added files: Index: src/sys/kern/subr_lwp_specificdata.c diff -u /dev/null src/sys/kern/subr_lwp_specificdata.c:1.1 --- /dev/null Mon Apr 12 22:15:32 2010 +++ src/sys/kern/subr_lwp_specificdata.c Mon Apr 12 22:15:31 2010 @@ -0,0 +1,131 @@ +/* $NetBSD: subr_lwp_specificdata.c,v 1.1 2010/04/12 22:15:31 pooka Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#define _LWP_API_PRIVATE + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: subr_lwp_specificdata.c,v 1.1 2010/04/12 22:15:31 pooka Exp $"); + +#include <sys/param.h> +#include <sys/lwp.h> +#include <sys/specificdata.h> + +static specificdata_domain_t lwp_specificdata_domain; + +void +lwpinit_specificdata() +{ + + lwp_specificdata_domain = specificdata_domain_create(); + KASSERT(lwp_specificdata_domain != NULL); +} + +/* + * lwp_specific_key_create -- + * Create a key for subsystem lwp-specific data. + */ +int +lwp_specific_key_create(specificdata_key_t *keyp, specificdata_dtor_t dtor) +{ + + return (specificdata_key_create(lwp_specificdata_domain, keyp, dtor)); +} + +/* + * lwp_specific_key_delete -- + * Delete a key for subsystem lwp-specific data. + */ +void +lwp_specific_key_delete(specificdata_key_t key) +{ + + specificdata_key_delete(lwp_specificdata_domain, key); +} + +/* + * lwp_initspecific -- + * Initialize an LWP's specificdata container. + */ +void +lwp_initspecific(struct lwp *l) +{ + int error; + + error = specificdata_init(lwp_specificdata_domain, &l->l_specdataref); + KASSERT(error == 0); +} + +/* + * lwp_finispecific -- + * Finalize an LWP's specificdata container. + */ +void +lwp_finispecific(struct lwp *l) +{ + + specificdata_fini(lwp_specificdata_domain, &l->l_specdataref); +} + +/* + * lwp_getspecific -- + * Return lwp-specific data corresponding to the specified key. + * + * Note: LWP specific data is NOT INTERLOCKED. An LWP should access + * only its OWN SPECIFIC DATA. If it is necessary to access another + * LWP's specifc data, care must be taken to ensure that doing so + * would not cause internal data structure inconsistency (i.e. caller + * can guarantee that the target LWP is not inside an lwp_getspecific() + * or lwp_setspecific() call). + */ +void * +lwp_getspecific(specificdata_key_t key) +{ + + return (specificdata_getspecific_unlocked(lwp_specificdata_domain, + &curlwp->l_specdataref, key)); +} + +void * +_lwp_getspecific_by_lwp(struct lwp *l, specificdata_key_t key) +{ + + return (specificdata_getspecific_unlocked(lwp_specificdata_domain, + &l->l_specdataref, key)); +} + +/* + * lwp_setspecific -- + * Set lwp-specific data corresponding to the specified key. + */ +void +lwp_setspecific(specificdata_key_t key, void *data) +{ + + specificdata_setspecific(lwp_specificdata_domain, + &curlwp->l_specdataref, key, data); +}