Unverified Commit a657bc8a authored by Christian Brauner's avatar Christian Brauner
Browse files

nstree: switch to new structures

Switch the nstree management to the new combined structures.

Link: https://patch.msgid.link/20251110-work-namespace-nstree-fixes-v1-5-e8a9264e0fb9@kernel.org


Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent d12ea806
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ static inline struct mnt_namespace *node_to_mnt_ns(const struct rb_node *node)

	if (!node)
		return NULL;
	ns = rb_entry(node, struct ns_common, ns_tree_node);
	ns = rb_entry(node, struct ns_common, ns_tree_node.ns_node);
	return container_of(ns, struct mnt_namespace, ns);
}

+9 −18
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
#define _LINUX_NS_COMMON_TYPES_H

#include <linux/atomic.h>
#include <linux/ns/nstree_types.h>
#include <linux/rbtree.h>
#include <linux/refcount.h>
#include <linux/types.h>
@@ -98,6 +99,13 @@ extern const struct proc_ns_operations utsns_operations;
 * Initial namespaces:
 *   Boot-time namespaces (init_net, init_pid_ns, etc.) start with
 *   __ns_ref_active = 1 and remain active forever.
 *
 * @ns_type: type of namespace (e.g., CLONE_NEWNET)
 * @stashed: cached dentry to be used by the vfs
 * @ops: namespace operations
 * @inum: namespace inode number (quickly recycled for non-initial namespaces)
 * @__ns_ref: main reference count (do not use directly)
 * @ns_tree: namespace tree nodes and active reference count
 */
struct ns_common {
	u32 ns_type;
@@ -106,24 +114,7 @@ struct ns_common {
	unsigned int inum;
	refcount_t __ns_ref; /* do not use directly */
	union {
		struct {
			u64 ns_id;
			struct /* global namespace rbtree and list */ {
				struct rb_node ns_unified_tree_node;
				struct list_head ns_unified_list_node;
			};
			struct /* per type rbtree and list */ {
				struct rb_node ns_tree_node;
				struct list_head ns_list_node;
			};
			struct /* namespace ownership rbtree and list */ {
				struct rb_root ns_owner_tree; /* rbtree of namespaces owned by this namespace */
				struct list_head ns_owner; /* list of namespaces owned by this namespace */
				struct rb_node ns_owner_tree_node; /* node in the owner namespace's rbtree */
				struct list_head ns_owner_entry; /* node in the owner namespace's ns_owned list */
			};
			atomic_t __ns_ref_active; /* do not use directly */
		};
		struct ns_tree;
		struct rcu_head ns_rcu;
	};
};
+19 −0
Original line number Diff line number Diff line
@@ -33,4 +33,23 @@ struct ns_tree_node {
	struct list_head ns_list_entry;
};

/**
 * struct ns_tree - Namespace tree nodes and active reference count
 * @ns_id: Unique namespace identifier
 * @__ns_ref_active: Active reference count (do not use directly)
 * @ns_unified_node: Node in the global namespace tree
 * @ns_tree_node: Node in the per-type namespace tree
 * @ns_owner_node: Node in the owner namespace's tree of owned namespaces
 * @ns_owner_root: Root of the tree of namespaces owned by this namespace
 *                 (only used when this namespace is an owner)
 */
struct ns_tree {
	u64 ns_id;
	atomic_t __ns_ref_active;
	struct ns_tree_node ns_unified_node;
	struct ns_tree_node ns_tree_node;
	struct ns_tree_node ns_owner_node;
	struct ns_tree_root ns_owner_root;
};

#endif /* _LINUX_NSTREE_TYPES_H */
+13 −14
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ static __always_inline bool is_ns_init_id(const struct ns_common *ns)
	return ns->ns_id <= NS_LAST_INIT_ID;
}


#define NS_COMMON_INIT(nsname, refs)									\
{													\
	.ns_type			= ns_common_type(&nsname),					\
@@ -36,10 +35,10 @@ static __always_inline bool is_ns_init_id(const struct ns_common *ns)
	.stashed			= NULL,								\
	.__ns_ref			= REFCOUNT_INIT(refs),						\
	.__ns_ref_active		= ATOMIC_INIT(1),						\
	.ns_list_node		= LIST_HEAD_INIT(nsname.ns.ns_list_node),		\
	.ns_owner_entry		= LIST_HEAD_INIT(nsname.ns.ns_owner_entry),		\
	.ns_owner		= LIST_HEAD_INIT(nsname.ns.ns_owner),			\
	.ns_unified_list_node	= LIST_HEAD_INIT(nsname.ns.ns_unified_list_node),	\
	.ns_unified_node.ns_list_entry	= LIST_HEAD_INIT(nsname.ns.ns_unified_node.ns_list_entry),	\
	.ns_tree_node.ns_list_entry	= LIST_HEAD_INIT(nsname.ns.ns_tree_node.ns_list_entry),		\
	.ns_owner_node.ns_list_entry	= LIST_HEAD_INIT(nsname.ns.ns_owner_node.ns_list_entry),	\
	.ns_owner_root.ns_list_head	= LIST_HEAD_INIT(nsname.ns.ns_owner_root.ns_list_head),		\
}

#define ns_common_init(__ns)                     \
+13 −13
Original line number Diff line number Diff line
@@ -13,14 +13,14 @@

struct ns_common;

extern struct ns_tree cgroup_ns_tree;
extern struct ns_tree ipc_ns_tree;
extern struct ns_tree mnt_ns_tree;
extern struct ns_tree net_ns_tree;
extern struct ns_tree pid_ns_tree;
extern struct ns_tree time_ns_tree;
extern struct ns_tree user_ns_tree;
extern struct ns_tree uts_ns_tree;
extern struct ns_tree_root cgroup_ns_tree;
extern struct ns_tree_root ipc_ns_tree;
extern struct ns_tree_root mnt_ns_tree;
extern struct ns_tree_root net_ns_tree;
extern struct ns_tree_root pid_ns_tree;
extern struct ns_tree_root time_ns_tree;
extern struct ns_tree_root user_ns_tree;
extern struct ns_tree_root uts_ns_tree;

void ns_tree_node_init(struct ns_tree_node *node);
void ns_tree_root_init(struct ns_tree_root *root);
@@ -46,14 +46,14 @@ void ns_tree_node_del(struct ns_tree_node *node, struct ns_tree_root *root);
			 (((__ns) == ns_init_ns(__ns)) ? ns_init_id(__ns) : 0))

u64 __ns_tree_gen_id(struct ns_common *ns, u64 id);
void __ns_tree_add_raw(struct ns_common *ns, struct ns_tree *ns_tree);
void __ns_tree_remove(struct ns_common *ns, struct ns_tree *ns_tree);
void __ns_tree_add_raw(struct ns_common *ns, struct ns_tree_root *ns_tree);
void __ns_tree_remove(struct ns_common *ns, struct ns_tree_root *ns_tree);
struct ns_common *ns_tree_lookup_rcu(u64 ns_id, int ns_type);
struct ns_common *__ns_tree_adjoined_rcu(struct ns_common *ns,
					 struct ns_tree *ns_tree,
					 struct ns_tree_root *ns_tree,
					 bool previous);

static inline void __ns_tree_add(struct ns_common *ns, struct ns_tree *ns_tree, u64 id)
static inline void __ns_tree_add(struct ns_common *ns, struct ns_tree_root *ns_tree, u64 id)
{
	__ns_tree_gen_id(ns, id);
	__ns_tree_add_raw(ns, ns_tree);
@@ -91,6 +91,6 @@ static inline void __ns_tree_add(struct ns_common *ns, struct ns_tree *ns_tree,
#define ns_tree_adjoined_rcu(__ns, __previous) \
	__ns_tree_adjoined_rcu(to_ns_common(__ns), to_ns_tree(__ns), __previous)

#define ns_tree_active(__ns) (!RB_EMPTY_NODE(&to_ns_common(__ns)->ns_tree_node))
#define ns_tree_active(__ns) (!RB_EMPTY_NODE(&to_ns_common(__ns)->ns_tree_node.ns_node))

#endif /* _LINUX_NSTREE_H */
Loading