From owner-p4-projects@FreeBSD.ORG Sun Jan 27 21:45:30 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E09B016A468; Sun, 27 Jan 2008 21:45:29 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8CB9016A41B for ; Sun, 27 Jan 2008 21:45:29 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 7D0B613C468 for ; Sun, 27 Jan 2008 21:45:29 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0RLjTvZ053793 for ; Sun, 27 Jan 2008 21:45:29 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0RLjSqd053790 for perforce@freebsd.org; Sun, 27 Jan 2008 21:45:28 GMT (envelope-from jb@freebsd.org) Date: Sun, 27 Jan 2008 21:45:28 GMT Message-Id: <200801272145.m0RLjSqd053790@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 134244 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Jan 2008 21:45:30 -0000 http://perforce.freebsd.org/chv.cgi?CH=134244 Change 134244 by jb@jb_freebsd1 on 2008/01/27 21:45:22 It seems I need an sx lock to be able to check if it locked. It's an internal lock here, so the lock consistency is determined by the code in this file only. Specify SX_NOWITNESS to avoid the bogis LOR reports that WITNESS outputs when internal locks like this are obtained when there are various other locks already obtained. This lock has no bearing on the order that other locks are obtained. Affected files ... .. //depot/projects/dtrace/src/sys/kern/kern_sdt.c#8 edit Differences ... ==== //depot/projects/dtrace/src/sys/kern/kern_sdt.c#8 (text+ko) ==== @@ -39,8 +39,8 @@ #include #include #include -#include #include +#include #include /* @@ -51,8 +51,7 @@ /* * Mutex to serialise access to the SDT provider list. */ -static struct mtx sdt_mtx; -MTX_SYSINIT(&sdt_mtx, "Statically Defined Tracing", NULL, MTX_DEF); +static struct sx sdt_sx; /* * Hook for the DTrace probe function. The 'sdt' provider will set this @@ -80,13 +79,13 @@ { struct sdt_provider *prov = arg; - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_INSERT_TAIL(&sdt_provider_list, prov, prov_entry); TAILQ_INIT(&prov->probe_list); - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); } /* @@ -97,11 +96,11 @@ { struct sdt_provider *prov = arg; - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_REMOVE(&sdt_provider_list, prov, prov_entry); - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); } /* @@ -121,7 +120,7 @@ return; } - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_INSERT_TAIL(&probe->prov->probe_list, probe, probe_entry); @@ -129,7 +128,7 @@ probe->state = SDT_INIT; - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); } /* @@ -140,14 +139,14 @@ { struct sdt_probe *probe = arg; - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); if (probe->state == SDT_INIT) { TAILQ_REMOVE(&probe->prov->probe_list, probe, probe_entry); probe->state = SDT_UNINIT; } - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); } /* @@ -158,13 +157,13 @@ { struct sdt_argtype *argtype = arg; - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_INSERT_TAIL(&argtype->probe->argtype_list, argtype, argtype_entry); argtype->probe->n_args++; - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); } /* @@ -175,17 +174,17 @@ { struct sdt_argtype *argtype = arg; - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_REMOVE(&argtype->probe->argtype_list, argtype, argtype_entry); - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); } static void sdt_init(void *arg) { - sx_init(&sdt_mtx, "Statically Defined Tracing"); + sx_init_flags(&sdt_sx, "Statically Defined Tracing", SX_NOWITNESS); TAILQ_INIT(&sdt_provider_list); } @@ -195,7 +194,7 @@ static void sdt_uninit(void *arg) { - sx_destroy(&sdt_mtx); + sx_destroy(&sdt_sx); } SYSUNINIT(sdt, SI_SUB_KDTRACE, SI_ORDER_FIRST, sdt_uninit, NULL); @@ -209,14 +208,14 @@ int error = 0; struct sdt_provider *prov; - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_FOREACH(prov, &sdt_provider_list, prov_entry) { if ((error = callback_func(prov, arg)) != 0) break; } - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); return (error); } @@ -232,9 +231,9 @@ int locked; struct sdt_probe *probe; - locked = mtx_locked(&sdt_mtx); + locked = sx_xlocked(&sdt_sx); if (!locked) - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_FOREACH(probe, &prov->probe_list, probe_entry) { if ((error = callback_func(probe, arg)) != 0) @@ -242,7 +241,7 @@ } if (!locked) - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); return (error); } @@ -258,9 +257,9 @@ int locked; struct sdt_argtype *argtype; - locked = mtx_locked(&sdt_mtx); + locked = sx_xlocked(&sdt_sx); if (!locked) - mtx_lock(&sdt_mtx); + sx_xlock(&sdt_sx); TAILQ_FOREACH(argtype, &probe->argtype_list, argtype_entry) { if ((error = callback_func(argtype, arg)) != 0) @@ -268,7 +267,7 @@ } if (!locked) - mtx_unlock(&sdt_mtx); + sx_xunlock(&sdt_sx); return (error); }