Write and Submit My First Kernel Patch
Kernel 의 Buddy 알고리즘 할당 방법을 위한 소스 분석을 하면서 발견한 문제를 큰 맘(?)먹고 진행을 해봤다. 처음이라 2~3 줄 고치는데 굉장히 여러 번 다시 보고 맞는지 확인 또 했다. 너무 간단한 내용의 수정이지만 patch 하고 검사받는 과정을 알아본다고 생각하시면 된다.
문제는 Buddy part 1 을 쓰면서 발견했다. 간단히 요약하면 while loop 내부에서 한번 설정되면 update 나 수정 사항이 없는 변수를 매 loop 매다 설정하는 것을 while 밖으로 빼낸 것이다.
이 코드는 굉장히 오랫동안 이런 상태로 유지되고 있었으며, 소스 분석 당시에 봤던 kernel 이 3.4.X 였으니 최신버전에는 반영되었겠지 하고 확인해봤는데 아직도 그대로 인 듯 하여 Patch 를 진행했다.
Patch를 하는 방법과 Coding Style 확인 하는 방법을 기존 포스트에서 쓴 적이 있으니 참고하시면 된다.
어떻게 하고 결과를 받았는지 적어 두려한다.
우선, Code를 수정한다.
수정한 위치는 mm/bootmem.c의 free_all_bootmem_core() 함수이다.
$ vi mm/bootmem.c
수정...
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: mm/bootmem.c
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git add mm/bootmem.c
$ git commit
mm: unnecessary set a variable in while loop.
Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: mm/bootmem.c
#
git commit 하면 "# Please..." 만 있다. 맨 윗 줄에 제목을 쓰고 한줄 띄우고 더 추가적인 comment 가 있다면 쓴다음에
마지막 줄에 Signed-off-by: Your Name <email@email.com> 형식으로 한 줄 추가해 주면 된다.
편집기를 저장 하고 나오자
$ git log .
commit 8baed0442191f87c0c500f124576f3a409c91f25
Author: Daeseok Youn <daeseok.youn@gmail.com>
Date: Thu Oct 17 10:22:45 2013 +0900
mm: unnecessary set a variable in while loop.
Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>
그러면 위와 같이 나온다.
이제 patch 파일을 만들고 maintainer 를 확인 한 다음에 메일을 보내면 된다.
물론 사전에 확인해야 할 사항들이 있는데, 너무 간단한 내용이라 빌드 확인 만 했다. 기본적으로 확인 해야 하는 사항은
Kernel/Documentation/SubmitChecklist 를 열어보면 10가지 정도가 나와있다. 기본적인 빌드 테스트와 확인 사항이 있다.
이제 patch file 을 만들어 보자.
사실 이렇게 하나정도 수정하는 경우에는 branch 를 따로 만들지 않고 해도 무방하다.
$ git format-patch HEAD^
0001-mm-unnecessary-set-a-variable-in-while-loop.patch
위와 같은 파일이 만들어진다.
내용을 열어 보면,
From 8baed0442191f87c0c500f124576f3a409c91f25 Mon Sep 17 00:00:00 2001
From: Daeseok Youn <daeseok.youn@gmail.com>
Date: Thu, 17 Oct 2013 10:22:45 +0900
Subject: [PATCH] mm: unnecessary set a variable in while loop.
Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>
---
mm/bootmem.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/mm/bootmem.c b/mm/bootmem.c
index 6ab7744..0b96fea 100644
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -172,11 +172,12 @@ void __init free_bootmem_late(unsigned long physaddr, unsigned long size)
static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
{
struct page *page;
- unsigned long start, end, pages, count = 0;
+ unsigned long *map, start, end, pages, count = 0;
if (!bdata->node_bootmem_map)
return 0;
+ map = bdata->node_bootmem_map;
start = bdata->node_min_pfn;
end = bdata->node_low_pfn;
@@ -184,10 +185,9 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
bdata - bootmem_node_data, start, end);
while (start < end) {
- unsigned long *map, idx, vec;
+ unsigned long idx, vec;
unsigned shift;
- map = bdata->node_bootmem_map;
idx = start - bdata->node_min_pfn;
shift = idx & (BITS_PER_LONG - 1);
/*
--
1.7.9.5
요런 식으로 만들어진다.
자 이제 메일을 보내보자. 근데 누구한테 보내야 되는지 확인을 먼저 해야 한다.
$ ./scripts/get_maintainer.pl 0001-mm-unnecessary-set-a-variable-in-while-loop.patch
Andrew Morton <akpm@linux-foundation.org> (commit_signer:10/12=83%)
Jiang Liu <jiang.liu@huawei.com> (commit_signer:4/12=33%)
Joonsoo Kim <js1304@gmail.com> (commit_signer:3/12=25%)
Johannes Weiner <hannes@cmpxchg.org> (commit_signer:1/12=8%)
Daeseok Youn <daeseok.youn@gmail.com> (commit_signer:1/12=8%)
linux-mm@kvack.org (open list:MEMORY MANAGEMENT)
linux-kernel@vger.kernel.org (open list)
여러 사람과 mailing list 가 나온다. 사실 to 로 누구를 보내야 하고 cc 로 누굴 넣어야 할 지 모르는 상태이다.
그래서 사실 맨위의 한사람에게 메일을 보내버렸다. 하루정도 지나서 Andrew 라는 사람이 다음부터는 cc 에 관련자를 꼭넣어야 merge 해준다고 한다. 사람이름은 to 로 보내고 단체 이름은 cc 로 보내면 맞을 것이다.
일단 mail 보내는 방법은 git send-mail command를 이용해도 좋고, Documentation/email-clients.txt 파일을 열어보면 여러 linux email client 가 있고, patch를 보내는 방법이 나와있다.
나는 그중에 Kmail client 를 이용해서 메일을 보냈다. kernel patch 관련 메일은 patch 파일로 첨부해서 보내거나 하면 안된다. patch 를 plan text 로 보내야 하는데, indentation 이 달라지면 안되기 때문에 따로 보내는 rule 과 방법이 있는 것이다.
그냥 git send-email command를 이용하도록 하자. 난 어쩔수 없는 상황이라 Kmail로 한것임.
git send-mail command 사용법은(물론 설치해야 한다.)
$ git help send-email
해서 마지막 예제 부분을 보던가, google 검색을 하면 설정하는 방법들이 나온다.
$ git send-email --to akpm@linux-foundation.org --to daeseok.youn@gmail.com --cc linux-mm@kvack.org --cc linux-kernel@vger.kernel.org 0001-mm-unnecessary-set-a-variable-in-while-loop.patch 이렇게 보내면 된다.
나의 경우에는 하루만에 메일이 왔다.
실제로 보낸 commit 의 제목을 알맞게 변경도 해주었고, CC를 붙이라는 comment 로 따로 해주었다.
최종 적으로, http://marc.info/?l=linux-mm-commits&m=138195455814828&w=4 에 등록이 되었고, 3~4 일뒤에 merge 작업이 있을 것이라고 한다.
이렇게 해서 첫 patch 가 성공적으로 merge 되었다. 한번 해봤으니 다음번에는 잘 찾아서 commit 을 해볼 예정이다.
'Linux Kernel Study' 카테고리의 다른 글
[Kernel] define 으로 do { ... } while(0) 많이 쓰는 이유 (2) | 2013.10.22 |
---|---|
Kernel Likely/Unlikely (2) | 2013.10.21 |
Linux kernel physical memory allocator (Buddy) - Part 3 (0) | 2013.10.04 |
Linux kernel physical memory allocator (Buddy) - Part 2-1 (0) | 2013.10.03 |
[분석] Linux kernel physical memory allocator (Buddy) - Part 2 (0) | 2013.10.01 |