The patch titled Subject: pidns: remove recursion from free_pid_ns() has been removed from the -mm tree. Its filename was pidns-remove-recursion-from-free_pid_ns-v5.patch This patch was dropped because it was merged into mainline or a subsystem tree ------------------------------------------------------ From: Cyrill Gorcunov <gorcunov@xxxxxxxxxx> Subject: pidns: remove recursion from free_pid_ns() free_pid_ns() operates in a recursive fashion: free_pid_ns(parent) put_pid_ns(parent) kref_put(&ns->kref, free_pid_ns); free_pid_ns thus if there was a huge nesting of namespaces the userspace may trigger avalanche calling of free_pid_ns leading to kernel stack exhausting and a panic eventually. This patch turns the recursion into an iterative loop. Based on a patch by Andrew Vagin. [akpm@xxxxxxxxxxxxxxxxxxxx: export put_pid_ns() to modules] Signed-off-by: Cyrill Gorcunov <gorcunov@xxxxxxxxxx> Cc: Andrew Vagin <avagin@xxxxxxxxxx> Cc: Oleg Nesterov <oleg@xxxxxxxxxx> Cc: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> Cc: Pavel Emelyanov <xemul@xxxxxxxxxxxxx> Cc: Greg KH <greg@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/pid_namespace.h | 8 +------- kernel/pid_namespace.c | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff -puN include/linux/pid_namespace.h~pidns-remove-recursion-from-free_pid_ns-v5 include/linux/pid_namespace.h --- a/include/linux/pid_namespace.h~pidns-remove-recursion-from-free_pid_ns-v5 +++ a/include/linux/pid_namespace.h @@ -47,15 +47,9 @@ static inline struct pid_namespace *get_ } extern struct pid_namespace *copy_pid_ns(unsigned long flags, struct pid_namespace *ns); -extern void free_pid_ns(struct kref *kref); extern void zap_pid_ns_processes(struct pid_namespace *pid_ns); extern int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd); - -static inline void put_pid_ns(struct pid_namespace *ns) -{ - if (ns != &init_pid_ns) - kref_put(&ns->kref, free_pid_ns); -} +extern void put_pid_ns(struct pid_namespace *ns); #else /* !CONFIG_PID_NS */ #include <linux/err.h> diff -puN kernel/pid_namespace.c~pidns-remove-recursion-from-free_pid_ns-v5 kernel/pid_namespace.c --- a/kernel/pid_namespace.c~pidns-remove-recursion-from-free_pid_ns-v5 +++ a/kernel/pid_namespace.c @@ -133,19 +133,26 @@ struct pid_namespace *copy_pid_ns(unsign return create_pid_namespace(old_ns); } -void free_pid_ns(struct kref *kref) +static void free_pid_ns(struct kref *kref) { - struct pid_namespace *ns, *parent; + struct pid_namespace *ns; ns = container_of(kref, struct pid_namespace, kref); - - parent = ns->parent; destroy_pid_namespace(ns); +} + +void put_pid_ns(struct pid_namespace *ns) +{ + struct pid_namespace *parent; - if (parent != NULL) - put_pid_ns(parent); + while (ns != &init_pid_ns) { + parent = ns->parent; + if (!kref_put(&ns->kref, free_pid_ns)) + break; + ns = parent; + } } -EXPORT_SYMBOL_GPL(free_pid_ns); +EXPORT_SYMBOL_GPL(put_pid_ns); void zap_pid_ns_processes(struct pid_namespace *pid_ns) { _ Patches currently in -mm which might be from gorcunov@xxxxxxxxxx are linux-next.patch proc-check-vma-vm_file-before-dereferencing.patch tools-testing-selftests-kcmp-kcmp_testc-print-reason-for-failure-in-kcmp_test.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html