From owner-freebsd-hackers@FreeBSD.ORG Sun Dec 21 05:44:30 2008 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 856CB1065679 for ; Sun, 21 Dec 2008 05:44:30 +0000 (UTC) (envelope-from davidxu@freebsd.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 748378FC1B; Sun, 21 Dec 2008 05:44:30 +0000 (UTC) (envelope-from davidxu@freebsd.org) Received: from apple.my.domain (root@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.3/8.14.3) with ESMTP id mBL5iR1f072753; Sun, 21 Dec 2008 05:44:28 GMT (envelope-from davidxu@freebsd.org) Message-ID: <494DD834.7050108@freebsd.org> Date: Sun, 21 Dec 2008 13:46:28 +0800 From: David Xu User-Agent: Thunderbird 2.0.0.9 (X11/20080612) MIME-Version: 1.0 To: Ravi Murty References: <95b10a340812142103u3ab8bd2br97033a7c7e8bec3@mail.gmail.com> In-Reply-To: <95b10a340812142103u3ab8bd2br97033a7c7e8bec3@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-hackers@freebsd.org Subject: Re: td_critnest 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: Sun, 21 Dec 2008 05:44:30 -0000 Ravi Murty wrote: > Hello All, > > The implementation of critical_enter and critical_exit changed between > freebsd 5 and freebsd 6. In the newer implemtnation, the code checks if > td_critnest is 1 and if it is sets it to zero, then checks if the thread > owes a preempt. If so, it increments td_critnest by 1 before grabbing a lock > and then decrements it back to zero. I can't figure out why it does this. > The freebsd 5 implementation seems straightforward where we check if the > thread owes a preempt and if so we switch to the new thread. Can anyone help > me with this? > > Thanks > Ravi I guess this becauses thread_lock() also calls critical_exit(), this code avoids recursion.