Lines Matching refs:sched

680 static void perf_sched_init(struct perf_sched *sched, struct event_constraint **constraints,  in perf_sched_init()  argument
685 memset(sched, 0, sizeof(*sched)); in perf_sched_init()
686 sched->max_events = num; in perf_sched_init()
687 sched->max_weight = wmax; in perf_sched_init()
688 sched->max_gp = gpmax; in perf_sched_init()
689 sched->constraints = constraints; in perf_sched_init()
696 sched->state.event = idx; /* start with min weight */ in perf_sched_init()
697 sched->state.weight = wmin; in perf_sched_init()
698 sched->state.unassigned = num; in perf_sched_init()
701 static void perf_sched_save_state(struct perf_sched *sched) in perf_sched_save_state() argument
703 if (WARN_ON_ONCE(sched->saved_states >= SCHED_STATES_MAX)) in perf_sched_save_state()
706 sched->saved[sched->saved_states] = sched->state; in perf_sched_save_state()
707 sched->saved_states++; in perf_sched_save_state()
710 static bool perf_sched_restore_state(struct perf_sched *sched) in perf_sched_restore_state() argument
712 if (!sched->saved_states) in perf_sched_restore_state()
715 sched->saved_states--; in perf_sched_restore_state()
716 sched->state = sched->saved[sched->saved_states]; in perf_sched_restore_state()
719 clear_bit(sched->state.counter++, sched->state.used); in perf_sched_restore_state()
728 static bool __perf_sched_find_counter(struct perf_sched *sched) in __perf_sched_find_counter() argument
733 if (!sched->state.unassigned) in __perf_sched_find_counter()
736 if (sched->state.event >= sched->max_events) in __perf_sched_find_counter()
739 c = sched->constraints[sched->state.event]; in __perf_sched_find_counter()
744 if (!__test_and_set_bit(idx, sched->state.used)) in __perf_sched_find_counter()
750 idx = sched->state.counter; in __perf_sched_find_counter()
752 if (!__test_and_set_bit(idx, sched->state.used)) { in __perf_sched_find_counter()
753 if (sched->state.nr_gp++ >= sched->max_gp) in __perf_sched_find_counter()
763 sched->state.counter = idx; in __perf_sched_find_counter()
766 perf_sched_save_state(sched); in __perf_sched_find_counter()
771 static bool perf_sched_find_counter(struct perf_sched *sched) in perf_sched_find_counter() argument
773 while (!__perf_sched_find_counter(sched)) { in perf_sched_find_counter()
774 if (!perf_sched_restore_state(sched)) in perf_sched_find_counter()
785 static bool perf_sched_next_event(struct perf_sched *sched) in perf_sched_next_event() argument
789 if (!sched->state.unassigned || !--sched->state.unassigned) in perf_sched_next_event()
794 sched->state.event++; in perf_sched_next_event()
795 if (sched->state.event >= sched->max_events) { in perf_sched_next_event()
797 sched->state.event = 0; in perf_sched_next_event()
798 sched->state.weight++; in perf_sched_next_event()
799 if (sched->state.weight > sched->max_weight) in perf_sched_next_event()
802 c = sched->constraints[sched->state.event]; in perf_sched_next_event()
803 } while (c->weight != sched->state.weight); in perf_sched_next_event()
805 sched->state.counter = 0; /* start with first counter */ in perf_sched_next_event()
816 struct perf_sched sched; in perf_assign_events() local
818 perf_sched_init(&sched, constraints, n, wmin, wmax, gpmax); in perf_assign_events()
821 if (!perf_sched_find_counter(&sched)) in perf_assign_events()
824 assign[sched.state.event] = sched.state.counter; in perf_assign_events()
825 } while (perf_sched_next_event(&sched)); in perf_assign_events()
827 return sched.state.unassigned; in perf_assign_events()