From owner-freebsd-hackers@FreeBSD.ORG Thu Apr 26 20:37:04 2007 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C3FDF16A401 for ; Thu, 26 Apr 2007 20:37:04 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe11.swip.net [212.247.155.65]) by mx1.freebsd.org (Postfix) with ESMTP id 642B913C469 for ; Thu, 26 Apr 2007 20:37:04 +0000 (UTC) (envelope-from hselasky@c2i.net) X-Cloudmark-Score: 0.000000 [] Received: from [193.71.38.142] (account mc467741@c2i.net HELO [10.42.11.147]) by mailfe11.swip.net (CommuniGate Pro SMTP 5.1.7) with ESMTPA id 305604204 for freebsd-hackers@freebsd.org; Thu, 26 Apr 2007 21:36:56 +0200 From: Hans Petter Selasky To: freebsd-hackers@freebsd.org Date: Thu, 26 Apr 2007 21:36:33 +0200 User-Agent: KMail/1.9.5 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200704262136.33196.hselasky@c2i.net> Subject: msleep() on recursivly locked mutexes X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Apr 2007 20:37:04 -0000 Hi, In the new USB stack I have defined the following: u_int32_t mtx_drop_recurse(struct mtx *mtx) { u_int32_t recurse_level = mtx->mtx_recurse; u_int32_t recurse_curr = recurse_level; mtx_assert(mtx, MA_OWNED); while(recurse_curr--) { mtx_unlock(mtx); } return recurse_level; } void mtx_pickup_recurse(struct mtx *mtx, u_int32_t recurse_level) { mtx_assert(mtx, MA_OWNED); while(recurse_level--) { mtx_lock(mtx); } return; } When I do a msleep() I do it like this: level = mtx_drop_recurse(ctd->p_mtx); error = msleep(ctd, ctd->p_mtx, 0, "config td sleep", timeout); mtx_pickup_recurse(ctd->p_mtx, level); Are there any comments on integrating this functionality into msleep(), and adding mtx_drop_recurse() and mtx_pickup_recurse() to the FreeBSD kernel? --HPS