Index: sys/kern/subr_sleepqueue.c =================================================================== --- sys/kern/subr_sleepqueue.c (revision 236815) +++ sys/kern/subr_sleepqueue.c (working copy) @@ -374,7 +374,7 @@ sleepq_set_timeout_bt(void *wchan, struct bintime MPASS(TD_ON_SLEEPQ(td)); MPASS(td->td_sleepqueue == NULL); MPASS(wchan != NULL); - callout_reset_bt_on(&td->td_slpcallout, bt, sleepq_timeout, td, PCPU_GET(cpuid), 0); + callout_reset_bt_on(&td->td_slpcallout, bt, sleepq_timeout, td, PCPU_GET(cpuid), 1); } void Index: sys/kern/kern_timeout.c =================================================================== --- sys/kern/kern_timeout.c (revision 236894) +++ sys/kern/kern_timeout.c (working copy) @@ -81,7 +81,7 @@ SYSCTL_INT(_debug, OID_AUTO, to_avg_mpcalls, CTLFL * TODO: * allocate more timeout table slots when table overflows. */ -int callwheelsize, callwheelbits, callwheelmask; +int callwheelsize, callwheelmask; /* * The callout cpu migration entity represents informations necessary for @@ -225,10 +225,7 @@ kern_timeout_callwheel_alloc(caddr_t v) /* * Calculate callout wheel size */ - for (callwheelsize = 1, callwheelbits = 0; - callwheelsize < ncallout; - callwheelsize <<= 1, ++callwheelbits) - ; + for (callwheelsize = 1; callwheelsize < ncallout; callwheelsize <<= 1); callwheelmask = callwheelsize - 1; cc->cc_callout = (struct callout *)v; @@ -359,13 +356,11 @@ get_bucket(struct bintime *bt) void callout_tick(void) { + struct bintime next, now; struct callout *tmp; struct callout_cpu *cc; struct callout_tailq *sc; - struct bintime now; - struct bintime limit; - struct bintime next; - int cpu, first, flag, future, last, need_softclock; + int cpu, first, future, last, need_softclock; /* * Process callouts at a very low cpu priority, so we don't keep the @@ -375,8 +370,12 @@ callout_tick(void) cc = CC_SELF(); mtx_lock_spin_flags(&cc->cc_lock, MTX_QUIET); binuptime(&now); + cpu = curcpu; first = callout_hash(&cc->cc_softticks); last = callout_hash(&now); + next.sec = -1; + next.frac = -1; + future = ((last + 256) & callwheelmask); /* * Check if we wrapped around the entire wheel from the last scan. * In case, we need to scan entirely the wheel for pending callouts. @@ -389,19 +388,10 @@ callout_tick(void) first &= callwheelmask; last &= callwheelmask; } - cpu = curcpu; - next.sec = -1; - next .frac = -1; - limit.sec = 0; - limit.frac = 4611686018427250000; /* 1/4 sec */ - bintime_add(&limit,&now); - future = get_bucket(&limit); - flag = 0; for (;;) { sc = &cc->cc_callwheel[first]; TAILQ_FOREACH(tmp, sc, c_links.tqe) { - if ((!flag || flag == 1) && - bintime_cmp(&tmp->c_time, &now, <=)) { + if (bintime_cmp(&tmp->c_time, &now, <=)) { if (tmp->c_flags & CALLOUT_DIRECT) { tmp->c_func(tmp->c_arg); TAILQ_REMOVE(sc, tmp, c_links.tqe); @@ -415,8 +405,15 @@ callout_tick(void) need_softclock = 1; } } - if ((flag == 1 || flag == 2) && - bintime_cmp(&tmp->c_time, &now, >)) { + } + if (first == last) + break; + first = ((first + 1) & callwheelmask); + } + for (;;) { + sc = &cc->cc_callwheel[last]; + TAILQ_FOREACH(tmp, sc, c_links.tqe) { + if (bintime_cmp(&tmp->c_time, &now, >)) { if (next.sec == -1 || bintime_cmp(&tmp->c_time, &next, <)) { next = tmp->c_time; @@ -424,16 +421,15 @@ callout_tick(void) } } } - if (first == ((last - 1) & callwheelmask)) - flag = 1; - if (first == last) - flag = 2; - if (first == future || next.sec != -1) + if ((last == future) || (next.sec != -1)) break; - first = (first + 1) & callwheelmask; + last = ((last + 1) & callwheelmask); + } + if (next.sec == -1) { + next.sec = 0; + next.frac = (uint64_t)1 << (64 - 2); + bintime_add(&next, &now); } - if (next.sec == -1) - next = limit; cc->cc_firsttick = next; if (callout_new_inserted != NULL) (*callout_new_inserted)(cpu, next); Index: sys/dev/hwpmc/hwpmc_intel.c =================================================================== --- sys/dev/hwpmc/hwpmc_intel.c (revision 236814) +++ sys/dev/hwpmc/hwpmc_intel.c (working copy) @@ -143,7 +143,6 @@ pmc_intel_initialize(void) nclasses = 5; break; case 0x2A: /* Per Intel document 253669-039US 05/2011. */ - case 0x2D: /* Per Intel document 253669-041US 12/2011. */ cputype = PMC_CPU_INTEL_SANDYBRIDGE; nclasses = 5; break;