Print this page
NEX-13937 Improve kstat performance
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-4425 support KSTAT_DATA_STRING in non-virtual named kstats
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
*** 1304,1327 ****
kstat_delete_byname(const char *ks_module, int ks_instance, const char *ks_name)
{
kstat_delete_byname_zone(ks_module, ks_instance, ks_name, ALL_ZONES);
}
- /*
- * The sparc V9 versions of these routines can be much cheaper than
- * the poor 32-bit compiler can comprehend, so they're in sparcv9_subr.s.
- * For simplicity, however, we always feed the C versions to lint.
- */
- #if !defined(__sparc) || defined(lint) || defined(__lint)
-
void
! kstat_waitq_enter(kstat_io_t *kiop)
{
! hrtime_t new, delta;
ulong_t wcnt;
! new = gethrtime_unscaled();
delta = new - kiop->wlastupdate;
kiop->wlastupdate = new;
wcnt = kiop->wcnt++;
if (wcnt != 0) {
kiop->wlentime += delta * wcnt;
--- 1304,1320 ----
kstat_delete_byname(const char *ks_module, int ks_instance, const char *ks_name)
{
kstat_delete_byname_zone(ks_module, ks_instance, ks_name, ALL_ZONES);
}
void
! kstat_waitq_enter_time(kstat_io_t *kiop, const hrtime_t new)
{
! hrtime_t delta;
ulong_t wcnt;
! ASSERT(kiop != NULL);
delta = new - kiop->wlastupdate;
kiop->wlastupdate = new;
wcnt = kiop->wcnt++;
if (wcnt != 0) {
kiop->wlentime += delta * wcnt;
*** 1328,1358 ****
kiop->wtime += delta;
}
}
void
! kstat_waitq_exit(kstat_io_t *kiop)
{
! hrtime_t new, delta;
ulong_t wcnt;
! new = gethrtime_unscaled();
delta = new - kiop->wlastupdate;
kiop->wlastupdate = new;
wcnt = kiop->wcnt--;
ASSERT((int)wcnt > 0);
kiop->wlentime += delta * wcnt;
kiop->wtime += delta;
}
void
! kstat_runq_enter(kstat_io_t *kiop)
{
! hrtime_t new, delta;
ulong_t rcnt;
! new = gethrtime_unscaled();
delta = new - kiop->rlastupdate;
kiop->rlastupdate = new;
rcnt = kiop->rcnt++;
if (rcnt != 0) {
kiop->rlentime += delta * rcnt;
--- 1321,1351 ----
kiop->wtime += delta;
}
}
void
! kstat_waitq_exit_time(kstat_io_t *kiop, const hrtime_t new)
{
! hrtime_t delta;
ulong_t wcnt;
! ASSERT(kiop != NULL);
delta = new - kiop->wlastupdate;
kiop->wlastupdate = new;
wcnt = kiop->wcnt--;
ASSERT((int)wcnt > 0);
kiop->wlentime += delta * wcnt;
kiop->wtime += delta;
}
void
! kstat_runq_enter_time(kstat_io_t *kiop, const hrtime_t new)
{
! hrtime_t delta;
ulong_t rcnt;
! ASSERT(kiop != NULL);
delta = new - kiop->rlastupdate;
kiop->rlastupdate = new;
rcnt = kiop->rcnt++;
if (rcnt != 0) {
kiop->rlentime += delta * rcnt;
*** 1359,1428 ****
kiop->rtime += delta;
}
}
void
! kstat_runq_exit(kstat_io_t *kiop)
{
! hrtime_t new, delta;
ulong_t rcnt;
! new = gethrtime_unscaled();
delta = new - kiop->rlastupdate;
kiop->rlastupdate = new;
rcnt = kiop->rcnt--;
ASSERT((int)rcnt > 0);
kiop->rlentime += delta * rcnt;
kiop->rtime += delta;
}
void
! kstat_waitq_to_runq(kstat_io_t *kiop)
{
! hrtime_t new, delta;
! ulong_t wcnt, rcnt;
! new = gethrtime_unscaled();
! delta = new - kiop->wlastupdate;
! kiop->wlastupdate = new;
! wcnt = kiop->wcnt--;
! ASSERT((int)wcnt > 0);
! kiop->wlentime += delta * wcnt;
! kiop->wtime += delta;
! delta = new - kiop->rlastupdate;
! kiop->rlastupdate = new;
! rcnt = kiop->rcnt++;
! if (rcnt != 0) {
! kiop->rlentime += delta * rcnt;
! kiop->rtime += delta;
! }
}
void
! kstat_runq_back_to_waitq(kstat_io_t *kiop)
{
! hrtime_t new, delta;
! ulong_t wcnt, rcnt;
! new = gethrtime_unscaled();
!
! delta = new - kiop->rlastupdate;
! kiop->rlastupdate = new;
! rcnt = kiop->rcnt--;
! ASSERT((int)rcnt > 0);
! kiop->rlentime += delta * rcnt;
! kiop->rtime += delta;
!
! delta = new - kiop->wlastupdate;
! kiop->wlastupdate = new;
! wcnt = kiop->wcnt++;
! if (wcnt != 0) {
! kiop->wlentime += delta * wcnt;
! kiop->wtime += delta;
! }
}
#endif
void
--- 1352,1422 ----
kiop->rtime += delta;
}
}
void
! kstat_runq_exit_time(kstat_io_t *kiop, const hrtime_t new)
{
! hrtime_t delta;
ulong_t rcnt;
! ASSERT(kiop != NULL);
delta = new - kiop->rlastupdate;
kiop->rlastupdate = new;
rcnt = kiop->rcnt--;
ASSERT((int)rcnt > 0);
kiop->rlentime += delta * rcnt;
kiop->rtime += delta;
}
+ /*
+ * The sparc V9 versions of these routines can be much cheaper than
+ * the poor 32-bit compiler can comprehend, so they're in sparcv9_subr.s.
+ * For simplicity, however, we always feed the C versions to lint.
+ */
+ #if !defined(__sparc) || defined(lint) || defined(__lint)
+
void
! kstat_waitq_enter(kstat_io_t *kiop)
{
! kstat_waitq_enter_time(kiop, gethrtime_unscaled());
! }
! void
! kstat_waitq_exit(kstat_io_t *kiop)
! {
! kstat_waitq_exit_time(kiop, gethrtime_unscaled());
! }
! void
! kstat_runq_enter(kstat_io_t *kiop)
! {
! kstat_runq_enter_time(kiop, gethrtime_unscaled());
! }
! void
! kstat_runq_exit(kstat_io_t *kiop)
! {
! kstat_runq_exit_time(kiop, gethrtime_unscaled());
}
void
! kstat_waitq_to_runq(kstat_io_t *kiop)
{
! hrtime_t new = gethrtime_unscaled();
! ASSERT(kiop != NULL);
! kstat_waitq_exit_time(kiop, new);
! kstat_runq_enter_time(kiop, new);
! }
! void
! kstat_runq_back_to_waitq(kstat_io_t *kiop)
! {
! hrtime_t new = gethrtime_unscaled();
! ASSERT(kiop != NULL);
! kstat_runq_exit_time(kiop, new);
! kstat_waitq_enter_time(kiop, new);
}
#endif
void