[OSSCA] Linux Kernel Networking Stack #2 리눅스 커널에 커밋하기

문연수·2024년 7월 17일
0

OSSCA

목록 보기
3/6
post-thumbnail

0. 2년전...

쓸데없는, 관심도 없는 자기 얘기입니다. 건너가서 1 부터 보셔도 됩니다.

 필자는 리눅스 커널에 대해 막연하게 이해하고 있었다. 리눅스 커널에 대해 공부하더라도 항상 책으로 공부하다보니 전체적인 배경은 알고 있어도 -- 백면서생이었다 -- 실제 어떤 식으로 개발이 이뤄지는지에 대해서는 잘 알고 있지 못했다.

 친구였던 형곤이가 커널 커미터가 되고 성진이가 이런 저런 대외 활동을 하며 앞으로 나아가는 모습을 멀리서 바라보았다. 물론 그동안 놀고 있었던 것은 아니다. 책을 정말 많이 읽었다. 필자는 거의 모든 것들을 책을 통해서 배웠고 정말 크게 성장했다. 하지만 그 과정에서 책 밖에 세상이 있다는 사실 을 놓치고 말았다.

 방황하고 있던 차에 성진이가 필자에게 OSSCA 라는 프로그램을 추천해주었다. 별 기대도 안 하고 있었고 현재의 신분이 군인인지라 걱정이 앞섰다. 하지만 발대식에서 프로그램 소개와 멘토님의 말씀을 듣고 확신이 들었다:

여기에서 내 인생의 목표 중 하나인 Linux Kernel Maintainer 를 이룰 수 있겠다.

1. 커밋하기

 리눅스 커널에 커밋은 생각보다 쉬웠다. kernelnewbies.org 의 방법인데 바로 drivers/staging 에 있는 코드를 수정하는 것이다. 여기에 있는 코드는 기본적으로 리눅스 커널 코딩 스타일을 지키지 않고 있고 deprecated 된 API 를 사용하고 있기 때문이다.

- checkpatch.pl

 필자는 여기에서 rtl8712 드라이버를 선택한 뒤에 다음의 스크립트를 실행해서 수정이 필요한 파일을 찾았다.

pip3 install git
./script/checkpatch.pl --strict -f drivers/staging/rtl8712/*
./script/checkpatch.pl drivers/staging/rtl8712/r

여기에서 WARNING 이나 CHECK 가 보이는 파일을 찾아서 수정한다. 필자는 rtl8712rtl871x_cmd.c 파일을 수정했다:

끝! 사실 위의 수정도 반쪽짜리긴 한데 왜냐하면 80 column 을 넘었기 때문이다. 이것도 실제론 kernel coding convention 위반이긴 한데 특별히 checkpatch.pl 에서 에러를 안 뱉어서 올렸다.

이게 수정이 약간 까다로운게...

  1. memcpy 의 두 번째 인자 기준 컴마부터 잘라서 다음 행으로 넘기게 되면
  2. 2 line 의 single statement 에 대해 중괄호를 쳐줘야 하고
  3. 그럼 else 만 중괄호를 칠 수 없으므로
  4. 위의 if 에도 중괄호를 쳐줘야 되는

것으로 알고 있는데 그럼 복잡해질 것 같아서 당장 눈에 보이는 warning 만 지웠다.

- 리빌드

 수정을 했다면 제대로 동작하는지 확인하기 위해서 리빌드해야 한다. 커널 전체를 컴파일 하기에는 시간이 너무 오래 걸리므로 그냥 다음과 같이 컴파일하면 된다:

make drivers/staging/rtl8712

- 커밋 메시지 작성

 여기에서 고민을 많이 했다. 결국 필자는 그냥 해당 파일의 과거 기록을 보고 따라 배껴서 커밋 메세지를 작성했다:

git log -- <file> # 과거 커밋 메세지 확인
git commit -s -v # 실제 커밋 메세지 작성

이때 유저 이름을 github 유저명이 아니라 실명으로 올려야 하므로 git config 을 새롭게 잡아 주어야 한다. 또한 이후에 전송한 패치 메일 주소와도 일치해야 하므로 이 부분도 주의해야 한다.

2. 패치 메일 전송

 이제 커밋을 Patch 로 구성해서 메일로 전송하면 된다.

- git-email

sudo dnf install git-email

git config --global sendemail.smtpencryption tls
git config --global sendemail.smtpserverport 587
git config --global sendemail.smptserver <mailserver>
git config --global sendemail.smtpuser <email>
git config --global sendemail.smtppass <password>

필자는 gmailsmtp 를 썼다. 이건 인터넷에 검색하면 쉽게 찾을 수 있으므로 생략.

- 패치 생성

git format-patch -o /tmp/ HEAD^

위 명령으로 패치를 생성할 수 있다. 생성된 패치는 /tmp 에 위치하게 된다.

- 패치 메일 전송

git send-email --smtp-encryption=tls --to="gregkh@linuxfoundation.org" --to="linux-staging@lists.linux.dev" <fetch>

 생성된 패치는 위 명령으로 전송이 가능하다. 보내는 이는 해당 subsystem 의 maintainer 를 포함하면 된다. 잘 모르겠다면 ./script/get_maintainer.pl -f <filename> 으로 검색해도 된다.

https://lore.kernel.org/linux-staging/20240717130636.2139-1-yyyynom@gmail.com/T/#u

전송이 완료되면 위와 같이 메일링 리스트에 올라간 모습을 확인해볼 수 있다. 감격 스럽다 흑흑 ㅠㅠㅠ.

3. 우리 커널 영업 안 합니다.

 메일 전송 후 1시간도 안되서 Greg KH patch-bot 으로부터 답장을 받았다. 찾아보니 지금은 merge window 기간이라서 merge window 기간이 끝나면 그때 review 를 해주겠다고 한다. 이 기간에는 패치를 병합하기 때문에 커널이 샤타를 내린다. 대략 2주의 시간이 걸린다고 한다. 흑흑

4. 그리고 다음날...

bot 한테 연락 받은게 무색할 정도로 빠르게 답장이 왔다. philipp HortmannDan Carpenter 에게서 받은 메일인데 위에서 우려했던 바와 같은 이유로 reject 되었다.

* Philipp Hortmann

Philipp Hortmann: 너 checkpatch 사용 안 했으니까 확인해봐. 일단 나는 이렇게 나옴: 2 warnings

 찾아보니 패치 자체에 대해서도 checkpatch.pl 을 수행해야 했다. 일단 warning 이 발생한 이유는 크게 두 가지이다:

  1. 100 column 이 넘어감. 커널에서 권장하는게 80 이고 아마 100 을 넘기면 경고가 발생하는 것 같다.
  2. 메일 주소 불일치. 찾아보니 .gitconfig 과정에서 오타가 생겨서 o 를 하나 누락했다. yyyynom@gmail.com 이라 적혀있어서 경고가 발생했다.

그리고 이 경고는 라인 자르기로 해결하기 쉽지 않으므로 차라리 다른 문제부터 시작해보면 어떻겠냐는 제안을 받았다... 사실 위에서 얘기했던 것처럼 쉬워 보이는 형태의 스타일 픽스는 아니였던 것 같다.

* Dan Carpenter

dan Carpenter: 나라면 이렇게 수정할듯 zz

Dan Carpenter 는 공개 처형식을 진행했다. 처음에는 속상해서 이렇게 저렇게 수정해볼까 하다가 결국 돌고돌아 동일한 형식으로 돌아갔다.

5. 2차 패치메일 전송

문제가 있었던 메일 주소를 수정하고 코드도 제안해준대로 수정해서 커밋을 했다.

 다시 새롭게 패치를 작성해서 보냈다. 양식이 맞는지 모르겠지만 보내고 나서 확실히 알게 된건 받는 사람으로 Philipp HortmannDan Carpenter 를 추가하지 않은 것, 그리고 답장을 Philipp hortmann 이 아니라 Dan Carpenter 에게 한 것이다.

 둘 다 크게 중요한 사항은 아닐 수도 있긴 한데 위에 두 사람이 메일을 주고 받는 방식을 보니 확실히 서로의 이름이 기재되어 있다는 사실을 알 수 있었다.

지금보니 cutoff 라인도 잘못 기재한 것 같다. 흑흑. 아무래도 커밋 메세지에 추가할게 아니라 패치 포매팅할때 추가하는게 맞는 것 같다. 정확히 잘 모르겠으니 답장이 올때까지 기다려 볼 예정이다.

git format-patch -o /tmp/ HEAD^ --subject-prefix="PATCH v2"
git send-email 							\
--smtp-encryption=tls					\
--to="gregkh@linuxfoundation.org"		\
--to="linux-staging@lists.linux.dev"	\
--in-reply-to=<message id>				\
/tmp/0001-staging-rtl8712-style-fix-multiple-line-dereference.patch

여기에서 --to 로 Dan 과 Philipp 을 추가하고 답장을 Dan 이 아니라 Philip 으로 해야 맞는 것 같다.


7월 22일 최종 결과

 무려 v3 패치까지 거쳐서 결국 gregkh 이 패치를 넣어 줬습니다 ㅠㅠ

참고자료

https://hyeyoo.com/78
https://www.kernel.org/doc/html/v4.11/translations/ko_KR/howto.html
https://kernelnewbies.org/
https://2022.openinfradays.kr/session/6
https://www.kernel.org/doc/html/latest/process/2.Process.html?highlight=merge%20window
https://staticthinking.wordpress.com/2022/07/27/how-to-send-a-v2-patch/

profile
2000.11.30

2개의 댓글

comment-user-thumbnail
2024년 7월 21일

연수쿤 고생했어~

1개의 답글