From: Manfred Spraul <manfred@colorfullife.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [DOCUMENTATION] Revised Unreliable Kernel Locking Guide
Date: Sat, 13 Dec 2003 04:15:01 +0100 [thread overview]
Message-ID: <3FDA8435.3060205@colorfullife.com> (raw)
Hi Rusty,
From Chapter 4.1:
> |spin_lock_irqsave()| (include/linux/spinlock.h) is a variant which
> saves whether interrupts were on or off in a flags word, which is
> passed to |spin_unlock_irqrestore()|. This means that the same code
> can be used inside an hard irq handler (where interrupts are already
> off) and in softirqs (where the irq disabling is required).
Interrupts are typically on within the hard irq handler.
spin_lock() is usually ok because an interrupt handler is never
reentered. Thus if a lock is only accessed from a single irq handler,
then spin_lock() is the faster approach. That's why many nic drivers use
spin_lock instead of spin_lock_irqsave() in their irq handlers.
OTHO: if a driver lock is a global resource that is used from different
irqs, then it must either use _irqsave(), or set SA_INTERRUPT.
Examples: rtc_lock relies on SA_INTERRUPT: it's touched from the rtc irq
and the timer irq path, and both rtc and timer set SA_INTERRUPT.
I assume ide relies on _irqsave(), but the code is too difficult to follow.
Btw, perhaps you could add the 2nd synchronization approach for
interrupts: if it's an extremely rare event, then no lock at all in the
irq handler (no reentrancy guaranteed by the kernel), and
spin_lock+disable_irq() in the softirq/tasklet. My network drivers use
that to synchronize packet rx with close.
--
Manfred
next reply other threads:[~2003-12-13 3:15 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-13 3:15 Manfred Spraul [this message]
-- strict thread matches above, loose matches on Subject: below --
2003-12-12 5:24 [DOCUMENTATION] Revised Unreliable Kernel Locking Guide Rusty Russell
2003-12-12 15:44 ` Dave Jones
2003-12-12 16:25 ` Keith Owens
2003-12-12 18:25 ` Dave Jones
2003-12-13 0:28 ` Keith Owens
2003-12-12 21:05 ` Rob Love
2003-12-15 2:28 ` Rusty Russell
2003-12-12 19:35 ` Paul E. McKenney
2003-12-13 3:16 ` Zwane Mwaikambo
2003-12-15 5:17 ` Rusty Russell
2003-12-15 5:17 ` Rusty Russell
2003-12-15 22:22 ` Paul E. McKenney
2003-12-16 6:32 ` Rusty Russell
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=3FDA8435.3060205@colorfullife.com \
--to=manfred@colorfullife.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
/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.