]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
time: support ns lookup
authorChristian Brauner <brauner@kernel.org>
Fri, 12 Sep 2025 11:52:46 +0000 (13:52 +0200)
committerChristian Brauner <brauner@kernel.org>
Fri, 19 Sep 2025 12:26:15 +0000 (14:26 +0200)
Support the generic ns lookup infrastructure to support file handles for
namespaces.

Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
include/linux/time_namespace.h
init/main.c
kernel/time/namespace.c

index bb2c52f4fc9497881a436b4a0eb4773864faa2bc..7f6af7a9771e9a1a3cf530fdf1a91b383500ace0 100644 (file)
@@ -33,6 +33,7 @@ struct time_namespace {
 extern struct time_namespace init_time_ns;
 
 #ifdef CONFIG_TIME_NS
+void __init time_ns_init(void);
 extern int vdso_join_timens(struct task_struct *task,
                            struct time_namespace *ns);
 extern void timens_commit(struct task_struct *tsk, struct time_namespace *ns);
@@ -108,6 +109,10 @@ static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
 }
 
 #else
+static inline void __init time_ns_init(void)
+{
+}
+
 static inline int vdso_join_timens(struct task_struct *task,
                                   struct time_namespace *ns)
 {
index 0ee0ee7b7c2c0a7aceb6f428f8ee61edeead60ec..e7d2c57c65a7b13c4d83a0313f6da465c3106892 100644 (file)
 #include <linux/randomize_kstack.h>
 #include <linux/pidfs.h>
 #include <linux/ptdump.h>
+#include <linux/time_namespace.h>
 #include <net/net_namespace.h>
 
 #include <asm/io.h>
@@ -1072,6 +1073,7 @@ void start_kernel(void)
        fork_init();
        proc_caches_init();
        uts_ns_init();
+       time_ns_init();
        key_init();
        security_init();
        dbg_late_init();
index 0be93d8f2896d60cceb1c841e8ee4c00b8552921..408f60d0a3b6ca03391cd0242254aa0ac2193675 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/seq_file.h>
 #include <linux/proc_ns.h>
 #include <linux/export.h>
+#include <linux/nstree.h>
 #include <linux/time.h>
 #include <linux/slab.h>
 #include <linux/cred.h>
@@ -104,6 +105,7 @@ static struct time_namespace *clone_time_ns(struct user_namespace *user_ns,
        ns->user_ns = get_user_ns(user_ns);
        ns->offsets = old_ns->offsets;
        ns->frozen_offsets = false;
+       ns_tree_add(ns);
        return ns;
 
 fail_free_page:
@@ -250,11 +252,13 @@ out:
 
 void free_time_ns(struct time_namespace *ns)
 {
+       ns_tree_remove(ns);
        dec_time_namespaces(ns->ucounts);
        put_user_ns(ns->user_ns);
        ns_free_inum(&ns->ns);
        __free_page(ns->vvar_page);
-       kfree(ns);
+       /* Concurrent nstree traversal depends on a grace period. */
+       kfree_rcu(ns, ns.ns_rcu);
 }
 
 static struct time_namespace *to_time_ns(struct ns_common *ns)
@@ -487,3 +491,8 @@ struct time_namespace init_time_ns = {
        .ns.ops         = &timens_operations,
        .frozen_offsets = true,
 };
+
+void __init time_ns_init(void)
+{
+       ns_tree_add(&init_time_ns);
+}