개발중인 UDP Relay Kernel Driver에서 커널 블럭 문제

eunsiri00의 이미지

안녕하세요,

현재 UDP Relay Kernel Driver를 개발중입니다.

기본적인 컨셉은

1. udp_rcv 함수를 재등록 (my_udp_rcv)
2. my_udp_rcv로 넘어온 skb로 부터 미리 등록시켜 놓은 target 정보를 얻어옴.
3. 해당 target->tqueue로 schedule_work 함수 호출 schedule_work(&target->tqueue);
4. schedule_work 로 넘긴 함수(socket_send_proc) 에서 udp_sendmsg()함수를 이용하여 패킷 전송.

즉 정리하면 udp_rcv -> schedule_work -> udp_sendmsg 이런식으로 받은 패킷을 바로 보내는 드라이버를
개발 중입니다.

근데 SMP 버전이 아닌 리눅스커널에서는 잘 동작하지만, SMP버전에서는 갑자기 동작중에 블럭되어버립니다.

소스양이 간단해서 자세히 살펴보아도 (제가 아는 지식하에서) 로직에는 문제가 없어보입니다.

마치 deadlock이 걸린 듯하게 아무 메시지없이 시스템이 블럭되버리는데,
제가 사용한 모든 lock을 주석처리해도 마찬가지 입니다.

개발환경은 VMWare 6.0 + CentOS-4.6 SMP 입니다. (실제 시스템 (코어2개)에 올려도 마찬가지입니다.)

혹시 이러한 상황일 때, 디버깅하는 방법이나 이와 비슷한 드라이버를 개발해보신 분 또는
왜 블럭이 되는지 아시는 분 계시면 답변 부탁드리겠습니다.

eunsiri00의 이미지

커널이 블럭되는 이유는 두가지임.
1. 잘못 사용한 lock에 의한 deadlock
2. 커널 panic

질문으로 올린 상황은 위의 deadlock 문제에 의해 발생되었음.

선점형 커널에 대한 주의를 기울이지 않고 lock을 사용하였음.
즉, 인터럽트 핸들러 함수 및 시스템 콜 관련 함수에서는 XXX_lock_bh 등의 함수를 사용하여
선점을 막아야 했음.

예를 들면 어떤 일반 함수에서 lock을 걸었는데 다른 인터럽트 핸들러에서 선점이 이루어져서
이 핸들러 함수가 실행되는데, 이 함수안에서 다시 lock을 하면 커널은 블럭됨.

[정리]
선점형 커널일땐 lock사용을 엄청 조심해야한다!

댓글 달기

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