Date: Mon, 7 Aug 2006 21:27:19 +0200 From: "Attilio Rao" <attilio@freebsd.org> To: freebsd-arch@freebsd.org, freebsd-current@freebsd.org, "John Baldwin" <jhb@freebsd.org> Subject: [PATCH] Adding Solaris-style "owner of records" to rwlocks Message-ID: <3bbf2fe10608071227j17c4cfa6qd84e1d8e53668fda@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
This is a first implementation of the owner of records concept in rwlocks. It allows to avoid the priority inversion problem in the current rwlocks implementation (for readers). The main idea (that John and I discussed) is to have as owner of records the first rlock'er for a "class contention". The implementation consists in adding two flags (RW_LOCK_OWNED and RW_LOCK_EXEMPTED) which are used in order to not penalyze the easy case, and syncronizing the operation of acquiring and dropping the owner of records with the turnstile spin-lock. The main scheme might work in this way: thread1::rlock() -> sets the owner of records thread2::rlock() -> checks for RW_LOCK_OWNED bit and, if it is set, go in the easy case thread3::rlock() -> checks for RW_LOCK_OWNED... thread4::wlock() -> blocks and land its priority to thread1 thread1::runlock() -> disable the owner of records (disowning the associated turnstile) and sets the RW_LOCK_EXEMPTED flag. In this way other threads will treact as an easy case. ... What I actually need is a testing suite for heavy-load contentions, since I would like to detect eventual races I missed, etc. If somebody has a get-ready testing suite, please, let me know. The patch against HEAD is here: http://users.gufi.org/~rookie/works/patches/rwlocks.diff Please, this is not intended to be a final implementation for this, since I think that it can be improved; it is just a starting point for ongoing works and improvements. Let me know if something is not clear. Feedbacks, comments, ideas are welcome. Thanks, Attilio -- Peace can only be achieved by understanding - A. Einstein
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3bbf2fe10608071227j17c4cfa6qd84e1d8e53668fda>