From: Arnd Bergmann <arnd@arndb.de>
To: Andrey Borzenkov <arvidjaar@mail.ru>
Cc: Arjan van de Ven <arjan@infradead.org>,
Oliver Neukum <oliver@neukum.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: when spin_lock_irq (as opposed to spin_lock_irqsave) is appropriate?
Date: Mon, 13 Oct 2008 00:21:37 +0200 [thread overview]
Message-ID: <200810130021.37811.arnd@arndb.de> (raw)
In-Reply-To: <200810121548.05644.arvidjaar@mail.ru>
On Sunday 12 October 2008, Andrey Borzenkov wrote:
> This leaves me with a question - how can I know whether interrupts may
> (not) be disabled at particular point? In particular, is it safe to
> assume that any place marked at "code may sleep" has interrupts enabled?
Yes, that is safe. The only times you know that interrupts are disabled
are:
1. If you have disabled interrupts yourself using local_irq_{disable,save}
or spin_lock_irq{,save}.
2. If you get called from an interface that is documented to have interrupts
disabled. The only common example of this is the interrupt handler function
you register with request_irq().
In all other cases, interrupts are disabled, though in some places you may
not sleep, e.g. because of spin_lock(), preempt_disable() or softirq
context (timer, tasklet, ...). The question of whether you may sleep
or not is irrelevant to whether or not you can use spin_lock_irq.
The rules are:
* If you know that interrupts are disabled, use spin_lock().
* If you know that interrupts are enabled and you might race against
an interrupt handler, use spin_lock_irq().
* If you cannot race against a hard interrupt handler, but can race
against a softirq, use spin_lock_bh().
* If you cannot race against either hardirq or softirq context but cannot
sleep, use spin_lock().
* If you can sleep in all places that take the spinlock, replace the
spinlock with a mutex.
* If you cannot tell whether interrupts are enabled or disabled, but
you can race against a hardirq, use spin_lock_irqsave.
Some people interpret the last rule as "If I can't be bothered to find
out who is calling me, use spin_lock_irqsave", but I much prefer to
be explicit (besides efficient) to give the reader a better indication
of what the lock actually does.
Arnd <><
next prev parent reply other threads:[~2008-10-12 22:21 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-11 15:29 when spin_lock_irq (as opposed to spin_lock_irqsave) is appropriate? Andrey Borzenkov
2008-10-11 15:41 ` Oliver Neukum
2008-10-11 15:55 ` Andrey Borzenkov
2008-10-12 8:08 ` Oliver Neukum
2008-10-11 16:18 ` Arjan van de Ven
2008-10-12 11:48 ` Andrey Borzenkov
2008-10-12 22:21 ` Arnd Bergmann [this message]
2008-10-12 23:12 ` Arjan van de Ven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200810130021.37811.arnd@arndb.de \
--to=arnd@arndb.de \
--cc=arjan@infradead.org \
--cc=arvidjaar@mail.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=oliver@neukum.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.