[RHEL8,COMMIT] ve/sched/stat: Add basic infrastructure for vcpu statistics

Submitted by Konstantin Khorenko on Nov. 3, 2020, 1 p.m.

Details

Message ID 202011031300.0A3D0ZWS2050445@finist-co8.sw.ru
State New
Series "ve/proc/sched/stat: Virtualize /proc/stat in a Container"
Headers show

Commit Message

Konstantin Khorenko Nov. 3, 2020, 1 p.m.
The commit is pushed to "branch-rh8-4.18.0-193.6.3.vz8.4.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-193.6.3.vz8.4.15
------>
commit 679f623fb05fec8e3c8316794a9fc7a081acaa92
Author: Konstantin Khorenko <khorenko@virtuozzo.com>
Date:   Wed Oct 28 14:26:14 2020 +0300

    ve/sched/stat: Add basic infrastructure for vcpu statistics
    
    Container might have a limit on CPUs in its config.
    Previously we had a fair vcpu primitive and fair 2 level
    cpu scheduler.
    
    Nowadays we do not have fair vcpus for Containers, but still have
    emulate this behavior.
    The most important part here is to provide correct statistics:
    it should be collected upon all cpus in the system and spread
    equally by "vcpus" in the output.
    
    The current patch introduces vcpu related necessary fields in
    task_group and their allocation/deallocation.
    
    Signed-off-by: Konstantin Khorenko <khorenko@virtuozzo.com>
    Reviewed-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
---
 kernel/sched/core.c  | 15 +++++++++++++++
 kernel/sched/sched.h |  5 +++++
 2 files changed, 20 insertions(+)

Patch hide | download patch | download mbox

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 0116742de578..88bc46d163b3 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6398,6 +6398,8 @@  static void sched_free_group(struct task_group *tg)
 	free_fair_sched_group(tg);
 	free_rt_sched_group(tg);
 	autogroup_free(tg);
+	kvfree(tg->cpustat_last);
+	kvfree(tg->vcpustat);
 	kmem_cache_free(task_group_cache, tg);
 }
 
@@ -6416,6 +6418,19 @@  struct task_group *sched_create_group(struct task_group *parent)
 	if (!alloc_rt_sched_group(tg, parent))
 		goto err;
 
+	tg->cpustat_last = kvzalloc(nr_cpu_ids * sizeof(struct kernel_cpustat),
+				    GFP_KERNEL);
+	if (!tg->cpustat_last)
+		goto err;
+
+	tg->vcpustat = kvzalloc(nr_cpu_ids * sizeof(struct kernel_cpustat),
+				GFP_KERNEL);
+	if (!tg->vcpustat)
+		goto err;
+
+	tg->vcpustat_last_update = 0;
+	spin_lock_init(&tg->vcpustat_lock);
+
 	/* start_timespec is saved CT0 uptime */
 	tg->start_time = ktime_get_boot_ns();
 
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 3f1e5ba43910..d8331e5b4c4f 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -412,6 +412,11 @@  struct task_group {
 	/* Monotonic time in nsecs: */
 	u64			start_time;
 
+	struct kernel_cpustat	*cpustat_last;
+	struct kernel_cpustat	*vcpustat;
+	u64			vcpustat_last_update;
+	spinlock_t		vcpustat_lock;
+
 	struct cfs_bandwidth	cfs_bandwidth;
 #ifdef CONFIG_CFS_CPULIMIT
 #define MAX_CPU_RATE 1024