improve logical processor folding
This commit is contained in:
parent
3dea5eb761
commit
407144e707
|
@ -300,6 +300,11 @@ static int get_chip_brand(sigar_t *sigar, int processor,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void free_chip_id(void *ptr)
|
||||||
|
{
|
||||||
|
/*noop*/
|
||||||
|
}
|
||||||
|
|
||||||
static int get_chip_id(sigar_t *sigar, int processor)
|
static int get_chip_id(sigar_t *sigar, int processor)
|
||||||
{
|
{
|
||||||
kstat_t *ksp = sigar->ks.cpu_info[processor];
|
kstat_t *ksp = sigar->ks.cpu_info[processor];
|
||||||
|
@ -316,18 +321,6 @@ static int get_chip_id(sigar_t *sigar, int processor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_same_chip(sigar_t *sigar, int processor, int num)
|
|
||||||
{
|
|
||||||
int chip_id = get_chip_id(sigar, processor);
|
|
||||||
|
|
||||||
if ((chip_id == -1) || (chip_id != (num-1))) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
|
int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
|
||||||
{
|
{
|
||||||
int status, i;
|
int status, i;
|
||||||
|
@ -361,7 +354,7 @@ int sigar_cpu_list_get(sigar_t *sigar, sigar_cpu_list_t *cpulist)
|
||||||
uint_t cpuinfo[CPU_STATES];
|
uint_t cpuinfo[CPU_STATES];
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int is_debug = SIGAR_LOG_IS_DEBUG(sigar);
|
int is_debug = SIGAR_LOG_IS_DEBUG(sigar);
|
||||||
int reported_virtual = 0;
|
sigar_cache_t *chips;
|
||||||
|
|
||||||
if (sigar_kstat_update(sigar) == -1) {
|
if (sigar_kstat_update(sigar) == -1) {
|
||||||
return errno;
|
return errno;
|
||||||
|
@ -386,10 +379,15 @@ int sigar_cpu_list_get(sigar_t *sigar, sigar_cpu_list_t *cpulist)
|
||||||
"[cpu_list] OS reports %d CPUs",
|
"[cpu_list] OS reports %d CPUs",
|
||||||
sigar->ncpu);
|
sigar->ncpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chips = sigar_cache_new(16);
|
||||||
|
chips->free_value = free_chip_id;
|
||||||
|
|
||||||
for (i=0; i<sigar->ncpu; i++) {
|
for (i=0; i<sigar->ncpu; i++) {
|
||||||
sigar_cpu_t *cpu;
|
sigar_cpu_t *cpu;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
int chip_id;
|
||||||
|
sigar_cache_entry_t *ent;
|
||||||
|
|
||||||
if (!CPU_ONLINE(sigar->ks.cpuid[i])) {
|
if (!CPU_ONLINE(sigar->ks.cpuid[i])) {
|
||||||
sigar_log_printf(sigar, SIGAR_LOG_INFO,
|
sigar_log_printf(sigar, SIGAR_LOG_INFO,
|
||||||
|
@ -431,22 +429,32 @@ int sigar_cpu_list_get(sigar_t *sigar, sigar_cpu_list_t *cpulist)
|
||||||
buf = ksp->ks_data;
|
buf = ksp->ks_data;
|
||||||
buf += sizeof(kmutex_t);
|
buf += sizeof(kmutex_t);
|
||||||
memcpy(&cpuinfo[0], buf, sizeof(cpuinfo));
|
memcpy(&cpuinfo[0], buf, sizeof(cpuinfo));
|
||||||
|
chip_id = get_chip_id(sigar, i);
|
||||||
|
|
||||||
if (is_same_chip(sigar, i, cpulist->number)) {
|
if (chip_id == -1) {
|
||||||
/* merge times of logical processors */
|
|
||||||
cpu = &cpulist->data[cpulist->number-1];
|
|
||||||
|
|
||||||
if (is_debug && !reported_virtual++) {
|
|
||||||
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
|
||||||
"[cpu_list] Merging times of"
|
|
||||||
" logical processors");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SIGAR_CPU_LIST_GROW(cpulist);
|
SIGAR_CPU_LIST_GROW(cpulist);
|
||||||
cpu = &cpulist->data[cpulist->number++];
|
cpu = &cpulist->data[cpulist->number++];
|
||||||
SIGAR_ZERO(cpu);
|
SIGAR_ZERO(cpu);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* merge times of logical processors */
|
||||||
|
ent = sigar_cache_get(chips, chip_id);
|
||||||
|
if (ent->value) {
|
||||||
|
cpu = (sigar_cpu_t *)ent->value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SIGAR_CPU_LIST_GROW(cpulist);
|
||||||
|
cpu = &cpulist->data[cpulist->number++];
|
||||||
|
SIGAR_ZERO(cpu);
|
||||||
|
ent->value = cpu;
|
||||||
|
if (is_debug) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"[cpu_list] Merging times of"
|
||||||
|
" logical processors for chip_id=%d",
|
||||||
|
chip_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cpu->user += SIGAR_TICK2MSEC(cpuinfo[CPU_USER]);
|
cpu->user += SIGAR_TICK2MSEC(cpuinfo[CPU_USER]);
|
||||||
cpu->sys += SIGAR_TICK2MSEC(cpuinfo[CPU_KERNEL]);
|
cpu->sys += SIGAR_TICK2MSEC(cpuinfo[CPU_KERNEL]);
|
||||||
|
@ -455,7 +463,9 @@ int sigar_cpu_list_get(sigar_t *sigar, sigar_cpu_list_t *cpulist)
|
||||||
cpu->nice += 0; /* no cpu->nice */
|
cpu->nice += 0; /* no cpu->nice */
|
||||||
cpu->total = cpu->user + cpu->sys + cpu->idle + cpu->wait;
|
cpu->total = cpu->user + cpu->sys + cpu->idle + cpu->wait;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sigar_cache_destroy(chips);
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1627,6 +1637,8 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int status = SIGAR_OK;
|
int status = SIGAR_OK;
|
||||||
int brand = -1;
|
int brand = -1;
|
||||||
|
sigar_cache_t *chips;
|
||||||
|
int is_debug = SIGAR_LOG_IS_DEBUG(sigar);
|
||||||
|
|
||||||
if (sigar_kstat_update(sigar) == -1) { /* for sigar->ncpu */
|
if (sigar_kstat_update(sigar) == -1) { /* for sigar->ncpu */
|
||||||
return errno;
|
return errno;
|
||||||
|
@ -1654,12 +1666,29 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
||||||
}
|
}
|
||||||
|
|
||||||
sigar_cpu_info_list_create(cpu_infos);
|
sigar_cpu_info_list_create(cpu_infos);
|
||||||
|
chips = sigar_cache_new(16);
|
||||||
|
chips->free_value = free_chip_id;
|
||||||
|
|
||||||
for (i=0; i<sigar->ncpu; i++) {
|
for (i=0; i<sigar->ncpu; i++) {
|
||||||
sigar_cpu_info_t *info;
|
sigar_cpu_info_t *info;
|
||||||
|
int chip_id = get_chip_id(sigar, i);
|
||||||
|
|
||||||
if (is_same_chip(sigar, i, cpu_infos->number)) {
|
if (chip_id != -1) {
|
||||||
continue;
|
sigar_cache_entry_t *ent =
|
||||||
|
sigar_cache_get(chips, chip_id);
|
||||||
|
|
||||||
|
if (ent->value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ent->value = chips; /*anything non-NULL*/
|
||||||
|
if (is_debug) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"[cpu_list] Merging info of"
|
||||||
|
" logical processors for chip_id=%d",
|
||||||
|
chip_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SIGAR_CPU_INFO_LIST_GROW(cpu_infos);
|
SIGAR_CPU_INFO_LIST_GROW(cpu_infos);
|
||||||
|
@ -1696,6 +1725,8 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
||||||
info->cache_size = SIGAR_FIELD_NOTIMPL; /*XXX*/
|
info->cache_size = SIGAR_FIELD_NOTIMPL; /*XXX*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sigar_cache_destroy(chips);
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue