Merge branch 'timers/urgent' of ssh://master.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip into timers/urgent
This commit is contained in:
		
						commit
						2106b531ea
					
				| @ -289,21 +289,29 @@ void do_schedule_next_timer(struct siginfo *info) | ||||
| 		else | ||||
| 			schedule_next_timer(timr); | ||||
| 
 | ||||
| 		info->si_overrun = timr->it_overrun_last; | ||||
| 		info->si_overrun += timr->it_overrun_last; | ||||
| 	} | ||||
| 
 | ||||
| 	if (timr) | ||||
| 		unlock_timer(timr, flags); | ||||
| } | ||||
| 
 | ||||
| int posix_timer_event(struct k_itimer *timr,int si_private) | ||||
| int posix_timer_event(struct k_itimer *timr, int si_private) | ||||
| { | ||||
| 	memset(&timr->sigq->info, 0, sizeof(siginfo_t)); | ||||
| 	/*
 | ||||
| 	 * FIXME: if ->sigq is queued we can race with | ||||
| 	 * dequeue_signal()->do_schedule_next_timer(). | ||||
| 	 * | ||||
| 	 * If dequeue_signal() sees the "right" value of | ||||
| 	 * si_sys_private it calls do_schedule_next_timer(). | ||||
| 	 * We re-queue ->sigq and drop ->it_lock(). | ||||
| 	 * do_schedule_next_timer() locks the timer | ||||
| 	 * and re-schedules it while ->sigq is pending. | ||||
| 	 * Not really bad, but not that we want. | ||||
| 	 */ | ||||
| 	timr->sigq->info.si_sys_private = si_private; | ||||
| 	/* Send signal to the process that owns this timer.*/ | ||||
| 
 | ||||
| 	timr->sigq->info.si_signo = timr->it_sigev_signo; | ||||
| 	timr->sigq->info.si_errno = 0; | ||||
| 	timr->sigq->info.si_code = SI_TIMER; | ||||
| 	timr->sigq->info.si_tid = timr->it_id; | ||||
| 	timr->sigq->info.si_value = timr->it_sigev_value; | ||||
| @ -435,6 +443,7 @@ static struct k_itimer * alloc_posix_timer(void) | ||||
| 		kmem_cache_free(posix_timers_cache, tmr); | ||||
| 		tmr = NULL; | ||||
| 	} | ||||
| 	memset(&tmr->sigq->info, 0, sizeof(siginfo_t)); | ||||
| 	return tmr; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1319,6 +1319,7 @@ int send_sigqueue(struct sigqueue *q, struct task_struct *t, int group) | ||||
| 		q->info.si_overrun++; | ||||
| 		goto out; | ||||
| 	} | ||||
| 	q->info.si_overrun = 0; | ||||
| 
 | ||||
| 	signalfd_notify(t, sig); | ||||
| 	pending = group ? &t->signal->shared_pending : &t->pending; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user