Indeed! Thanks Mark.
Thomas, Roland, could you take a look?
Agreed, this one looks worse.
I forgot (if ever knew ;) this code completely, but can't we make a simpler
fix? posix_timer_event() can check list_empty() lockless,
posix_timer_event()
{
if (!list_emtpy(sigq->list))
return 0;
... fill and send ->sigq...
}
When the signal will be dequeued, schedule_next_timer() should afaics
set ->it_overrun_last which is copied to ->si_overrun then. Or we can
increment timr->it_overrun before return if I misread hrtimer_forward().
What do you think?
Another possible fix... we can change sys_timer_settime() to do
sigqueue_free() and re-alloc ->sigq when it is pending. Not that
I like this very much though.
Oleg.
--