Egloos | Log-in
F/OSS study
F/OSS study
[Linux] LKML에 patch 보내기
git: 1.7.0.4


리눅스 커널 개발은 (다른 F/OSS 프로젝트와 마찬가지로) 메일링리스트를 통해 패치를 주고 받으며 이루어진다.
즉 커널 개발에 참여하기 위해서는 내가 작업한 내용을 patch로 만들어 LKML (Linux Kernel Mailing List)에
메일로 보내야 하는 것이다. 여기서는 그 과정을 (짧은 경험에 비추어) 정리해 보았다.
(여기에 빠져있거나 더 좋은/간편한 방법을 아신다면 저에게도 알려주세요.. ^^)

먼저 작업을 위해서는 커널 소스 트리가 필요하다.
http://kernel.org에서 tarball 형태로 받을 수도 있지만 더 좋은 방법은 git 저장소를 받아오는 것이 좋다.
(특정한 분야인 경우 해당 소스의 maintainer가 아직 정식 배포되지 않은 자신의 작업 트리에 맞추어
patch를 다시 작성해 줄 것을 요청하는 경우가 종종 있다.)
git에 익숙하지 않다면 아래의 링크에서 우리말로 번역된 사용자 설명서를 읽어보기 바란다.

우분투의 경우 git는 기본적으로 설치되어 있지 않기 때문에 다음과 같이 설치한다.

$ sudo apt-get install git-core git-email

리눅스 커널의 공식 트리는 당연힌 Linus Torvalds의 트리이며 다음과 같이 받아올 수 있다.

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

트리를 받은 후에는 자신이 작업할 별도의 브랜치를 만들어서 작업하는 것이 좋다.
다음과 같이 mywork라는 이름의 브랜치를 만들어 보자. (물론 이름은 자유롭게 지을 수 있다.)

$ cd linux-2.6
$ git checkout -b mywork

이제 여러분이 원하는 작업을 수행하자.. ^^

어떤 소스를 수정한 뒤에 (아직 commit하지는 않은 상태라고 가정하자) 빌드 및 테스트를 거치고
문제없이 수정이 잘 되었다고 판단되면 패치를 만들어 보내도 될 것이다.
make 시 C=1 옵션을 추가하여 sparse warning도 체크한다면 더욱 좋을 것이다.
(물론 시스템에 이미 sparse가 설치되어 있어야 한다.)

참고로 커널 소스는 명확한 코딩 스타일을 따르고 있으므로
먼저 이를 확인한 후 그에 맞춰 소스를 잘 정리해 두는 편이 좋을 것이다.
emacs를 이용하는 경우 (22 버전 이후) c-style에 linux 모드를 제공하므로 간편하다.

예를 들어 다음과 같은 내용을 수정했다고 하자.

$ git diff
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
index ef10940..852b819 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
@@ -194,7 +194,7 @@ static struct hw_breakpoint {
        unsigned long           addr;
        int                     len;
        int                     type;
-       struct perf_event       **pev;
+       struct perf_event       * __percpu *pev;
 } breakinfo[HBP_NUM];

 static unsigned long early_dr7;

먼저 수정한 내용을 커밋으로 만들어야 한다.
이 때 중요한 것은 이 커밋 (즉, 내가 만들어 보낼 patch)이 오픈 소스 라이선스를
따른다는 표시로 (자세한 사항은 커널 소스의 Documentation/SubmittingPatches 참조)
커밋에 sign을 남겨야 한다는 것이다.

git config에 user.name과 user.email 항목이 적절히 설정되어 있다면
커밋 시에 -s 옵션을 추가하는 것으로 이를 간단히 수행할 수 있다.

위와 같은 상태에서 다음을 수행하여 커밋을 만들고 적절한 로그 메시지도 작성한다.

$ git commit -asm "kgdb: add missing __percpu markup in arch/x86/kernel/kgdb.c
>
> breakinfo->pev is a pointer to percpu pointer but was missing __percpu markup.
> Add it."

-a 옵션은 commit 시 add를 함께 수행하기 위한 것이고
-m 옵션은 commit 메시지를 별도의 에디터를 띄우지 않고 직접 입력하기 위한 것이다.

로그 메시지 작성 시에는 제목으로 사용할 첫 줄 아래에 빈 줄이 하나 있어야 한다는 점을 유의하자.
이는 나중에 메일 제목과 본문으로 자동 변환된다.

show 명령을 수행해보면 현재 작업한 내용 (HEAD commit)을 한 눈에 볼 수 있다.

$ git show
commit 8c8aefce934dc45de641fe78d48ff1b7722d826a
Author: Namhyung Kim <namhyung@gmail.com>
Date:   Sat Aug 7 11:00:59 2010 -0700

    kgdb: add missing __percpu markup in arch/x86/kernel/kgdb.c

    breakinfo->pev is a pointer to percpu pointer but was missing __percpu markup.
    Add it.

    Signed-off-by: Namhyung Kim <namhyung@gmail.com>

diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
index ef10940..852b819 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
@@ -194,7 +194,7 @@ static struct hw_breakpoint {
        unsigned long           addr;
        int                     len;
        int                     type;
-       struct perf_event       **pev;
+       struct perf_event       * __percpu *pev;
 } breakinfo[HBP_NUM];

 static unsigned long early_dr7;

마지막에 Signed-off-by 부분이 추가된 것을 볼 수 있다.
이제 이것을 mail로 보낼 수 있도록 만들기 위해 다음을 실행한다.

$ git format-patch -1
0001-kgdb-add-missing-__percpu-markup-in-arch-x86-kernel-.patch

이것이 실제로 보낼 patch 파일이며 바로 메일로 보낼 수 있는 형식으로 만들어져 있다.
patch를 보내기 전에 먼저 patch가 코딩 스타일을 따라서 잘 만들어 졌는지 확인해야 한다.
이를 확인하기 위해 커널 소스 내에 존재하는 다음과 같은 스크립트를 실행하면 된다.

$ scripts/checkpatch.pl 0001-*.patch
ERROR: "foo    * bar" should be "foo    *bar"
#24: FILE: arch/x86/kernel/kgdb.c:197:
+    struct perf_event    * __percpu *pev;

ERROR: need consistent spacing around '*' (ctx:WxV)
#24: FILE: arch/x86/kernel/kgdb.c:197:
+    struct perf_event    * __percpu *pev;
                                     ^

total: 2 errors, 0 warnings, 8 lines checked

0001-kgdb-add-missing-__percpu-markup-in-arch-x86-kernel-.patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

이 경우 포인터 변수의 선언 시 *와 변수명 사이의 공백이 없어야 한다는 메시지를 보여주긴 하지만
현재 patch의 경우 이중 포인터 내부에 attribute를 추가하는 특수한 상황이므로 그냥 무시하기로 한다.

다음으로는 패치를 보낼 담당자를 찾아야 한다.
물론 LKML로 보내긴 하지만 LKML은 하루에만 400~500 개의 patch들이 쏟아져 들어오기 때문에
어느 누구도 이를 모두 다 살펴보고 검토하지는 않는다.
따라서 현재 작업한 내용을 담당하고 있는 maintainer를 찾아서 직접 메일을 보내고
LKML을 참조로 넣어야 한다.

커널 소스에는 각 파일/디렉터리 별로 담당자를 표시해 둔 MAINTAINERS 파일이 존재하므로
이를 직접 찾아서 메일 주소를 알아낼 수도 있지만 다음과 같은 스크립트를 이용할 수도 있다.

$ scripts/get_maintainer.pl 0001-*.patch
Thomas Gleixner <tglx@linutronix.de>
Ingo Molnar <mingo@redhat.com>
"H. Peter Anvin" <hpa@zytor.com>
x86@kernel.org
Jason Wessel <jason.wessel@windriver.com>
Frederic Weisbecker <fweisbec@gmail.com>
Dongdong Deng <dongdong.deng@windriver.com>
linux-kernel@vger.kernel.org

여기에 출력된 모든 사람 및 리스트에게 메일을 보내도 되긴 하지만
스크립트의 출력은 false positive를 포함할 수도 있으니
실제 MAINTAINERS 파일과 다시 한 번 비교해 보는 것이 더 좋을 것이다.

검토 결과 위의 세 사람과 리스트 주소는 x86 아키텍처의 maintainer들이고
그 아래의 Jason Wessel이 kgdb의 maintainer이며 다른 둘은 직접적인 관련이 없어보인다.
(최근에 해당 파일에 관련된 patch를 보낸 사람들일 것이다.)

여기서는 Jason에게만 메일을 보내기로 한다.
git의 send-email 기능을 이용하면 위에서 만든 patch 파일을 직접 보낼 수 있다.
이를 위해서는 메일 서버 설정을 먼저 해야 하는데 gmail을 사용하는 경우 다음과 같다.

$ git config --global --get-regexp smtp
sendemail.smtpserver smtp.gmail.com
sendemail.smtpserverport 587
sendemail.smtpencryption tls

사실 위에서는 빠져 있지만 자신의 계정에 해당하는 정보도 포함되어 있어야 하며
이를 sendemail.smtpuser와 sendemail.smtppass 항목으로 추가해야 한다.

설정을 마쳤다면 이제 실제로 메일을 보낼 때이다.

$ git send-email --to "Jason Wessel <jason.wessel@windriver.com>" \
> --cc linux-kernel@vger.kernel.org 0001-*.patch

위를 실행하면 메일 보낼 주소가 맞는지와 참조할 메일의 메시지 ID 등을 확인하는데
그냥 기본값을 사용하도록 엔터 키를 치고 넘어가도록 하자.

이것으로 patch가 보내졌다. LKML에 실제로 메일이 잘 들어갔는지 확인하기 위해
http://lkml.org 혹은 http://marc.info/?l=linux-kernel 등을 살펴봐도 좋다. ^^
이제 (운이 좋다면) 누군가가 이 메일에 대한 답장을 보내줄 것이다.


=== 참조 문헌 ===

* 모든 참조 문헌이 한글 문서(번역본)이긴 처음인 듯. 최신 사항 혹은 의미가 확실치 않은 부분은 항상 원문을 함께 참고하는 것이 좋다.

by namhyung | 2010/09/06 00:03 | Tips | 트랙백(1) | 핑백(1) | 덧글(3)
트랙백 주소 : http://studyfoss.egloos.com/tb/5392934
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from at 2014/03/11 00:24
Linked at 천재태지의 세상 돌려보기 : .. at 2015/05/26 03:10

... [Linux] LKML에 patch 보내기 [16]</a>"를 소개해주셨다. 나는 개인적으로 박성재님의 "리눅스에 패치 업로드하기 [17]"라는 글을 추천한다. &lt; 어느 부분을 볼 것인가 &gt; 뭐부터 시작할까?리눅스 커널은 엄청 다양한 부분으로 이루어져 있다.시작점은 다트를 던져서 찍어도 된다.요즘 인기 좋은 것은 스토리지/파일시스템 이 부분에서 재미있는 점은, "시작점은 다트를 던져서 찍어도 된다"이다. 지금 유행인 분야를 지금부터 ... more

Commented by 김태훈 at 2011/04/21 20:32
감사합니다.
Commented by 전호철 at 2015/05/21 09:19
어제 세미나 잘 들었습니다.
성함을 잘못 알아들어서 찾는데 좀 애먹었네요.
블로그에 많은 좋은 글들 잘 보겠습니다.
Commented by kkamagui at 2017/02/10 06:58
안녕하세요, 남형님 ^^
새해 복 많이 받으세요. 잘 지내시죠?

좋은 글 잘 봤습니다. 많은 도움이 되었습니다. ^^

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
General
Application
System
Kernel
Book
Tips
태그
elf blktrace perf synchronization computer-architecture scm CAaQA3 memory C x86 script glibc algorithm compiler vcs bash block-layer gcc kernel emacs binutils awk linux git patch CARM build sed SMP documentation
전체보기
이글루 파인더

최근 등록된 덧글
informsi yang bagus dan b..
by agen qnc at 06/22
informasi yang bagus dan b..
by agen qnc at 06/22
informasi yang bagus dan b..
by agen qnc at 06/22
최근 등록된 트랙백
Tod's Ferrari Homme
by Tods Pas Cher,Kodak did ..
Mocassin Femme
by Mocassins Homme, I got so..
natural garcinia cambogia
by
rss

skin by jiinny


X