Lines Matching defs:resv

655 static kern_return_t pmc_internal_reservation_set_pmc(pmc_reservation_t resv, pmc_t pmc);
670 static void reservation_free(pmc_reservation_t resv) {
672 if(resv->config) {
673 assert(resv->pmc);
675 pmc_free_config(resv->pmc, resv->config);
677 resv->config = NULL;
681 (void)pmc_internal_reservation_set_pmc(resv, NULL);
684 zfree(perf_small_zone, resv);
690 static void reservation_init(pmc_reservation_t resv) {
691 assert(resv);
693 resv->pmc = NULL;
694 resv->config = NULL;
695 resv->value = 0ULL;
697 resv->flags = 0U;
698 resv->state = PMC_STATE(PMC_STATE_STATE_STOP, 0, 0);
699 resv->active_last_context_in = 0U;
705 resv->task = TASK_NULL;
718 static kern_return_t pmc_internal_reservation_set_pmc(pmc_reservation_t resv, pmc_t pmc) {
719 assert(resv);
721 if(resv->pmc) {
722 (void)pmc_close(resv->pmc);
723 pmc_deallocate(resv->pmc);
724 resv->pmc = NULL;
727 resv->pmc = pmc;
729 if(resv->pmc) {
730 pmc_reference(resv->pmc);
731 if(KERN_SUCCESS != pmc_open(resv->pmc)) {
732 pmc_deallocate(resv->pmc);
733 resv->pmc = NULL;
746 static void pmc_internal_reservation_enqueue(queue_t queue, pmc_reservation_t resv) {
748 assert(resv);
750 queue_enter(queue, resv, pmc_reservation_t, link);
753 static void pmc_internal_reservation_dequeue(queue_t queue, pmc_reservation_t resv) {
755 assert(resv);
757 queue_remove(queue, resv, pmc_reservation_t, link);
761 static boolean_t pmc_internal_reservation_matches_context(pmc_reservation_t resv) {
763 assert(resv);
765 if(PMC_FLAG_IS_SYSTEM_SCOPE(resv->flags)) {
767 } else if(PMC_FLAG_IS_TASK_SCOPE(resv->flags)) {
768 if(current_task() == resv->task) {
771 } else if(PMC_FLAG_IS_THREAD_SCOPE(resv->flags)) {
772 if(current_thread() == resv->thread) {
804 static boolean_t pmc_internal_reservation_queue_contains_pmc(queue_t queue, pmc_reservation_t resv) {
806 assert(resv);
812 if(tmp->pmc == resv->pmc) {
828 ret = (PMC_FLAG_SCOPE(resv->flags) != PMC_FLAG_SCOPE_THREAD) ||
829 (tmp->thread == resv->thread);
848 ret = (PMC_FLAG_SCOPE(resv->flags) != PMC_FLAG_SCOPE_TASK) ||
849 (tmp->task == resv->task);
879 static boolean_t pmc_internal_reservation_validate_for_pmc(pmc_reservation_t resv) {
880 assert(resv);
883 if(pmc_internal_reservation_queue_contains_pmc(system_reservations, resv) ||
884 pmc_internal_reservation_queue_contains_pmc(task_reservations, resv) ||
885 pmc_internal_reservation_queue_contains_pmc(thread_reservations, resv)) {
953 static boolean_t pmc_internal_reservation_add(pmc_reservation_t resv) {
954 assert(resv);
962 if(pmc_internal_reservation_validate_for_pmc(resv)) {
965 switch(PMC_FLAG_SCOPE(resv->flags)) {
968 pmc_internal_reservation_enqueue(system_reservations, resv);
976 assert(resv->task);
979 pmc_internal_reservation_enqueue(task_reservations, resv);
985 pmc_internal_update_task_flag(resv->task, TRUE);
990 assert(resv->thread);
997 pmc_internal_reservation_enqueue(thread_reservations, resv);
1002 pmc_internal_update_thread_flag(resv->thread, TRUE);
1057 static void pmc_internal_reservation_remove(pmc_reservation_t resv) {
1058 assert(resv);
1069 switch(PMC_FLAG_SCOPE(resv->flags)) {
1072 pmc_internal_reservation_dequeue(system_reservations, resv);
1081 pmc_internal_reservation_dequeue(task_reservations, resv);
1088 pmc_internal_update_task_flag(resv->task, FALSE);
1093 pmc_internal_reservation_dequeue(thread_reservations, resv);
1099 pmc_internal_update_thread_flag(resv->thread, FALSE);
2314 static boolean_t pmc_reservation_setup_pmi(pmc_reservation_t resv, pmc_config_t config) {
2315 assert(resv);
2316 assert(resv->pmc);
2324 kern_return_t ret = resv->pmc->methods.config_set_threshold(config->object,
2332 COUNTER_DEBUG("Failed to set threshold for pmc %p\n", resv->pmc);
2336 if(KERN_SUCCESS != resv->pmc->methods.config_set_handler(config->object,
2337 (void *)resv, &pmc_reservation_interrupt, config->refCon)) {
2339 COUNTER_DEBUG("Failed to set handler for pmc %p\n", resv->pmc);
2365 pmc_reservation_t resv = reservation_alloc();
2366 if(!resv) {
2370 reservation_init(resv);
2372 resv->flags |= PMC_FLAG_SCOPE_SYSTEM;
2373 resv->config = config;
2375 if(KERN_SUCCESS != pmc_internal_reservation_set_pmc(resv, pmc)) {
2376 resv->config = NULL;
2381 if(!pmc_internal_reservation_add(resv) || !pmc_reservation_setup_pmi(resv, config)) {
2383 resv->config = NULL;
2385 reservation_free(resv);
2391 *reservation = resv;
2422 pmc_reservation_t resv = reservation_alloc();
2423 if(!resv) {
2427 reservation_init(resv);
2429 resv->flags |= PMC_FLAG_SCOPE_TASK;
2430 resv->task = task;
2432 resv->config = config;
2434 if(KERN_SUCCESS != pmc_internal_reservation_set_pmc(resv, pmc)) {
2435 resv->config = NULL;
2440 if(!pmc_internal_reservation_add(resv) || !pmc_reservation_setup_pmi(resv, config)) {
2442 resv->config = NULL;
2444 reservation_free(resv);
2450 *reservation = resv;
2480 pmc_reservation_t resv = reservation_alloc();
2481 if(!resv) {
2485 reservation_init(resv);
2487 resv->flags |= PMC_FLAG_SCOPE_THREAD;
2488 resv->thread = thread;
2490 resv->config = config;
2492 if(KERN_SUCCESS != pmc_internal_reservation_set_pmc(resv, pmc)) {
2493 resv->config = NULL;
2498 if(!pmc_internal_reservation_add(resv) || !pmc_reservation_setup_pmi(resv, config)) {
2500 resv->config = NULL;
2502 reservation_free(resv);
2508 *reservation = resv;
2797 pmc_reservation_t resv = NULL;
2804 queue_iterate(thread_reservations, resv, pmc_reservation_t, link) {
2805 if ((oldThread == resv->thread) && pmc_accessible_from_core(resv->pmc, cpuNum)) {
2806 (void)pmc_internal_reservation_context_out(resv);
2812 queue_iterate(task_reservations, resv, pmc_reservation_t, link) {
2813 if ((resv->task == oldThread->task) && pmc_accessible_from_core(resv->pmc, cpuNum)) {
2814 (void)pmc_internal_reservation_context_out(resv);
2821 queue_iterate(thread_reservations, resv, pmc_reservation_t, link) {
2822 if ((resv->thread == newThread) && pmc_accessible_from_core(resv->pmc, cpuNum)) {
2823 (void)pmc_internal_reservation_context_in(resv);
2829 queue_iterate(task_reservations, resv, pmc_reservation_t, link) {
2830 if ((resv->task == newThread->task) && pmc_accessible_from_core(resv->pmc, cpuNum)) {
2831 (void)pmc_internal_reservation_context_in(resv);