diff options
Diffstat (limited to 'kernel/cgroup')
| -rw-r--r-- | kernel/cgroup/cgroup-v1.c | 3 | ||||
| -rw-r--r-- | kernel/cgroup/cgroup.c | 39 | 
2 files changed, 28 insertions, 14 deletions
| diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c index be1a1c83cdd1..f2d7cea86ffe 100644 --- a/kernel/cgroup/cgroup-v1.c +++ b/kernel/cgroup/cgroup-v1.c @@ -471,6 +471,7 @@ static void *cgroup_pidlist_next(struct seq_file *s, void *v, loff_t *pos)  	 */  	p++;  	if (p >= end) { +		(*pos)++;  		return NULL;  	} else {  		*pos = *p; @@ -782,7 +783,7 @@ void cgroup1_release_agent(struct work_struct *work)  	pathbuf = kmalloc(PATH_MAX, GFP_KERNEL);  	agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); -	if (!pathbuf || !agentbuf) +	if (!pathbuf || !agentbuf || !strlen(agentbuf))  		goto out;  	spin_lock_irq(&css_set_lock); diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 6b2fc56b2201..3dead0416b91 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -3542,21 +3542,21 @@ static int cpu_stat_show(struct seq_file *seq, void *v)  static int cgroup_io_pressure_show(struct seq_file *seq, void *v)  {  	struct cgroup *cgrp = seq_css(seq)->cgroup; -	struct psi_group *psi = cgroup_id(cgrp) == 1 ? &psi_system : &cgrp->psi; +	struct psi_group *psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi;  	return psi_show(seq, psi, PSI_IO);  }  static int cgroup_memory_pressure_show(struct seq_file *seq, void *v)  {  	struct cgroup *cgrp = seq_css(seq)->cgroup; -	struct psi_group *psi = cgroup_id(cgrp) == 1 ? &psi_system : &cgrp->psi; +	struct psi_group *psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi;  	return psi_show(seq, psi, PSI_MEM);  }  static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v)  {  	struct cgroup *cgrp = seq_css(seq)->cgroup; -	struct psi_group *psi = cgroup_id(cgrp) == 1 ? &psi_system : &cgrp->psi; +	struct psi_group *psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi;  	return psi_show(seq, psi, PSI_CPU);  } @@ -4400,12 +4400,16 @@ static void css_task_iter_advance_css_set(struct css_task_iter *it)  		}  	} while (!css_set_populated(cset) && list_empty(&cset->dying_tasks)); -	if (!list_empty(&cset->tasks)) +	if (!list_empty(&cset->tasks)) {  		it->task_pos = cset->tasks.next; -	else if (!list_empty(&cset->mg_tasks)) +		it->cur_tasks_head = &cset->tasks; +	} else if (!list_empty(&cset->mg_tasks)) {  		it->task_pos = cset->mg_tasks.next; -	else +		it->cur_tasks_head = &cset->mg_tasks; +	} else {  		it->task_pos = cset->dying_tasks.next; +		it->cur_tasks_head = &cset->dying_tasks; +	}  	it->tasks_head = &cset->tasks;  	it->mg_tasks_head = &cset->mg_tasks; @@ -4463,10 +4467,14 @@ repeat:  		else  			it->task_pos = it->task_pos->next; -		if (it->task_pos == it->tasks_head) +		if (it->task_pos == it->tasks_head) {  			it->task_pos = it->mg_tasks_head->next; -		if (it->task_pos == it->mg_tasks_head) +			it->cur_tasks_head = it->mg_tasks_head; +		} +		if (it->task_pos == it->mg_tasks_head) {  			it->task_pos = it->dying_tasks_head->next; +			it->cur_tasks_head = it->dying_tasks_head; +		}  		if (it->task_pos == it->dying_tasks_head)  			css_task_iter_advance_css_set(it);  	} else { @@ -4485,11 +4493,12 @@ repeat:  			goto repeat;  		/* and dying leaders w/o live member threads */ -		if (!atomic_read(&task->signal->live)) +		if (it->cur_tasks_head == it->dying_tasks_head && +		    !atomic_read(&task->signal->live))  			goto repeat;  	} else {  		/* skip all dying ones */ -		if (task->flags & PF_EXITING) +		if (it->cur_tasks_head == it->dying_tasks_head)  			goto repeat;  	}  } @@ -4595,6 +4604,9 @@ static void *cgroup_procs_next(struct seq_file *s, void *v, loff_t *pos)  	struct kernfs_open_file *of = s->private;  	struct css_task_iter *it = of->priv; +	if (pos) +		(*pos)++; +  	return css_task_iter_next(it);  } @@ -4610,7 +4622,7 @@ static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos,  	 * from position 0, so we can simply keep iterating on !0 *pos.  	 */  	if (!it) { -		if (WARN_ON_ONCE((*pos)++)) +		if (WARN_ON_ONCE((*pos)))  			return ERR_PTR(-EINVAL);  		it = kzalloc(sizeof(*it), GFP_KERNEL); @@ -4618,10 +4630,11 @@ static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos,  			return ERR_PTR(-ENOMEM);  		of->priv = it;  		css_task_iter_start(&cgrp->self, iter_flags, it); -	} else if (!(*pos)++) { +	} else if (!(*pos)) {  		css_task_iter_end(it);  		css_task_iter_start(&cgrp->self, iter_flags, it); -	} +	} else +		return it->cur_task;  	return cgroup_procs_next(s, NULL, NULL);  } |