Print this page
9936 atomic ops in syscall_mstate() induce significant overhead
9942 zone secflags are not initialized correctly
*** 19,29 ****
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
! * Copyright 2012 Joyent, Inc. All rights reserved.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
! * Copyright (c) 2018, Joyent, Inc.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
*** 414,433 ****
while (newtime < 0) {
curtime = gethrtime_unscaled();
newtime = curtime - ms->ms_state_start;
}
*mstimep += newtime;
- if (fromms == LMS_USER)
- atomic_add_64(&z->zone_utime, newtime);
- else if (fromms == LMS_SYSTEM)
- atomic_add_64(&z->zone_stime, newtime);
t->t_mstate = toms;
ms->ms_state_start = curtime;
ms->ms_prev = fromms;
kpreempt_disable(); /* don't change CPU while changing CPU's state */
cpu = CPU;
ASSERT(cpu == t->t_cpu);
if ((toms != LMS_USER) && (cpu->cpu_mstate != CMS_SYSTEM)) {
NEW_CPU_MSTATE(CMS_SYSTEM);
} else if ((toms == LMS_USER) && (cpu->cpu_mstate != CMS_USER)) {
NEW_CPU_MSTATE(CMS_USER);
}
--- 414,438 ----
while (newtime < 0) {
curtime = gethrtime_unscaled();
newtime = curtime - ms->ms_state_start;
}
*mstimep += newtime;
t->t_mstate = toms;
ms->ms_state_start = curtime;
ms->ms_prev = fromms;
kpreempt_disable(); /* don't change CPU while changing CPU's state */
cpu = CPU;
ASSERT(cpu == t->t_cpu);
+
+ if (fromms == LMS_USER) {
+ CPU_UARRAY_VAL(z->zone_ustate, cpu->cpu_id,
+ ZONE_USTATE_UTIME) += newtime;
+ } else if (fromms == LMS_SYSTEM) {
+ CPU_UARRAY_VAL(z->zone_ustate, cpu->cpu_id,
+ ZONE_USTATE_STIME) += newtime;
+ }
+
if ((toms != LMS_USER) && (cpu->cpu_mstate != CMS_SYSTEM)) {
NEW_CPU_MSTATE(CMS_SYSTEM);
} else if ((toms == LMS_USER) && (cpu->cpu_mstate != CMS_USER)) {
NEW_CPU_MSTATE(CMS_USER);
}
*** 651,673 ****
ms->ms_state_start = curtime;
} while (atomic_cas_64((uint64_t *)mstimep, oldtime, newtime) !=
oldtime);
/*
- * When the system boots the initial startup thread will have a
- * ms_state_start of 0 which would add a huge system time to the global
- * zone. We want to skip aggregating that initial bit of work.
- */
- if (origstart != 0) {
- z = ttozone(t);
- if (state == LMS_USER)
- atomic_add_64(&z->zone_utime, ztime);
- else if (state == LMS_SYSTEM)
- atomic_add_64(&z->zone_stime, ztime);
- }
-
- /*
* Remember the previous running microstate.
*/
if (state != LMS_SLEEP && state != LMS_STOPPED)
ms->ms_prev = state;
--- 656,665 ----
*** 674,684 ****
--- 666,694 ----
/*
* Switch CPU microstate if appropriate
*/
kpreempt_disable(); /* MUST disable kpreempt before touching t->cpu */
+
ASSERT(t->t_cpu == CPU);
+
+ /*
+ * When the system boots the initial startup thread will have a
+ * ms_state_start of 0 which would add a huge system time to the global
+ * zone. We want to skip aggregating that initial bit of work.
+ */
+ if (origstart != 0) {
+ z = ttozone(t);
+ if (state == LMS_USER) {
+ CPU_UARRAY_VAL(z->zone_ustate, t->t_cpu->cpu_id,
+ ZONE_USTATE_UTIME) += ztime;
+ } else if (state == LMS_SYSTEM) {
+ CPU_UARRAY_VAL(z->zone_ustate, t->t_cpu->cpu_id,
+ ZONE_USTATE_STIME) += ztime;
+ }
+ }
+
if (!CPU_ON_INTR(t->t_cpu) && curthread->t_intr == NULL) {
if (new_state == LMS_USER && t->t_cpu->cpu_mstate != CMS_USER)
new_cpu_mstate(CMS_USER, curtime);
else if (new_state != LMS_USER &&
t->t_cpu->cpu_mstate != CMS_SYSTEM)
*** 781,791 ****
* Update the WAIT_CPU timer and per-cpu waitrq total.
*/
z = ttozone(t);
waittime = curtime - waitrq;
ms->ms_acct[LMS_WAIT_CPU] += waittime;
! atomic_add_64(&z->zone_wtime, waittime);
CPU->cpu_waitrq += waittime;
ms->ms_state_start = curtime;
}
/*
--- 791,807 ----
* Update the WAIT_CPU timer and per-cpu waitrq total.
*/
z = ttozone(t);
waittime = curtime - waitrq;
ms->ms_acct[LMS_WAIT_CPU] += waittime;
!
! /*
! * We are in a disp context where we're not going to migrate CPUs.
! */
! CPU_UARRAY_VAL(z->zone_ustate, CPU->cpu_id,
! ZONE_USTATE_WTIME) += waittime;
!
CPU->cpu_waitrq += waittime;
ms->ms_state_start = curtime;
}
/*