나는 의심 스럽다. 여기
는
timer_pending
에 대한 코드 (
timer.h#L169)입니다 :
static inline int timer_pending(const struct timer_list * timer) {
return timer->entry.next != NULL;
}
그리고 여기 당신이 init_timer
호출 할 때 타이머를 초기화 끝 코드 (timer.c#L621)입니다 : timer_pending
이 확인되는
가
static void do_init_timer(struct timer_list *timer, unsigned int flags,
const char *name, struct lock_class_key *key)
{
struct tvec_base *base = __raw_get_cpu_var(tvec_bases);
timer->entry.next = NULL;
timer->base = (void *)((unsigned long)base | flags);
timer->slack = -1;
#ifdef CONFIG_TIMER_STATS
timer->start_site = NULL;
timer->start_pid = -1;
memset(timer->start_comm, 0, TASK_COMM_LEN);
#endif
lockdep_init_map(&timer->lockdep_map, name, key, 0);
}
주 init_timer
에 전화 할 때까지 초기화되지 않은 entry.next
입니다. 따라서 타이머가 초기화되지 않은 경우 timer_pending
이 true를 반환 할 수 있습니다.
어떤 효과가 초기화되지 않은 타이머에서 del_timer_sync
을 호출 할 수 있는지 알 수 없습니다.
감사합니다. 나는 이것이 사실이라고 의심했다. 문제는 타이머를 제거하는 모듈 정리 코드를 원한다는 것입니다. 나는 구조체의 'function'멤버를 사용하여 아마도 가장 안전한 테스트가 될 것이라고 생각한다. (또는 타이머가 사용되는지 여부에 관계없이 모듈 init 코드의 모든 타이머 구조체에 대해 init_timer를 호출한다.) –
좋아요, 내 마지막 답변에 도달했다고 생각합니다 : 모든 타이머에 대한 init_timer() 호출은 * init * 및 * 구조체에서 * struct *를 호출하여 모든 del_timer() 또는 del_timer_sync() 나중에 우리가 timer_pending(), timer_del() 또는 유사한 것을 할 수있는 곳이면, 우리는 힙에서 폭발하지 않을 것입니다. –
커널 문서에 따르면 다른 작업 중 * any * 앞에 init_timer를 호출해야합니다. https://www.kernel.org/doc/htmldocs/device-drivers/API-init-timer-key.html – falstaff