Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 21 Dec 2008 13:46:28 +0800
From:      David Xu <davidxu@freebsd.org>
To:        Ravi Murty <ravi.murty@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: td_critnest
Message-ID:  <494DD834.7050108@freebsd.org>
In-Reply-To: <95b10a340812142103u3ab8bd2br97033a7c7e8bec3@mail.gmail.com>
References:  <95b10a340812142103u3ab8bd2br97033a7c7e8bec3@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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.





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?494DD834.7050108>