Linux/start_contribute()

첫 리눅스 커널 기여

Jminu 2025. 12. 22. 15:38

커널 분석을 하다가 발견

리눅스 커널에 관심을 가지면서 커널 분석을 시작했고,

더 나아가서 커널에 기여를 해보고싶다는 생각이 들었다.

오픈소스 기여, 특히 커널에 기여한다는 것은 개발자의 로망이 아닌가?

 

나같은 초보 개발자들이 커널의 코어 소스코드를 수정한다는 것은 사실 쉽지 않다.

코어부분은 초고수개발자들이 수십년에 걸쳐서 검증이 된, 거의 완벽한 코드이기 때문이다.

 

그래서 보통 드라이버쪽에 staging된 코드(아직 개발될 여지가 많은 코드)들을 대체로 수정한다고 한다.

더 쉬운건, 주석이나 코드 스타일 수정이 있다.

 

수정한 부분을 발견한건 우연이었다.

프로세스 생성 커널 분석을 하다가,
copy_process() 함수에 이런 주석이 있었다.

p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? args->child_tid : NULL;
	/*
	 * Clear TID on mm_release()?
	 */
p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? args->child_tid : NULL;

이 코드의 의미는 이렇다.

"clone_flags와 CLONE_CHILD_CLEARTID가 true일때 args->child_tid를 넣고, 아니면 NULL을 넣자"

그러면 결국 2가지 경우가 나온다.

  1. p->clear_child_tid = args->child_tid
  2. p->clear_child_tid = NULL

이 두가지 경우에 따라 mm_release()에서의 동작방식이 달라지게 된다.

그래서 mm_release()함수를 찾아보았다.

static void mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
	uprobe_free_utask(tsk);

	/* Get rid of any cached register state */
	deactivate_mm(tsk, mm);

	/*
	 * Signal userspace if we're not exiting with a core dump
	 * because we want to leave the value intact for debugging
	 * purposes.
	 */
	if (tsk->clear_child_tid) {
		if (atomic_read(&mm->mm_users) > 1) {
			/*
			 * We don't check the error code - if userspace has
			 * not set up a proper pointer then tough luck.
			 */
			put_user(0, tsk->clear_child_tid);
			do_futex(tsk->clear_child_tid, FUTEX_WAKE,
					1, NULL, NULL, 0, 0);
		}
		tsk->clear_child_tid = NULL;
	}

	/*
	 * All done, finally we can wake up parent and return this mm to him.
	 * Also kthread_stop() uses this completion for synchronization.
	 */
	if (tsk->vfork_done)
		complete_vfork_done(tsk);
}
  1. p->clear_child_tid = clone_args인 경우에는 put_user(0, tsk->clear_child_tid)에 의해 tsk->clear_child_tid가 가르키는 주소로 가서 0을 쓰고 주소를 NULL로 바꾼다. 이 과정은 자식이 부모에게 죽기전에 나 죽는다~라고 알리는 과정이라고 보면 된다.
  2. p->clear_child_tid = NULL인 경우에는 그냥 넘어간다.

그래서 어떤 주석을 수정했는가?

	/*
	 * Clear TID on mm_release()?
	 */

원래의 이 주석은 "TID가 mm_release에서 clear되는가?"

라는 뜻이고,

 

분석 결과 mm_release에서 clear_child_tid를 체크하고 clear해주는건 자명하다.

따라서

이렇게 주석을 수정하고

패치메일을 보냈다.

 

그리고 3주가 약간 넘은 시점에

커널 핵심 개발자인 Andrew Morton으로부터 메일을 받았다.

결과적으로는 패치를 승인했고, 이 패치를 빠른 시일내에 반영하겠다. 라는 답을 받았다.

https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/fork-comment-fix-remove-ambiguous-question-mark-in-clone_child_cleartid-comment.patch

 

 

리눅스 커널 책을 읽을때, 등장했던 Andrew Morton이 직접 코드를 보고 승인을 해줬는데

감회가 새롭다..

 

아마

Andrew Morton이 최종적으로 Linus Torvalds에게 패치를 또 올릴텐데,

토발즈 아저씨가 내가 쓴 코드를 직접 확인한다고 생각하니 개발자로써 떨리지 않을 수 없다.

 

기분좋은 첫 기여였다.

다음 기여는 주석수정이 아닌, 드라이버쪽 기여를 해보고싶다.