linux kernel 소스코드에서 함수구문 중 모르는 것이 있어 질문드립니다.

trymp의 이미지


static void __task_rq_unlock(struct rq *rq)
	__releases(rq->lock)
{
	raw_spin_unlock(&rq->lock);
}

위의 함수처럼 함수문 다음 가로열기 전에 __releases(rq->lock) 이게 무슨의미죠?

함수시작하기 전에 초기화 해주는 것인가요?

이렇게 쓰는 경우를 처음봐서 어떻게 해석해야하는지 모르겠습니다.

어떤의미인지 알려주시면 감사하겠습니다.

sunnyncom의 이미지

semjase의 이미지

__releases(rq->lock) 이 부분이 헤더에 어떻게 정의되어있는지 살펴보면

# define __releases(x) __attribute__((context(x,1,0)))

이렇게 되어있습니다.

__attribute__를 검색해보니 아래에 잘 설명해놓은곳이 있네요.

http://risingcjw.tistory.com/entry/attribute-packed-구조체-정렬

결론: 컴파일러에 구조체 사이즈 맞추라고 지시하는것이네요.

.

bushi의 이미지

gcc 의 __attribute__ 확장엔 여러가지가 있고,
본문에 적혀있는 것은 컴파일러에게 뭘 요구하는 것이 아니라 sparse라는 툴을 위한 것이며,
커널 소스 받아서 make help 하면 다음과 같은 도움말을 볼 수 있습니다.

  make C=1   [targets] Check all c source with $CHECK (sparse by default)
  make C=2   [targets] Force check of all c source with $CHECK

sparse 는 딱히 리눅스 커널만을 위한 툴은 아니며 https://kldp.org/comment/504059#comment-504059 처럼 사용할 수 있습니다.