diff options
Diffstat (limited to 'big-little/lib/virt_events.c')
-rw-r--r-- | big-little/lib/virt_events.c | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/big-little/lib/virt_events.c b/big-little/lib/virt_events.c index 33e9d3b..ec5c468 100644 --- a/big-little/lib/virt_events.c +++ b/big-little/lib/virt_events.c @@ -66,6 +66,15 @@ void wait_for_event(unsigned event_id, unsigned cpu_id) return; } +static unsigned count_set_bits(unsigned mask) +{ + unsigned i; + for (i = 0; mask; i++) + mask &= mask - 1; + + return i; +} + /* * Wait for events from each core. Its a little trickier than * waiting for a single event. The event register as per the @@ -74,26 +83,29 @@ void wait_for_event(unsigned event_id, unsigned cpu_id) * the time we enter wfe() then each flag variable should be * checked. */ -void wait_for_events(unsigned event_id) +void wait_for_events(unsigned event_id, unsigned cpu_mask) { - unsigned ctr, event_count = 0, num_cpus = 0; + unsigned mask = 0, event_count = 0, cpu_count = 0; + int cpu_id = 0; - if (switcher) { - num_cpus = num_secondaries() + 1; - } else { - num_cpus = CLUSTER_CPU_COUNT(host_cluster) - + CLUSTER_CPU_COUNT(!host_cluster); - } + cpu_count = count_set_bits(cpu_mask); do { - for (ctr = 0; ctr < num_cpus; ctr++) { - if (TRUE == get_event(event_id, ctr)) { + for (mask = cpu_mask; mask;) { + + /* Find the first set msb */ + cpu_id = bitindex(mask); + + /* Unset the recorded bit */ + mask &= ~(1 << cpu_id); + + if (TRUE == get_event(event_id, cpu_id)) { event_count++; - reset_event(event_id, ctr); + reset_event(event_id, cpu_id); } } - if (event_count != num_cpus) + if (event_count != cpu_count) wfe(); else break; @@ -102,19 +114,15 @@ void wait_for_events(unsigned event_id) return; } -void set_events(unsigned event_id) +void set_events(unsigned event_id, unsigned cpu_mask) { - unsigned ctr, num_cpus = 0; + unsigned cpu_id = 0; - if (switcher) { - num_cpus = num_secondaries() + 1; - } else { - num_cpus = CLUSTER_CPU_COUNT(host_cluster) - + CLUSTER_CPU_COUNT(!host_cluster); - } + while (cpu_mask) { + cpu_id = bitindex(cpu_mask); + set_event(event_id, cpu_id); + cpu_mask &= ~(1 << cpu_id); + }; - for (ctr = 0; ctr < num_cpus; ctr++) { - set_event(event_id, ctr); - } return; } |