/* * Issue the hcall to get the L0-host stats. * Should be called with l0-stat lock held
*/ staticint kvmppc_update_l0_stats(void)
{ int rc;
/* With HOST_WIDE flags guestid and vcpuid will be ignored */
rc = kvmppc_gsb_recv(gsb_l0_stats, KVMPPC_GS_FLAGS_HOST_WIDE); if (rc) goto out;
/* Parse the guest state buffer is successful */
rc = kvmppc_gse_parse(&gsp_l0_stats, gsb_l0_stats); if (rc) goto out;
/* Update the l0 returned stats*/
memset(&l0_stats, 0, sizeof(l0_stats));
rc = kvmppc_gsm_refresh_info(gsm_l0_stats, gsb_l0_stats);
out: return rc;
}
/* Update the value of the given perf_event */ staticint kvmppc_pmu_event_update(struct perf_event *event)
{ int rc;
u64 curr_val, prev_val; unsignedlong flags; unsignedint config = event->attr.config;
/* Ensure no one else is modifying the l0_stats */
spin_lock_irqsave(&lock_l0_stats, flags);
rc = kvmppc_update_l0_stats(); if (!rc) { switch (config) { case KVMPPC_EVENT_HOST_HEAP:
curr_val = l0_stats.guest_heap; break; case KVMPPC_EVENT_HOST_HEAP_MAX:
curr_val = l0_stats.guest_heap_max; break; case KVMPPC_EVENT_HOST_PGTABLE:
curr_val = l0_stats.guest_pgtable_size; break; case KVMPPC_EVENT_HOST_PGTABLE_MAX:
curr_val = l0_stats.guest_pgtable_size_max; break; case KVMPPC_EVENT_HOST_PGTABLE_RECLAIM:
curr_val = l0_stats.guest_pgtable_reclaim; break; default:
rc = -ENOENT; break;
}
}
spin_unlock_irqrestore(&lock_l0_stats, flags);
/* If no error than update the perf event */ if (!rc) {
prev_val = local64_xchg(&event->hw.prev_count, curr_val); if (curr_val > prev_val)
local64_add(curr_val - prev_val, &event->count);
}
for (int i = 0; i < ARRAY_SIZE(ids); i++)
size += kvmppc_gse_total_size(kvmppc_gsid_size(ids[i])); return size;
}
/* Populate the request guest state buffer */ staticint hostwide_fill_info(struct kvmppc_gs_buff *gsb, struct kvmppc_gs_msg *gsm)
{ int rc = 0; struct kvmppc_hostwide_stats *stats = gsm->data;
/* * It doesn't matter what values are put into request buffer as * they are going to be overwritten anyways. But for the sake of * testcode and symmetry contents of existing stats are put * populated into the request guest state buffer.
*/ if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_HEAP))
rc = kvmppc_gse_put_u64(gsb,
KVMPPC_GSID_L0_GUEST_HEAP,
stats->guest_heap);
if (!rc && kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_HEAP_MAX))
rc = kvmppc_gse_put_u64(gsb,
KVMPPC_GSID_L0_GUEST_HEAP_MAX,
stats->guest_heap_max);
if (!rc && kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE))
rc = kvmppc_gse_put_u64(gsb,
KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE,
stats->guest_pgtable_size); if (!rc &&
kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX))
rc = kvmppc_gse_put_u64(gsb,
KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX,
stats->guest_pgtable_size_max); if (!rc &&
kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM))
rc = kvmppc_gse_put_u64(gsb,
KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM,
stats->guest_pgtable_reclaim);
return rc;
}
/* Parse and update the host wide stats from returned gsb */ staticint hostwide_refresh_info(struct kvmppc_gs_msg *gsm, struct kvmppc_gs_buff *gsb)
{ struct kvmppc_gs_parser gsp = { 0 }; struct kvmppc_hostwide_stats *stats = gsm->data; struct kvmppc_gs_elem *gse; int rc;
rc = kvmppc_gse_parse(&gsp, gsb); if (rc < 0) return rc;
gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_HEAP); if (gse)
stats->guest_heap = kvmppc_gse_get_u64(gse);
gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_HEAP_MAX); if (gse)
stats->guest_heap_max = kvmppc_gse_get_u64(gse);
gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE); if (gse)
stats->guest_pgtable_size = kvmppc_gse_get_u64(gse);
gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX); if (gse)
stats->guest_pgtable_size_max = kvmppc_gse_get_u64(gse);
gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM); if (gse)
stats->guest_pgtable_reclaim = kvmppc_gse_get_u64(gse);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.