Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Mar 2015 13:17:28 +0100
From:      Hans Petter Selasky <hps@selasky.org>
To:        "freebsd-arch@freebsd.org" <freebsd-arch@freebsd.org>,  Marshall Kirk McKusick <mckusick@mckusick.com>
Subject:   Giving names to "new" locking techniques
Message-ID:  <55003258.7010601@selasky.org>

next in thread | raw e-mail | index | archive | help
Hi,


What I'm writing here might become topic for a presentation educating 
other kernel developers at the next EuroBSDcon, so be warned ;-)


Some of you familiar to farming knows what happens when you try to kill 
a chicken using a simple axe. It runs around for a long time after the 
head is off. This picture can also be used to explain what happens when 
trying to stop a process in the kernel which is using many different APIs.


I think it would be benificial to all developers if new code techniques 
and solutions to classic locking problems could have a name, that can 
later be referred and explained, so that we don't go around and stumble 
and re-invent the wheel when writing [new] code.


I attended a talk by Kirk McMusic some years ago where he explained how 
turnstiles and the internals of the locking system in FreeBSD worked. 
And I couldn't agree more. Many other people listening did not fully 
understand what he said. I think there is a strong need to educate 
people on how to properly use locks and mutexes inside the FreeBSD 
kernel and not only how locks work internally.


I've recently been doing some work in the callout area and I would 
recommend other developers reading the "AVOIDING RACE CONDITIONS" 
section in "man 9 timeout" and making up your mind about the three 
no-name techniques described there.

I think it would be fair to force everyone to avoid races using a any 
kind of exclusivly locked mutex, which is described as "alternative 1" 
in "man 9 callout".


Further I would like the "AVOIDING RACE CONDITIONS" techniques in the 
callout subsystem to be the good example for everyone else. The USB 
stack already does similarly to the callout subsystem and it works 
excellent. And I would like the tools to be available in the kernel to 
do this easily, like an any-lock API similar to the existing locking 
classes in 11-current.


While at it I would like to collect some terms and words related to locking:

- Sleep/non sleepable lock (credits: ???)

- Shared/exclusive lock (credits: ???)

- Locking order reversal, LOR (credits: ???)

- Lock inversion (credits: des@ ???)

- Locking whole pieces of code and not only single variables or 
structures (credits: hselasky@ ???)

- Applying locks before calling a function and not inside a function 
(credits: hselasky@ ???)

- Any-locking API. A set of kernel functions that accepts any type of 
mutex: mtx / SPIN / RM / RW / SX which can be used by API providers to 
call callback functions locked (credits: ???)




Thanks for reading through!

Any comments?

--HPS



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