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 을 해볼 예정이다.


+ Recent posts