[CRIU] Re: [RFC PATCH] posix timers: allocate timer id per task
Pavel Emelyanov
xemul at parallels.com
Mon Oct 15 11:26:41 EDT 2012
On 10/15/2012 07:24 PM, Stanislav Kinsbursky wrote:
> 15.10.2012 19:16, Pavel Emelyanov пишет:
>> On 10/15/2012 06:01 PM, Stanislav Kinsbursky wrote:
>>> This patch replaces global idr with global hash table for posix timers and
>>> makes timer ids unique not globally, but per task. Next free timer id is type
>>> of integer and stored on signal struct (posix_timer_id). If free timer id
>>> reaches negative value on timer creation, it will be dropped to zero and
>>> -EAGAIN will be returned to user.
>>>
>>> Hash table is size of page (4KB).
>>>
>>> Key is constructed as follows:
>>> key = hash_ptr(current->signal) ^ hash_32(posix_timer_id);
>>>
>>> ---
>>> include/linux/posix-timers.h | 1
>>> include/linux/sched.h | 4 +-
>>> kernel/posix-timers.c | 112 ++++++++++++++++++++++++++++--------------
>>> 3 files changed, 78 insertions(+), 39 deletions(-)
>>>
>>
>>
>>> +{
>>> + struct signal_struct *sig = current->signal;
>>> + struct hlist_head *head;
>>> + int ret = -ENOENT;
>>> +
>>> + do {
>>> + spin_lock(&hash_lock);
>>> + head = &posix_timers_hashtable[hash(sig, sig->posix_timer_id)];
>>> + if (__posix_timers_find(head, sig, sig->posix_timer_id) == NULL) {
>>> + hlist_add_head(&timer->t_hash, head);
>>> + ret = sig->posix_timer_id++;
>>> + } else if (++sig->posix_timer_id < 0) {
>>> + sig->posix_timer_id = 0;
>>> + ret = -EAGAIN;
>>
>> What for? Overflow is OK, no need in restart.
>>
>
> I was thinking, that we need some way to stop here in case of corner case, when
> all id's are busy.
> I'm don't think that anyone can reach even INT_MAX timers in one task, so
> INT_MAX looks enough. This "EGAIN" will be returned to user.
while (1) {
add_timer()
del_timer()
}
will overflow it very fast.
>>> + }
>>> + spin_unlock(&hash_lock);
>>> + } while (ret == -ENOENT);
>>> + return ret;
>>> +}
>>
>
>
More information about the CRIU
mailing list