|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/hpet: simplify hpet_get_channel()
>>> On 23.03.12 at 11:24, Keir Fraser <keir@xxxxxxx> wrote:
> On 23/03/2012 09:20, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:
>
>> There's no need for a lock here, elimination of which makes the
>> function a leaf one, thus allowing for better (and smaller) code.
>>
>> Further, use the variable next_channel according to its name - so far
>> it represented the most recently used channel rather than the next one
>> to use.
>
> Why is the following for-loop changed into do-while? It looks like it just
> makes the code longer, especially as you replace a % operator with
> open-coded equivalent for no reason I can see.
Simply because
for ( i = next; i != next; ++i )
makes no sense.
Removing the % is an efficiency thing - the resulting code is not only
faster, but also smaller (presumably because of the special register
limitations div has).
Jan
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>>
>> --- a/xen/arch/x86/hpet.c
>> +++ b/xen/arch/x86/hpet.c
>> @@ -402,30 +402,35 @@ static void __init hpet_fsb_cap_lookup(v
>> static struct hpet_event_channel *hpet_get_channel(unsigned int cpu)
>> {
>> static unsigned int next_channel;
>> - static spinlock_t next_lock = SPIN_LOCK_UNLOCKED;
>> unsigned int i, next;
>> struct hpet_event_channel *ch;
>>
>> if ( num_hpets_used == 0 )
>> return hpet_events;
>>
>> - spin_lock(&next_lock);
>> - next = next_channel = (next_channel + 1) % num_hpets_used;
>> - spin_unlock(&next_lock);
>> + do {
>> + next = next_channel;
>> + if ( (i = next + 1) == num_hpets_used )
>> + i = 0;
>> + } while ( cmpxchg(&next_channel, next, i) != next );
>>
>> /* try unused channel first */
>> - for ( i = next; i < next + num_hpets_used; i++ )
>> - {
>> - ch = &hpet_events[i % num_hpets_used];
>> + ch = &hpet_events[i = next];
>> + do {
>> if ( !test_and_set_bit(HPET_EVT_USED_BIT, &ch->flags) )
>> {
>> ch->cpu = cpu;
>> return ch;
>> }
>> - }
>> + ++ch;
>> + if ( ++i == num_hpets_used )
>> + {
>> + i = 0;
>> + ch = hpet_events;
>> + }
>> + } while ( i != next );
>>
>> - /* share a in-use channel */
>> - ch = &hpet_events[next];
>> + /* Share an in-use channel. */
>> if ( !test_and_set_bit(HPET_EVT_USED_BIT, &ch->flags) )
>> ch->cpu = cpu;
>>
>>
>>
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@xxxxxxxxxxxxx
>> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |