softirq 의 re-entrance ?

김희상의 이미지

리눅스 커널에서, softirq는 여러개의 CPU에서 병렬로 수행될 수 있는걸로 아는데요,

Processor A  ----(call)------->  (Handler)
                          |
Processor B  ----(call)---+

와 같은 경우에서 ,
Processor A가 Handler를 수행하는 도중에 다른이유(interrupt 등)로 "Processor A"에서 다시 Handler로 재진입하는 경우가 있을 수 있나요?

즉, Handler에서 spin_lock 같은걸 써도 되냐는 거죠.. Handler 수행도중 같은 Processor에서 재진입이 일어난다면 spin_lock를 쓸 경우 deadlock이 발행할테니깐요..

(Processor B는 interrupt가 발생했으면 handler를 수행하는건 당연할테고....이때는 spin_lock이 다른 Processor에서 수행되니깐 상관없죠?)

kkojiband의 이미지

리눅스 2.4.20 를 기준으로 말씀드리겠습니다...

softirq는 같은 함수가 다른 cpu 에서 동시에 수행이 가능해야하기 때문에 spin_lock 은 필요가 없습니다...

그리고 같은 cpu 내에서는 중첩이 생길수도 있습니다. 왜냐하면 softirq_vec 에 등록된 함수를 처리하는 동안 interrupt 를 막아놓지 않기 때문이죠...

do_softirq() 에 진입 후 in_interrupt() 에서 위와 같은 상황을 검사를 합니다. 만약에 같은 cpu 내에서 softirq 를 처리 중이였다면 여기서 바로 return 해버립니다...

그렇다고 다시 발생한 softirq 를 무시하는건 아닙니다. 먼저 처리한걸 다 처리한 후에 뒤에 발생한 것도 다 처리를 해줍니다...

softirq 처리 함수인 do_softirq() 를 보시면 아마 쉽게 이해가 되실 껍니다...

참고로 위와 같은 상황을 감지하기 위해 만들어놓은 자료가 irq_cpustat_t 입니다. smp 의 경우 각각의 cpu 에 하나씩 할당이 됩니다.

그럼 열심히 하세요! 저도 열심히!

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

kkojiband의 이미지

헛...이런...

제가 실수한 곳이 있네요...--;

softirq_vec 에 등록된 함수는 재진입 가능해야 하기때문에 당연히 smp 에서는 spin_lock 이 필요합니다...

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.