Quoting Ben Blum (bblum@xxxxxxxxxx): ... > +static struct cgroup_pidlist *cgroup_pidlist_find(struct cgroup *cgrp, > + enum cgroup_filetype type) > +{ > + struct cgroup_pidlist *l; > + /* don't need task_nsproxy() if we're looking at ourself */ > + struct pid_namespace *ns = get_pid_ns(current->nsproxy->pid_ns); > + /* > + * We can't drop the pidlist_mutex before taking the l->mutex in case > + * the last ref-holder is trying to remove l from the list at the same > + * time. Holding the pidlist_mutex precludes somebody taking whichever > + * list we find out from under us - compare release_pid_array(). > + */ > + mutex_lock(&cgrp->pidlist_mutex); > + list_for_each_entry(l, &cgrp->pidlists, links) { > + if (l->key.type == type && l->key.ns == ns) { > + /* found a matching list - drop the extra refcount */ > + put_pid_ns(ns); > + /* make sure l doesn't vanish out from under us */ > + down_write(&l->mutex); > + mutex_unlock(&cgrp->pidlist_mutex); > + l->use_count++; > + return l; > + } > + } > + /* entry not found; create a new one */ > + l = kmalloc(sizeof(struct cgroup_pidlist), GFP_KERNEL); > + if (!l) { > + mutex_unlock(&cgrp->pidlist_mutex); Again, you need to put_pid_ns(ns) here. > + return l; > + } > + init_rwsem(&l->mutex); > + down_write(&l->mutex); > + l->key.type = type; > + l->key.ns = ns; > + l->use_count = 0; /* don't increment here */ > + l->list = NULL; > + l->owner = cgrp; > + list_add(&l->links, &cgrp->pidlists); > + mutex_unlock(&cgrp->pidlist_mutex); > + return l; > +} _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers