Lines Matching defs:sdc

321 #define	SYSDC_HASH(sdc)	(((uintptr_t)(sdc) >> 6) & (SYSDC_NLISTS - 1))
323 #define SYSDC_LIST(sdc) (&sysdc_active[SYSDC_HASH(sdc)])
405 * Updates the recorded times in the sdc, and returns the elapsed ONPROC
412 sysdc_update_times(sysdc_t *sdc, uint_t flags,
415 kthread_t *const t = sdc->sdc_thread;
426 if (sdc->sdc_sleep_updates != 0 &&
427 sdc->sdc_sleep_updates != sdc->sdc_nupdates) {
428 *newO = sdc->sdc_last_base_O;
440 ++sdc->sdc_nupdates;
441 if ((sdc->sdc_nupdates % sysdc_reset_updates) == 0)
456 sdc->sdc_nupdates = (uint_t)((gethrtime() % 4999) %
460 baseO = sdc->sdc_base_O;
461 baseR = sdc->sdc_base_R;
464 mstate_systhread_times(t, &sdc->sdc_base_O, &sdc->sdc_base_R);
465 *newO = sdc->sdc_base_O;
467 sdc->sdc_reset = now;
468 sdc->sdc_pri_check = -1; /* force mismatch below */
473 if (baseO > sdc->sdc_base_O || baseR > sdc->sdc_base_R) {
475 baseO = sdc->sdc_base_O;
476 baseR = sdc->sdc_base_R;
480 *O = (sdc->sdc_base_O - baseO);
481 *R = (sdc->sdc_base_R - baseR);
492 if (!update && sdc->sdc_pri_check == now) {
498 sdc->sdc_pri_check = now;
499 mstate_systhread_times(t, &sdc->sdc_cur_O, &sdc->sdc_cur_R);
500 *newO = sdc->sdc_cur_O;
512 if (sdc->sdc_cur_O < sdc->sdc_base_O ||
513 sdc->sdc_cur_R < sdc->sdc_base_R) {
515 sdc->sdc_base_O = sdc->sdc_cur_O;
516 sdc->sdc_base_R = sdc->sdc_cur_R;
522 *O = sdc->sdc_cur_O - sdc->sdc_base_O;
523 *R = sdc->sdc_cur_R - sdc->sdc_base_R;
530 * sdc->sdc_epri. Returns 1 if a priority update should occur
535 sysdc_compute_pri(sysdc_t *sdc, uint_t flags)
537 kthread_t *const t = sdc->sdc_thread;
546 sysdc_update_times(sdc, flags, &O, &R, &newO);
551 sdc->sdc_cur_DC = (O * SYSDC_DC_MAX) / (O + R);
554 if (sdc->sdc_cur_DC < sdc->sdc_target_DC)
555 sdc->sdc_pri = sdc->sdc_maxpri;
557 sdc->sdc_pri = sdc->sdc_minpri;
565 if (sdc->sdc_pset->sdp_need_break) {
567 sdc->sdc_epri = sdc->sdc_minpri;
569 sdc->sdc_epri = sdc->sdc_pri;
573 kthread_t *, t, pri_t, sdc->sdc_epri, uint_t, sdc->sdc_cur_DC,
574 uint_t, sdc->sdc_target_DC);
588 ASSERT(t->t_cpupart == sdc->sdc_pset->sdp_cpupart);
591 if (t->t_pri == sdc->sdc_maxpri &&
592 sdc->sdc_last_base_O != 0 &&
593 sdc->sdc_last_base_O < newO) {
594 sdc->sdc_last_O = newO - sdc->sdc_last_base_O;
595 sdc->sdc_pset->sdp_onproc_time +=
596 (uint64_t)sdc->sdc_last_O;
597 sdc->sdc_pset->sdp_onproc_threads++;
599 sdc->sdc_last_O = 0;
601 sdc->sdc_last_base_O = newO;
603 sdc->sdc_update_ticks = sdc->sdc_ticks + sysdc_update_ticks + 1;
614 ASSERT(sdc->sdc_ticks == sdc->sdc_update_ticks);
615 sdc->sdc_update_ticks = sdc->sdc_ticks + sysdc_update_ticks;
623 return (sdc->sdc_epri != t->t_pri);
627 sysdc_update_pri(sysdc_t *sdc, uint_t flags)
629 kthread_t *t = sdc->sdc_thread;
633 if (sysdc_compute_pri(sdc, flags)) {
634 if (!thread_change_pri(t, sdc->sdc_epri, 0)) {
645 sysdc_activate(sysdc_t *sdc)
647 sysdc_t *volatile *headp = &SYSDC_LIST(sdc)->sdl_list;
649 kthread_t *t = sdc->sdc_thread;
653 ASSERT(sdc->sdc_next == NULL);
658 sdc->sdc_next = head;
659 } while (atomic_cas_ptr(headp, head, sdc) != head);
728 sysdc_t *const sdc = *prevptr;
729 kthread_t *const t = sdc->sdc_thread;
736 *prevptr = sdc->sdc_next;
738 sdc->sdc_next = freelist;
739 freelist = sdc;
746 prevptr = &sdc->sdc_next;
750 ASSERT(t->t_cldata == sdc);
758 sdc->sdc_sleep_updates != 0 &&
759 (sdc->sdc_sleep_updates - sdc->sdc_nupdates) >
761 *prevptr = sdc->sdc_next;
763 sdc->sdc_next = NULL;
767 sysdc_update_pri(sdc, SDC_UPDATE_TIMEOUT);
770 prevptr = &sdc->sdc_next;
849 sysdc_t *sdc;
857 sdc = t->t_cldata;
864 ASSERT(sdc->sdc_sleep_updates == 0);
867 ASSERT(sdc->sdc_ticks != sdc->sdc_update_ticks);
868 sdc->sdc_ticks++;
869 if (sdc->sdc_ticks == sdc->sdc_update_ticks) {
871 sysdc_update_pri(sdc, SDC_UPDATE_TICK);
872 ASSERT(sdc->sdc_ticks != sdc->sdc_update_ticks);
880 sysdc_t *sdc = t->t_cldata;
884 sdc->sdc_sleep_updates = 0;
886 if (sdc->sdc_next == NULL) {
891 if (sysdc_compute_pri(sdc, 0)) {
892 THREAD_CHANGE_PRI(t, sdc->sdc_epri);
894 sysdc_activate(sdc);
896 ASSERT(sdc->sdc_next != NULL);
911 sysdc_t *sdc = t->t_cldata;
915 sdc->sdc_sleep_updates = sdc->sdc_nupdates;
924 sysdc_t *sdc = bufp;
926 sysdc_pset_t *newpset = sdc->sdc_pset;
943 sdc->sdc_thread = t;
944 sdc->sdc_pri = sdpp->sdp_maxpri; /* start off maximally */
945 sdc->sdc_minpri = sdpp->sdp_minpri;
946 sdc->sdc_maxpri = sdpp->sdp_maxpri;
947 sdc->sdc_target_DC = sdpp->sdp_DC;
948 sdc->sdc_ticks = 0;
949 sdc->sdc_update_ticks = sysdc_update_ticks + 1;
952 sdc->sdc_pset = NULL;
969 sdc->sdc_pset = pset;
982 t->t_cldata = sdc;
985 sysdc_update_pri(sdc, SDC_UPDATE_INITIAL);
997 sysdc_leave(sysdc_t *sdc)
999 sysdc_pset_t *sdp = sdc->sdc_pset;
1000 sysdc_list_t *sdl = SYSDC_LIST(sdc);
1004 sdc->sdc_thread = NULL;
1005 freedc = (sdc->sdc_next == NULL);
1020 kmem_free(sdc, sizeof (*sdc));
1042 sysdc_t *sdc;
1047 sdc = t->t_cldata;
1055 /* Unlink the sdc from everything. */
1056 sysdc_leave(sdc);
1135 sysdc_t *sdc = p;
1137 if (sdc != NULL) {
1142 ASSERT(sdc->sdc_pset != NULL);
1143 ASSERT(sdc->sdc_pset->sdp_cpupart == NULL);
1144 kmem_free(sdc->sdc_pset, sizeof (*sdc->sdc_pset));
1145 kmem_free(sdc, sizeof (*sdc));