[Kernel Locking] 다양한 spin_lock 함수들의 차이?

kjw7945의 이미지

첫번째 :

spin_lock_irqsave() : 1. disable interrupts locally and
2. provide the spinlock on SMP
(Symetric Multiprocessing).

해석 : 인터럽트를 중지시키고, 멀티프로세싱에서 spinlock을
제공한다.(너무 직역인가요...-_-;)
----------
두번째 :

spin_lock_irq() : 1. disables and re-enables interrupts

해석 : 인터럽트를 disable 한 후 다시 re-enables 한다...

-------------------
세번째 :

spin_lock() : all of above spinlocks assume the data you
are protecting is accessed in both interrupt
handlers and normal kernel code. If you
know your data is unique to user-context
kernel code ( e.g., a system call), you can
use it.

해석 : 불능...헐..ㅠㅠ

---------------------------
네번째 :
spin_lock_bh() : implements the standard spinlock as
well as disables softirqs.

해석 : softirqs와 같은 spinlock이다??
(implements?, softirqs??)
----------------------

요점...
네 함수가 각각 어떤 차이가 있는지 잘 모르겠습니다...

즉...
모르는 부분은...

1. 1번과 2번의 차이와 멀티 프로세싱에 spin_lock을 지원
한다는 말은 race condition을 막는다는 의미인가요?

2. 2번은 단순히 인터럽트 중지 기능인지요?

3. 세번째 spin_lock()은 해석이 잘 안되는 부분이 많습니다.
normal kernel code의 의미라든지, data is unique to
user-context kernel code의 의미... 따라서 무슨 기능인지
모르고 있습니다...

4. implements와 softirqs는 무엇인지요...?
위의 함수와 무엇이 다르고 쓰임이 언제 다른지 궁금합니다..

^^

jeweljar의 이미지

후배의 질문이기에 존칭을 생략합니다. ㅎㅎㅎ

* spin_lock_irqsave()와 spin_lock_irq()
둘다 interrupt를 disable 시킨 이후에 spin lock을 획득하는 것은 동일하지만,
spin_lock_irqsave()는 CPU의 flag 레지스터를 보관했다가
spin_unlock_irqrestore()로 복구할 수 있다.

* spin_lock()과 spin_lock_irq()의 차이는
spin_lock()은 interrupt를 disable하지 않기 때문에
interrupt handler(top half)에서는 사용할 수 없다.
대신 이때는 spin_lock_irq()나 spin_lock_irqsave()를 사용해야 한다.

* spin_lock_bh()
같은 종류의 softirq는 여려 CPU에서 동시에 실행될 수 있기 때문에
([ksoftirqd/CPUn] 커널 쓰레드가 softirq의 실행을 담당한다.)
softirq를 disable한 이후에 spin lock을 획득한다.
원래 이 함수의 이름은 spin_lock_softirq() 정도가 되어야 맞겠지만
예전 커널의 흔적이 아직 남아있다.

* 그리고, spin_lock()은
spin lock으로 보호해야 할 데이터가
interrupt handler(top half)에서도, softirq handler에서도 접근하지 않고
단지 그 외의 일반적인 커널 코드에서만 접근한다면
interrupt disable, softirq disable 같은 overhead 없이 spin lock을 얻을때 사용한다.

tj의 이미지

조금 보태자면, spin_lock()이 interrupt handler / softirq에서 사용할 수 없는 건 아닙니다.

Thread context 실행 중 임의의 시점에 중지되고 softirq나 irq가 실행될 수 있고, softirq 실행중엔 임의의 시점에 irq가 실행될 수 있습니다. 만약 같은 락을 thread context와 irq에서 사용한다면 thread context에서 락을 잡고 있는 중에 irq가 실행되고 irq가 다시 같은 락을 획득하려고 할 수 있습니다. 데드락이죠. spin_lock_{irq[save]|bh}()는 이런 데드락을 피하기 위해서 사용합니다.

하나의 락이 irq에서도 사용되고 softirq나 thread context에서도 사용된다면, softirq/thread context에선 spin_lock_irq()를 irq 코드에선 spin_lock()을 사용합니다. 같은 코드를 irq와 다른 컨택스트에서 공유하거나해서 irq 상태를 알 수 없으면 spin_lock_irqsave()를 쓰면 됩니다. irq handler안에서는 spin_[un]lock_irq()를 쓰면 곤란하구요. 마찮가지로 softirq와 thread context가 공유하는 락은 thread context에서 spin_lock_bh()를 쓰면 됩니다. softirq disable은 카운팅이 되기 때문에 softirq안에서도 그냥 써도 되구요 (bh_save가 없는 이유).

정리하면 하나의 컨택스트 (irq, softirq, thread context 중) 안에서만 사용되는 락은 spin_lock()을 쓰면 되고, 하나 이상의 컨택스트에서 사용되는 락은 낮은 우선순위의 컨택스트에서 락을 잡을 때 락을 사용하는 컨택스트 중 가장 높은 우선순위를 막고 잡으면 됩니다.

totohero의 이미지

서로 다른 irq를 처리하는 handler 사이에 shared resource가 있다면 irq handler 안이라도 (interrupt nesting을 막기 위해) spin_[un]lock_irq()를 써야겠죠.

tj의 이미지

예, 그런데 최근에 irq handler들 nesting이 되지 않도록 바뀌었습니다. 바뀌기 전에도 인터럽트 핸들러 안에선 save/restore를 쓰는 게 좋구요 (아니면 lockdep이 뭐라고 할거에요).

kjw7945의 이미지

선배님...
감사합니다. ^^;;

free21k의 이미지

덕분에 좋은 정보 얻고 갑니다.

==================================
루비 개발자.

==================================
당신은 당신의 꿈을 위해 무엇을 희생하였나요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.