Lines Matching refs:sched

807 static void perf_sched_init(struct perf_sched *sched, struct event_constraint **constraints,  in perf_sched_init()  argument
812 memset(sched, 0, sizeof(*sched)); in perf_sched_init()
813 sched->max_events = num; in perf_sched_init()
814 sched->max_weight = wmax; in perf_sched_init()
815 sched->max_gp = gpmax; in perf_sched_init()
816 sched->constraints = constraints; in perf_sched_init()
823 sched->state.event = idx; /* start with min weight */ in perf_sched_init()
824 sched->state.weight = wmin; in perf_sched_init()
825 sched->state.unassigned = num; in perf_sched_init()
828 static void perf_sched_save_state(struct perf_sched *sched) in perf_sched_save_state() argument
830 if (WARN_ON_ONCE(sched->saved_states >= SCHED_STATES_MAX)) in perf_sched_save_state()
833 sched->saved[sched->saved_states] = sched->state; in perf_sched_save_state()
834 sched->saved_states++; in perf_sched_save_state()
837 static bool perf_sched_restore_state(struct perf_sched *sched) in perf_sched_restore_state() argument
839 if (!sched->saved_states) in perf_sched_restore_state()
842 sched->saved_states--; in perf_sched_restore_state()
843 sched->state = sched->saved[sched->saved_states]; in perf_sched_restore_state()
847 sched->state.used &= ~BIT_ULL(sched->state.counter); in perf_sched_restore_state()
850 sched->state.counter++; in perf_sched_restore_state()
859 static bool __perf_sched_find_counter(struct perf_sched *sched) in __perf_sched_find_counter() argument
864 if (!sched->state.unassigned) in __perf_sched_find_counter()
867 if (sched->state.event >= sched->max_events) in __perf_sched_find_counter()
870 c = sched->constraints[sched->state.event]; in __perf_sched_find_counter()
877 if (sched->state.used & mask) in __perf_sched_find_counter()
880 sched->state.used |= mask; in __perf_sched_find_counter()
886 idx = sched->state.counter; in __perf_sched_find_counter()
893 if (sched->state.used & mask) in __perf_sched_find_counter()
896 if (sched->state.nr_gp++ >= sched->max_gp) in __perf_sched_find_counter()
899 sched->state.used |= mask; in __perf_sched_find_counter()
906 sched->state.counter = idx; in __perf_sched_find_counter()
909 perf_sched_save_state(sched); in __perf_sched_find_counter()
914 static bool perf_sched_find_counter(struct perf_sched *sched) in perf_sched_find_counter() argument
916 while (!__perf_sched_find_counter(sched)) { in perf_sched_find_counter()
917 if (!perf_sched_restore_state(sched)) in perf_sched_find_counter()
928 static bool perf_sched_next_event(struct perf_sched *sched) in perf_sched_next_event() argument
932 if (!sched->state.unassigned || !--sched->state.unassigned) in perf_sched_next_event()
937 sched->state.event++; in perf_sched_next_event()
938 if (sched->state.event >= sched->max_events) { in perf_sched_next_event()
940 sched->state.event = 0; in perf_sched_next_event()
941 sched->state.weight++; in perf_sched_next_event()
942 if (sched->state.weight > sched->max_weight) in perf_sched_next_event()
945 c = sched->constraints[sched->state.event]; in perf_sched_next_event()
946 } while (c->weight != sched->state.weight); in perf_sched_next_event()
948 sched->state.counter = 0; /* start with first counter */ in perf_sched_next_event()
959 struct perf_sched sched; in perf_assign_events() local
961 perf_sched_init(&sched, constraints, n, wmin, wmax, gpmax); in perf_assign_events()
964 if (!perf_sched_find_counter(&sched)) in perf_assign_events()
967 assign[sched.state.event] = sched.state.counter; in perf_assign_events()
968 } while (perf_sched_next_event(&sched)); in perf_assign_events()
970 return sched.state.unassigned; in perf_assign_events()