Merge tag 'time-namespace-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux
Pull time namespace updates from Christian Brauner: "When time namespaces were introduced we missed to virtualize the 'btime' field in /proc/stat. This confuses tasks which are in another time namespace with a virtualized boottime which is common in some container workloads. This contains Michael's series to fix 'btime' which Thomas asked me to take through my tree. To fix 'btime' virtualization we simply subtract the offset of the time namespace's boottime from btime before printing the stats. Note that since start_boottime of processes are seconds since boottime and the boottime stamp is now shifted according to the time namespace's offset, the offset of the time namespace also needs to be applied before the process stats are given to userspace. This avoids that processes shown by tools such as 'ps' appear as time travelers in the corresponding time namespace. Selftests are included to verify that btime virtualization in /proc/stat works as expected" * tag 'time-namespace-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux: namespace: make timens_on_fork() return nothing selftests/timens: added selftest for /proc/stat btime fs/proc: apply the time namespace offset to /proc/stat btime timens: additional helper functions for boottime offset handling
This commit is contained in:
+1
-6
@@ -153,7 +153,6 @@ int copy_namespaces(unsigned long flags, struct task_struct *tsk)
|
||||
struct nsproxy *old_ns = tsk->nsproxy;
|
||||
struct user_namespace *user_ns = task_cred_xxx(tsk, user_ns);
|
||||
struct nsproxy *new_ns;
|
||||
int ret;
|
||||
|
||||
if (likely(!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC |
|
||||
CLONE_NEWPID | CLONE_NEWNET |
|
||||
@@ -180,11 +179,7 @@ int copy_namespaces(unsigned long flags, struct task_struct *tsk)
|
||||
if (IS_ERR(new_ns))
|
||||
return PTR_ERR(new_ns);
|
||||
|
||||
ret = timens_on_fork(new_ns, tsk);
|
||||
if (ret) {
|
||||
free_nsproxy(new_ns);
|
||||
return ret;
|
||||
}
|
||||
timens_on_fork(new_ns, tsk);
|
||||
|
||||
tsk->nsproxy = new_ns;
|
||||
return 0;
|
||||
|
||||
@@ -308,22 +308,20 @@ static int timens_install(struct nsset *nsset, struct ns_common *new)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int timens_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk)
|
||||
void timens_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk)
|
||||
{
|
||||
struct ns_common *nsc = &nsproxy->time_ns_for_children->ns;
|
||||
struct time_namespace *ns = to_time_ns(nsc);
|
||||
|
||||
/* create_new_namespaces() already incremented the ref counter */
|
||||
if (nsproxy->time_ns == nsproxy->time_ns_for_children)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
get_time_ns(ns);
|
||||
put_time_ns(nsproxy->time_ns);
|
||||
nsproxy->time_ns = ns;
|
||||
|
||||
timens_commit(tsk, ns);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct user_namespace *timens_owner(struct ns_common *ns)
|
||||
|
||||
Reference in New Issue
Block a user