void pktsched_init(void) { init_machclk(); if (machclk_freq == 0) { panic("%s: no CPU clock available!\n", __func__); /* NOTREACHED */ } tcq_init(); qfq_init(); }
/* * set a token bucket regulator. * if the specified rate is zero, the token bucket regulator is deleted. */ static int tbr_set_locked(struct ifaltq *ifq, struct tb_profile *profile) { struct tb_regulator *tbr, *otbr; if (machclk_freq == 0) init_machclk(); if (machclk_freq == 0) { kprintf("%s: no cpu clock available!\n", __func__); return (ENXIO); } if (profile->rate == 0) { /* delete this tbr */ if ((tbr = ifq->altq_tbr) == NULL) return (ENOENT); ifq->altq_tbr = NULL; kfree(tbr, M_ALTQ); return (0); } tbr = kmalloc(sizeof(*tbr), M_ALTQ, M_WAITOK | M_ZERO); tbr->tbr_rate = TBR_SCALE(profile->rate / 8) / machclk_freq; tbr->tbr_depth = TBR_SCALE(profile->depth); if (tbr->tbr_rate > 0) tbr->tbr_filluptime = tbr->tbr_depth / tbr->tbr_rate; else tbr->tbr_filluptime = 0xffffffffffffffffLL; tbr->tbr_token = tbr->tbr_depth; tbr->tbr_last = read_machclk(); tbr->tbr_lastop = ALTDQ_REMOVE; otbr = ifq->altq_tbr; ifq->altq_tbr = tbr; /* set the new tbr */ if (otbr != NULL) kfree(otbr, M_ALTQ); else if (tbr_timer == 0) { callout_reset_bycpu(&tbr_callout, 1, tbr_timeout, NULL, 0); tbr_timer = 1; } return (0); }
void pktsched_init(void) { init_machclk(); if (machclk_freq == 0) { panic("%s: no CPU clock available!\n", __func__); /* NOTREACHED */ } tcq_init(); qfq_init(); #if PKTSCHED_PRIQ priq_init(); #endif /* PKTSCHED_PRIQ */ #if PKTSCHED_FAIRQ fairq_init(); #endif /* PKTSCHED_FAIRQ */ #if PKTSCHED_CBQ cbq_init(); #endif /* PKTSCHED_CBQ */ #if PKTSCHED_HFSC hfsc_init(); #endif /* PKTSCHED_HFSC */ }