[CRIU] Re: [RFC PATCH] posix timers: allocate timer id per task

Stanislav Kinsbursky skinsbursky at parallels.com
Mon Oct 15 11:24:31 EDT 2012


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.

>> +		}
>> +		spin_unlock(&hash_lock);
>> +	} while (ret == -ENOENT);
>> +	return ret;
>> +}
>


-- 
Best regards,
Stanislav Kinsbursky



More information about the CRIU mailing list