]> xenbits.xensource.com Git - xen.git/commitdiff
x86/hpet: use an atomic add instead of a cmpxchg loop
authorJan Beulich <jbeulich@suse.com>
Mon, 26 Feb 2024 09:16:56 +0000 (10:16 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 26 Feb 2024 09:16:56 +0000 (10:16 +0100)
The usage of a cmpxchg loop in hpet_get_channel() is unnecessary, as the same
can be achieved with an atomic increment, which is both simpler to read, and
avoid any need for a loop.

Note there can be a small divergence in the channel returned if next_channel
overflows, but returned channel will always be in the [0, num_hpets_used)
range, and that's fine for the purpose of balancing HPET channels across CPUs.

Signed-of-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
xen/arch/x86/hpet.c

index d9e9c8ffa31066882ae7c47c50b92040fa0978b3..0759eae055cecd8b795c2d665cc2870dec74cd7a 100644 (file)
@@ -457,11 +457,7 @@ static struct hpet_event_channel *hpet_get_channel(unsigned int cpu)
     if ( num_hpets_used >= nr_cpu_ids )
         return &hpet_events[cpu];
 
-    do {
-        next = next_channel;
-        if ( (i = next + 1) == num_hpets_used )
-            i = 0;
-    } while ( cmpxchg(&next_channel, next, i) != next );
+    next = arch_fetch_and_add(&next_channel, 1) % num_hpets_used;
 
     /* try unused channel first */
     for ( i = next; i < next + num_hpets_used; i++ )