리눅스 커널 소스 fork.c 에서...

rgbi3307의 이미지

리눅스커널 소스 kernel/fork.c 파일안에 do_fork() 함수안에 아래의 코드가 있습니다.

long do_fork(unsigned long clone_flags,
	      unsigned long stack_start,
	      struct pt_regs *regs,
	      unsigned long stack_size,
	      int __user *parent_tidptr,
	      int __user *child_tidptr)
{
	//중간생략...
 
	if (!IS_ERR(p)) {
		struct completion vfork;
 
		trace_sched_process_fork(current, p);
 
		nr = task_pid_vnr(p);
 
	//이하생략...
}

위에서 trace_sched_process_fork(current, p); 문장은 얼핏봐도 trace_sched_process_fork 라는
함수를 호출하는것 같은데, 아무리 찾아봐도 이 함수가 정의된 곳을 찾을 수가 없습니다.
커널 소스를 검색하고 또 검색해 봐도 trace_sched_process_fork 을 찾을 수가 없네요...
그럼 이게 뭘까요?
혹시 이거 이미 경험해 보신분 계시면 멋진 조언 부탁합니다.

freestyle의 이미지

커널소스에서 make tags로 생성된 파일에서 검색해 보니 나오네요.

include/linux/tracepoint.h

142 #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
143 extern struct tracepoint __tracepoint_##name; \
144 static inline void trace_##name(proto) \
145 { \
146 if (static_branch(&__tracepoint_##name.key)) \
147 __DO_TRACE(&__tracepoint_##name, \
148 TP_PROTO(data_proto), \
149 TP_ARGS(data_args), \
150 TP_CONDITION(cond)); \
151 } \

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

rgbi3307의 이미지

정말 감사합니다. 매크로 였군요. 매크로를 정의하고 또 정의했군요.
커널 소스는 매크로의 향연인듯...(^^)

#define TRACE_EVENT(name, proto, args, struct, assign, print) \
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))