[Devel] [PATCH rh8 5/5] ve/time: rework times() syscall and /proc/[pid]/stat to handle u64 time offsets
Konstantin Khorenko
khorenko at virtuozzo.com
Thu Oct 8 18:22:03 MSK 2020
ve_struct.{start_time,real_start_time} are u64 now, change the code
correspondingly.
Drop duplicated fields start_timespec/real_start_timespec in ve_struct.
Fixes: f2716576136d ("ve/time: Use ve_relative_clock in times() syscall
and /proc/[pid]/stat")
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
fs/proc/array.c | 7 ++-----
include/linux/ve.h | 4 ----
kernel/sys.c | 19 ++++++++-----------
3 files changed, 10 insertions(+), 20 deletions(-)
diff --git a/fs/proc/array.c b/fs/proc/array.c
index e85d0caa6efa..e9b6e403858a 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -546,11 +546,8 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
#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;
+ u64 offset = get_exec_env()->real_start_time;
+ start_time -= (unsigned long long)offset;
}
/* 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
diff --git a/include/linux/ve.h b/include/linux/ve.h
index b659e779cb49..0db98e8e08c1 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -52,10 +52,6 @@ struct ve_struct {
struct net_device *venet_dev;
#endif
-/* per VE CPU stats*/
- struct timespec start_timespec; /* monotonic time */
- struct timespec real_start_timespec; /* boot based time */
-
/* see vzcalluser.h for VE_FEATURE_XXX definitions */
__u64 features;
diff --git a/kernel/sys.c b/kernel/sys.c
index 2644090f8d4b..df02329b0e5c 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -957,16 +957,13 @@ static void do_sys_times(struct tms *tms)
}
#ifdef CONFIG_VE
-unsigned long long ve_relative_clock(struct timespec * ts)
+static u64 ve_relative_clock(u64 time)
{
- unsigned long long offset = 0;
+ u64 offset = 0;
+ struct ve_struct *ve = get_exec_env();
- if (ts->tv_sec > get_exec_env()->start_timespec.tv_sec ||
- (ts->tv_sec == get_exec_env()->start_timespec.tv_sec &&
- ts->tv_nsec >= get_exec_env()->start_timespec.tv_nsec))
- offset = (unsigned long long)(ts->tv_sec -
- get_exec_env()->start_timespec.tv_sec) * NSEC_PER_SEC
- + ts->tv_nsec - get_exec_env()->start_timespec.tv_nsec;
+ if (time > ve->start_time)
+ offset = time - ve->start_time;
return nsec_to_clock_t(offset);
}
#endif
@@ -974,7 +971,7 @@ unsigned long long ve_relative_clock(struct timespec * ts)
SYSCALL_DEFINE1(times, struct tms __user *, tbuf)
{
#ifdef CONFIG_VE
- struct timespec now;
+ u64 now;
#endif
if (tbuf) {
@@ -989,9 +986,9 @@ SYSCALL_DEFINE1(times, struct tms __user *, tbuf)
return (long) jiffies_64_to_clock_t(get_jiffies_64());
#else
/* Compare to calculation in fs/proc/array.c */
- ktime_get_ts(&now);
+ now = ktime_get_ns();
force_successful_syscall_return();
- return ve_relative_clock(&now);
+ return (long) ve_relative_clock(now);
#endif
}
--
2.28.0
More information about the Devel
mailing list