cyclic
extern int cyclic(uintptr_t, uint_t, int, const mdb_arg_t *);
{ "cyclic", ":", "developer information", cyclic },
ch_init_cyclic(void *adapter, p_ch_cyclic_t cyclic,
cyclic->func = poll_func;
cyclic->arg = arg;
cyclic->timer = 0;
ch_cyclic(p_ch_cyclic_t cyclic)
if (cyclic->timer != 0) {
cyclic->func(cyclic->arg);
cyclic->timer = timeout((void(*)(void *))ch_cyclic,
(void *)cyclic, cyclic->period);
ch_start_cyclic(p_ch_cyclic_t cyclic, unsigned long period)
cyclic->period = drv_usectohz(period * 1000);
if (cyclic->timer == 0) {
cyclic->timer = timeout((void(*)(void *))ch_cyclic,
(void *)cyclic, cyclic->period);
ch_stop_cyclic(p_ch_cyclic_t cyclic)
timer = cyclic->timer;
cyclic->timer = 0;
drv_usecwait(drv_hztousec(2 * cyclic->period));
cyclic_id_t cyclic, qcyclic;
cyclic = cyclic_add(&hdlr, &when);
ct->ct_cyclic = cyclic;
if (cyclic->cy_interval == CY_INFINITY)
exp += cyclic->cy_interval;
hrtime_t interval = cyclic->cy_interval;
cyclic->cy_expire = exp;
cyclic_remove_pend(cyc_cpu_t *cpu, cyc_level_t level, cyclic_t *cyclic)
cyc_func_t handler = cyclic->cy_handler;
void *arg = cyclic->cy_arg;
ASSERT(cyclic->cy_flags & CYF_FREE);
ASSERT(cyclic->cy_pend == 0);
CYC_TRACE(cpu, level, "remove-rpend", cyclic, cpu->cyp_rpend);
DTRACE_PROBE1(cyclic__start, cyclic_t *, cyclic);
DTRACE_PROBE1(cyclic__end, cyclic_t *, cyclic);
cyclic_t *cyclic = &cyclics[buf[consmasked]];
cyc_func_t handler = cyclic->cy_handler;
void *arg = cyclic->cy_arg;
CYC_TRACE(cpu, level, "consuming", consndx, cyclic);
DTRACE_PROBE1(cyclic__start, cyclic_t *, cyclic);
DTRACE_PROBE1(cyclic__end, cyclic_t *, cyclic);
pend = cyclic->cy_pend;
cyclic_remove_pend(cpu, level, cyclic);
cyclic = &cyclics[buf[consmasked]];
ASSERT(cyclic->cy_handler == handler);
ASSERT(cyclic->cy_arg == arg);
atomic_cas_32(&cyclic->cy_pend, pend, npend)) !=
(cyclic->cy_flags & CYF_FREE)))));
cyclic_t *cyclic;
cyclic = &cpu->cyp_cyclics[ndx];
ASSERT(cyclic->cy_flags == CYF_FREE);
cyclic->cy_interval = when->cyt_interval;
cyclic->cy_expire = (gethrtime() / cyclic->cy_interval + 1) *
cyclic->cy_interval;
cyclic->cy_expire = when->cyt_when;
cyclic->cy_handler = hdlr->cyh_func;
cyclic->cy_arg = hdlr->cyh_arg;
cyclic->cy_level = hdlr->cyh_level;
cyclic->cy_flags = arg->cyx_flags;
hrtime_t exp = cyclic->cy_expire;
CYC_TRACE(cpu, CY_HIGH_LEVEL, "add-reprog", cyclic, exp);
cyclic_t *cyclic;
cyclic = &cpu->cyp_cyclics[ndx];
arg->cyx_when->cyt_when = cyclic->cy_expire;
arg->cyx_when->cyt_interval = cyclic->cy_interval;
if (cyclic->cy_pend != 0) {
ASSERT(cyclic->cy_level != CY_HIGH_LEVEL);
CYC_TRACE1(cpu, CY_HIGH_LEVEL, "remove-pend", cyclic->cy_pend);
cpu->cyp_rpend = cyclic->cy_pend;
cyclic->cy_pend = 0;
cyclic->cy_flags = CYF_FREE;
cyclic = &cpu->cyp_cyclics[heap[0]];
be->cyb_reprogram(bar, cyclic->cy_expire);
cyclic_t *cyclic = &cpu->cyp_cyclics[ndx];
cyc_level_t level = cyclic->cy_level;
cyclic_t *cyclic;
cyclic = &cpu->cyp_cyclics[ndx];
oexpire = cyclic->cy_expire;
cyclic->cy_expire = expire;
cyclic = &cpu->cyp_cyclics[heap[0]];
be->cyb_reprogram(bar, cyclic->cy_expire);
cyclic_t *cyclic;
cyclic = &src->cyp_cyclics[ndx];
flags = cyclic->cy_flags;
hdlr.cyh_func = cyclic->cy_handler;
hdlr.cyh_level = cyclic->cy_level;
hdlr.cyh_arg = cyclic->cy_arg;
if (delay > (cyclic->cy_interval >> 1))
delay = cyclic->cy_interval >> 1;
cyclic_t *cyclic = &cpu->cyp_cyclics[ndx];
ASSERT(!(cyclic->cy_flags & CYF_FREE));
if ((dest = cyclic_pick_cpu(part, c, c, cyclic->cy_flags)) == NULL) {
cyclic_t *cyclic = &cpu->cyp_cyclics[idp->cyi_ndx];
ASSERT(!(cyclic->cy_flags & CYF_FREE));
ASSERT(cyclic->cy_flags & CYF_CPU_BOUND);
cyclic->cy_flags &= ~CYF_CPU_BOUND;
(!res && (cyclic->cy_flags & CYF_PART_BOUND)));
cyclic_t *cyclic = &cpu->cyp_cyclics[idp->cyi_ndx];
ASSERT(!(cyclic->cy_flags & CYF_FREE));
ASSERT(!(cyclic->cy_flags & CYF_CPU_BOUND));
dest = cyclic_pick_cpu(part, d, NULL, cyclic->cy_flags | CYF_CPU_BOUND);
cyclic = &dest->cyp_cyclics[idp->cyi_ndx];
cyclic->cy_flags |= CYF_CPU_BOUND;
cyclic_t *cyclic = &cpu->cyp_cyclics[cpu->cyp_heap[0]];
hrtime_t exp = cyclic->cy_expire;
CYC_TRACE(cpu, CY_HIGH_LEVEL, "resume-reprog", cyclic, exp);
cyclic_t *cyclic;
cyclic = &cpu->cyp_cyclics[idp->cyi_ndx];
if (cyclic->cy_flags & CYF_CPU_BOUND)
ASSERT(cyclic->cy_flags & CYF_PART_BOUND);
cyclic_t *cyclic, *cyclics = cpu->cyp_cyclics;
cyclic = &cyclics[idp->cyi_ndx];
if (!(cyclic->cy_flags & CYF_PART_BOUND))
dest = cyclic_pick_cpu(part, c, c, cyclic->cy_flags);
cyclic_expire(cyc_cpu_t *cpu, cyc_index_t ndx, cyclic_t *cyclic)
cyc_level_t level = cyclic->cy_level;
cyc_func_t handler = cyclic->cy_handler;
void *arg = cyclic->cy_arg;
DTRACE_PROBE1(cyclic__start, cyclic_t *, cyclic);
DTRACE_PROBE1(cyclic__end, cyclic_t *, cyclic);
if (cyclic->cy_pend++ == 0) {
CYC_TRACE(cpu, CY_HIGH_LEVEL, "expire-enq", cyclic,
if (cyclic->cy_pend == 0) {
CYC_TRACE1(cpu, CY_HIGH_LEVEL, "expire-wrap", cyclic);
cyclic->cy_pend = UINT32_MAX;
CYC_TRACE(cpu, CY_HIGH_LEVEL, "expire-bump", cyclic, 0);
be->cyb_softint(be->cyb_arg, cyclic->cy_level);
cyclic_t *cyclic, *cyclics = cpu->cyp_cyclics;
cyclic = &cyclics[ndx];
ASSERT(!(cyclic->cy_flags & CYF_FREE));
CYC_TRACE(cpu, CY_HIGH_LEVEL, "fire-check", cyclic,
cyclic->cy_expire);
if ((exp = cyclic->cy_expire) > now)
cyclic_expire(cpu, ndx, cyclic);
if (exp != cyclic->cy_expire) {
cyclic_id_t cyclic;
cyclic = p->p_rprof_cyclic;
if (cyclic != CYCLIC_NONE)
cyclic_remove(cyclic);
cyclic = cyclic_add(&hdlr, &when);
cyclic_remove(cyclic);
p->p_rprof_cyclic = cyclic;
cyclic_id_t cyclic;
if ((cyclic = p->p_rprof_cyclic) == CYCLIC_NONE) {
cyclic_remove(cyclic);