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)
|
||||
{
|
||||
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 status, i;
|
||||
|
@ -361,7 +354,7 @@ int sigar_cpu_list_get(sigar_t *sigar, sigar_cpu_list_t *cpulist)
|
|||
uint_t cpuinfo[CPU_STATES];
|
||||
unsigned int i;
|
||||
int is_debug = SIGAR_LOG_IS_DEBUG(sigar);
|
||||
int reported_virtual = 0;
|
||||
sigar_cache_t *chips;
|
||||
|
||||
if (sigar_kstat_update(sigar) == -1) {
|
||||
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",
|
||||
sigar->ncpu);
|
||||
}
|
||||
|
||||
|
||||
chips = sigar_cache_new(16);
|
||||
chips->free_value = free_chip_id;
|
||||
|
||||
for (i=0; i<sigar->ncpu; i++) {
|
||||
sigar_cpu_t *cpu;
|
||||
char *buf;
|
||||
int chip_id;
|
||||
sigar_cache_entry_t *ent;
|
||||
|
||||
if (!CPU_ONLINE(sigar->ks.cpuid[i])) {
|
||||
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 += sizeof(kmutex_t);
|
||||
memcpy(&cpuinfo[0], buf, sizeof(cpuinfo));
|
||||
chip_id = get_chip_id(sigar, i);
|
||||
|
||||
if (is_same_chip(sigar, i, cpulist->number)) {
|
||||
/* 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 {
|
||||
if (chip_id == -1) {
|
||||
SIGAR_CPU_LIST_GROW(cpulist);
|
||||
cpu = &cpulist->data[cpulist->number++];
|
||||
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->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->total = cpu->user + cpu->sys + cpu->idle + cpu->wait;
|
||||
}
|
||||
|
||||
|
||||
sigar_cache_destroy(chips);
|
||||
|
||||
return SIGAR_OK;
|
||||
}
|
||||
|
||||
|
@ -1627,6 +1637,8 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
|||
unsigned int i;
|
||||
int status = SIGAR_OK;
|
||||
int brand = -1;
|
||||
sigar_cache_t *chips;
|
||||
int is_debug = SIGAR_LOG_IS_DEBUG(sigar);
|
||||
|
||||
if (sigar_kstat_update(sigar) == -1) { /* for sigar->ncpu */
|
||||
return errno;
|
||||
|
@ -1654,12 +1666,29 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
|||
}
|
||||
|
||||
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++) {
|
||||
sigar_cpu_info_t *info;
|
||||
int chip_id = get_chip_id(sigar, i);
|
||||
|
||||
if (is_same_chip(sigar, i, cpu_infos->number)) {
|
||||
continue;
|
||||
if (chip_id != -1) {
|
||||
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);
|
||||
|
@ -1696,6 +1725,8 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
|||
info->cache_size = SIGAR_FIELD_NOTIMPL; /*XXX*/
|
||||
}
|
||||
|
||||
sigar_cache_destroy(chips);
|
||||
|
||||
return SIGAR_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue