c = sched->constraints[sched->state.event];
 
+       /* Prefer fixed purpose counters */
+       if (x86_pmu.num_counters_fixed) {
+               idx = X86_PMC_IDX_FIXED;
+               for_each_set_bit_cont(idx, c->idxmsk, X86_PMC_IDX_MAX) {
+                       if (!__test_and_set_bit(idx, sched->state.used))
+                               goto done;
+               }
+       }
        /* Grab the first unused counter starting with idx */
        idx = sched->state.counter;
-       for_each_set_bit_cont(idx, c->idxmsk, X86_PMC_IDX_MAX) {
+       for_each_set_bit_cont(idx, c->idxmsk, X86_PMC_IDX_FIXED) {
                if (!__test_and_set_bit(idx, sched->state.used))
-                       break;
+                       goto done;
        }
-       sched->state.counter = idx;
 
-       if (idx >= X86_PMC_IDX_MAX)
-               return false;
+       return false;
+
+done:
+       sched->state.counter = idx;
 
        if (c->overlap)
                perf_sched_save_state(sched);