[Devel] [PATCH RHEL7 COMMIT] ve/proc/time: Port diff-ve-proc-report-real_start_time-in-_proc_PID_stat-if-CONFIG_VE

Konstantin Khorenko khorenko at virtuozzo.com
Wed Jun 24 03:42:32 PDT 2015


The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-123.1.2.vz7.5.17
------>
commit 5c0d1722bf5533d44f8beac78ac0bba084782177
Author: Vladimir Davydov <vdavydov at parallels.com>
Date:   Wed Jun 24 14:42:32 2015 +0400

    ve/proc/time: Port diff-ve-proc-report-real_start_time-in-_proc_PID_stat-if-CONFIG_VE
    
    Author: Vladimir Davydov
    Email: vdavydov at parallels.com
    Subject: proc: report real_start_time in /proc/PID/stat if CONFIG_VE
    Date: Mon, 14 Oct 2013 19:04:59 +0400
    
    In case !CONFIG_VE, real_start_time is reported, so should be if
    CONFIG_VE is on.
    
    The difference between start_time and real_start_time is that the former
    is the monotonic time of process start while the latter is bootbased,
    i.e. includes time the system was suspended and uptime from the previous
    boot in case the system was vzrebooted. Reporting start_time instead of
    real_start_time leads to a wrong process etime reported by ps after
    vzreboot or system suspend/resume.
    
    https://jira.sw.ru/browse/PSBM-22925
    
    Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
    
    Acked-by: Stanislav Kinsbursky <skinsbursky at parallels.com>
    =============================================================================
    
    Author: Vladimir Davydov
    Email: vdavydov at parallels.com
    Subject: proc: fix negative start time in /proc/PID/stat
    Date: Mon, 14 Oct 2013 19:05:01 +0400
    
    Tasks inside a CT can have negative start time e.g. if the CT was
    migrated from another hw node. In this case we'd better report 0 in
    order not to confuse userspace and avoid warning trigger in
    nsec_to_clock_t().
    
    https://jira.sw.ru/browse/PSBM-22925
    
    Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
    
    Acked-by: Stanislav Kinsbursky <skinsbursky at parallels.com>
    =============================================================================
    
    Related to https://jira.sw.ru/browse/PSBM-33650
    
    Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
---
 fs/proc/array.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/fs/proc/array.c b/fs/proc/array.c
index 177e477..32c7f1a 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -538,17 +538,27 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
 	priority = task_prio(task);
 	nice = task_nice(task);
 
-#ifndef CONFIG_VE
 	/* Temporary variable needed for gcc-2.96 */
 	/* convert timespec -> nsec*/
 	start_time =
 		(unsigned long long)task->real_start_time.tv_sec * NSEC_PER_SEC
 				+ task->real_start_time.tv_nsec;
+#ifdef CONFIG_VE
+	if (!is_super) {
+		struct timespec *ve_start_ts =
+				&get_exec_env()->real_start_timespec;
+		start_time -=
+			(unsigned long long)ve_start_ts->tv_sec * NSEC_PER_SEC
+				+ ve_start_ts->tv_nsec;
+	}
+	/* tasks inside a CT can have negative start time e.g. if the CT was
+	 * migrated from another hw node, in which case we will report 0 in
+	 * order not to confuse userspace */
+	if ((s64)start_time < 0)
+		start_time = 0;
+#endif
 	/* convert nsec -> ticks */
 	start_time = nsec_to_clock_t(start_time);
-#else
-	start_time = ve_relative_clock(&task->start_time);
-#endif
 
 #ifdef CONFIG_BEANCOUNTERS
 	ub_dump_task_info(task, ub_task_info, sizeof(ub_task_info),



More information about the Devel mailing list