|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 1/2] xen/memory : Add stats_table resource type
Allow to map vcpu stats using acquire_resource().
Signed-off-by: Matias Ezequiel Vara Larsen <matias.vara@xxxxxxxx>
---
xen/common/domain.c | 42 +++++++++++++++++++++++++++++++++++++
xen/common/memory.c | 29 +++++++++++++++++++++++++
xen/common/sched/core.c | 5 +++++
xen/include/public/memory.h | 1 +
xen/include/xen/sched.h | 5 +++++
5 files changed, 82 insertions(+)
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 17cc32fde3..ddd9f88874 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -132,6 +132,42 @@ static void vcpu_info_reset(struct vcpu *v)
v->vcpu_info_mfn = INVALID_MFN;
}
+static void stats_free_buffer(struct vcpu * v)
+{
+ struct page_info *pg = v->stats.pg;
+
+ if ( !pg )
+ return;
+
+ v->stats.va = NULL;
+
+ if ( v->stats.va )
+ unmap_domain_page_global(v->stats.va);
+
+ v->stats.va = NULL;
+
+ free_domheap_page(pg);
+}
+
+static int stats_alloc_buffer(struct vcpu *v)
+{
+ struct domain *d = v->domain;
+ struct page_info *pg;
+
+ pg = alloc_domheap_page(d, MEMF_no_refcount);
+
+ if ( !pg )
+ return -ENOMEM;
+
+ v->stats.va = __map_domain_page_global(pg);
+ if ( !v->stats.va )
+ return -ENOMEM;
+
+ v->stats.pg = pg;
+ clear_page(v->stats.va);
+ return 0;
+}
+
static void vmtrace_free_buffer(struct vcpu *v)
{
const struct domain *d = v->domain;
@@ -203,6 +239,9 @@ static int vmtrace_alloc_buffer(struct vcpu *v)
*/
static int vcpu_teardown(struct vcpu *v)
{
+
+ stats_free_buffer(v);
+
vmtrace_free_buffer(v);
return 0;
@@ -269,6 +308,9 @@ struct vcpu *vcpu_create(struct domain *d, unsigned int
vcpu_id)
if ( vmtrace_alloc_buffer(v) != 0 )
goto fail_wq;
+ if ( stats_alloc_buffer(v) != 0 )
+ goto fail_wq;
+
if ( arch_vcpu_create(v) != 0 )
goto fail_sched;
diff --git a/xen/common/memory.c b/xen/common/memory.c
index 297b98a562..39de6d9d05 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -1099,6 +1099,10 @@ static unsigned int resource_max_frames(const struct
domain *d,
case XENMEM_resource_vmtrace_buf:
return d->vmtrace_size >> PAGE_SHIFT;
+ // WIP: to figure out the correct size of the resource
+ case XENMEM_resource_stats_table:
+ return 1;
+
default:
return -EOPNOTSUPP;
}
@@ -1162,6 +1166,28 @@ static int acquire_vmtrace_buf(
return nr_frames;
}
+static int acquire_stats_table(struct domain *d,
+ unsigned int id,
+ unsigned int frame,
+ unsigned int nr_frames,
+ xen_pfn_t mfn_list[])
+{
+ const struct vcpu *v = domain_vcpu(d, id);
+ mfn_t mfn;
+
+ if ( !v )
+ return -ENOENT;
+
+ if ( !v->stats.pg )
+ return -EINVAL;
+
+ mfn = page_to_mfn(v->stats.pg);
+ mfn_list[0] = mfn_x(mfn);
+
+ printk("acquire_perf_table: id: %d, nr_frames: %d, %p, domainid: %d\n",
id, nr_frames, v->stats.pg, d->domain_id);
+ return 1;
+}
+
/*
* Returns -errno on error, or positive in the range [1, nr_frames] on
* success. Returning less than nr_frames contitutes a request for a
@@ -1182,6 +1208,9 @@ static int _acquire_resource(
case XENMEM_resource_vmtrace_buf:
return acquire_vmtrace_buf(d, id, frame, nr_frames, mfn_list);
+ case XENMEM_resource_stats_table:
+ return acquire_stats_table(d, id, frame, nr_frames, mfn_list);
+
default:
return -EOPNOTSUPP;
}
diff --git a/xen/common/sched/core.c b/xen/common/sched/core.c
index 8f4b1ca10d..2a8b534977 100644
--- a/xen/common/sched/core.c
+++ b/xen/common/sched/core.c
@@ -264,6 +264,7 @@ static inline void vcpu_runstate_change(
{
s_time_t delta;
struct sched_unit *unit = v->sched_unit;
+ uint64_t * runstate;
ASSERT(spin_is_locked(get_sched_res(v->processor)->schedule_lock));
if ( v->runstate.state == new_state )
@@ -287,6 +288,10 @@ static inline void vcpu_runstate_change(
}
v->runstate.state = new_state;
+
+ // WIP: use a different interface
+ runstate = (uint64_t*)v->stats.va;
+ memcpy(runstate, &v->runstate.time[0], sizeof(v->runstate.time[0]));
}
void sched_guest_idle(void (*idle) (void), unsigned int cpu)
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 50e73eef98..752fd0be0f 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -626,6 +626,7 @@ struct xen_mem_acquire_resource {
#define XENMEM_resource_ioreq_server 0
#define XENMEM_resource_grant_table 1
#define XENMEM_resource_vmtrace_buf 2
+#define XENMEM_resource_stats_table 3
/*
* IN - a type-specific resource identifier, which must be zero
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 5485d08afb..bc99adea7e 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -284,6 +284,11 @@ struct vcpu
struct page_info *pg; /* One contiguous allocation of d->vmtrace_size
*/
} vmtrace;
+ struct {
+ struct page_info *pg;
+ void * va;
+ } stats;
+
struct arch_vcpu arch;
#ifdef CONFIG_IOREQ_SERVER
--
2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |