Lines Matching refs:sched

662 static void perf_sched_init(struct perf_sched *sched, struct event_constraint **constraints,  in perf_sched_init()  argument
667 memset(sched, 0, sizeof(*sched)); in perf_sched_init()
668 sched->max_events = num; in perf_sched_init()
669 sched->max_weight = wmax; in perf_sched_init()
670 sched->max_gp = gpmax; in perf_sched_init()
671 sched->constraints = constraints; in perf_sched_init()
678 sched->state.event = idx; /* start with min weight */ in perf_sched_init()
679 sched->state.weight = wmin; in perf_sched_init()
680 sched->state.unassigned = num; in perf_sched_init()
683 static void perf_sched_save_state(struct perf_sched *sched) in perf_sched_save_state() argument
685 if (WARN_ON_ONCE(sched->saved_states >= SCHED_STATES_MAX)) in perf_sched_save_state()
688 sched->saved[sched->saved_states] = sched->state; in perf_sched_save_state()
689 sched->saved_states++; in perf_sched_save_state()
692 static bool perf_sched_restore_state(struct perf_sched *sched) in perf_sched_restore_state() argument
694 if (!sched->saved_states) in perf_sched_restore_state()
697 sched->saved_states--; in perf_sched_restore_state()
698 sched->state = sched->saved[sched->saved_states]; in perf_sched_restore_state()
701 clear_bit(sched->state.counter++, sched->state.used); in perf_sched_restore_state()
710 static bool __perf_sched_find_counter(struct perf_sched *sched) in __perf_sched_find_counter() argument
715 if (!sched->state.unassigned) in __perf_sched_find_counter()
718 if (sched->state.event >= sched->max_events) in __perf_sched_find_counter()
721 c = sched->constraints[sched->state.event]; in __perf_sched_find_counter()
726 if (!__test_and_set_bit(idx, sched->state.used)) in __perf_sched_find_counter()
732 idx = sched->state.counter; in __perf_sched_find_counter()
734 if (!__test_and_set_bit(idx, sched->state.used)) { in __perf_sched_find_counter()
735 if (sched->state.nr_gp++ >= sched->max_gp) in __perf_sched_find_counter()
745 sched->state.counter = idx; in __perf_sched_find_counter()
748 perf_sched_save_state(sched); in __perf_sched_find_counter()
753 static bool perf_sched_find_counter(struct perf_sched *sched) in perf_sched_find_counter() argument
755 while (!__perf_sched_find_counter(sched)) { in perf_sched_find_counter()
756 if (!perf_sched_restore_state(sched)) in perf_sched_find_counter()
767 static bool perf_sched_next_event(struct perf_sched *sched) in perf_sched_next_event() argument
771 if (!sched->state.unassigned || !--sched->state.unassigned) in perf_sched_next_event()
776 sched->state.event++; in perf_sched_next_event()
777 if (sched->state.event >= sched->max_events) { in perf_sched_next_event()
779 sched->state.event = 0; in perf_sched_next_event()
780 sched->state.weight++; in perf_sched_next_event()
781 if (sched->state.weight > sched->max_weight) in perf_sched_next_event()
784 c = sched->constraints[sched->state.event]; in perf_sched_next_event()
785 } while (c->weight != sched->state.weight); in perf_sched_next_event()
787 sched->state.counter = 0; /* start with first counter */ in perf_sched_next_event()
798 struct perf_sched sched; in perf_assign_events() local
800 perf_sched_init(&sched, constraints, n, wmin, wmax, gpmax); in perf_assign_events()
803 if (!perf_sched_find_counter(&sched)) in perf_assign_events()
806 assign[sched.state.event] = sched.state.counter; in perf_assign_events()
807 } while (perf_sched_next_event(&sched)); in perf_assign_events()
809 return sched.state.unassigned; in perf_assign_events()