Sophie

Sophie

distrib > CentOS > 6 > i386 > by-pkgid > cf93d8a8acdcc6fe2225039da0502495 > files > 2211

kernel-doc-2.6.32-131.17.1.el6.centos.plus.noarch.rpm

<?xml version="1.0" encoding="ANSI_X3.4-1968" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ANSI_X3.4-1968" /><title>Locking Between User Context and Softirqs</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2" /><link rel="home" href="index.html" title="Unreliable Guide To Locking" /><link rel="up" href="ch03.html" title="Chapter&#160;3.&#160;Locking in the Linux Kernel" /><link rel="prev" href="ch03s03.html" title="Locking Only In User Context" /><link rel="next" href="ch03s05.html" title="Locking Between User Context and Tasklets" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Locking Between User Context and Softirqs</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a>&#160;</td><th width="60%" align="center">Chapter&#160;3.&#160;Locking in the Linux Kernel</th><td width="20%" align="right">&#160;<a accesskey="n" href="ch03s05.html">Next</a></td></tr></table><hr /></div><div class="sect1" title="Locking Between User Context and Softirqs"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="lock-user-bh"></a>Locking Between User Context and Softirqs</h2></div></div></div><p>
      If a <a class="firstterm" href="go01.html#gloss-softirq"><em class="firstterm">softirq</em></a> shares
      data with user context, you have two problems.  Firstly, the current 
      user context can be interrupted by a softirq, and secondly, the
      critical region could be entered from another CPU.  This is where
      <code class="function">spin_lock_bh()</code> 
      (<code class="filename">include/linux/spinlock.h</code>) is
      used.  It disables softirqs on that CPU, then grabs the lock.
      <code class="function">spin_unlock_bh()</code> does the reverse.  (The
      '_bh' suffix is a historical reference to "Bottom Halves", the
      old name for software interrupts.  It should really be
      called spin_lock_softirq()' in a perfect world).
    </p><p>
      Note that you can also use <code class="function">spin_lock_irq()</code>
      or <code class="function">spin_lock_irqsave()</code> here, which stop
      hardware interrupts as well: see <a class="xref" href="ch04.html" title="Chapter&#160;4.&#160;Hard IRQ Context">Chapter&#160;4, <i>Hard IRQ Context</i></a>.
    </p><p>
      This works perfectly for <a class="firstterm" href="go01.html#gloss-up"><em class="firstterm"><acronym class="acronym">UP
      </acronym></em></a> as well: the spin lock vanishes, and this macro 
      simply becomes <code class="function">local_bh_disable()</code>
      (<code class="filename">include/linux/interrupt.h</code>), which
      protects you from the softirq being run.
    </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a>&#160;</td><td width="20%" align="center"><a accesskey="u" href="ch03.html">Up</a></td><td width="40%" align="right">&#160;<a accesskey="n" href="ch03s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Locking Only In User Context&#160;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&#160;Locking Between User Context and Tasklets</td></tr></table></div></body></html>