[Devel] [PATCH v4 vz9] ve: cgroup -- don't use atomic lock in the sleepable context

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Thu Nov 11 14:38:09 MSK 2021



On 10.11.2021 20:50, Cyrill Gorcunov wrote:
> We should not keep @css_set_lock spinlock while removing group files
> which leads to
> 
>   | BUG: sleeping function called from invalid context at kernel/locking/mutex.c:938
> 
> This is because cgroup_rm_file() function takes @kernfs_mutex itself.
> Similarly to cgroup_mark_ve_roots() function we can traverse
> the @cgrp_links using only @cgroup_mutex without @css_set_lock.
> 
> https://jira.sw.ru/browse/PSBM-135460
> 
> Reviewed-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>

Ack

> Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
> ---
>   kernel/cgroup/cgroup.c |   11 ++++++++---
>   1 file changed, 8 insertions(+), 3 deletions(-)
> 
> Index: vzkernel/kernel/cgroup/cgroup.c
> ===================================================================
> --- vzkernel.orig/kernel/cgroup/cgroup.c
> +++ vzkernel/kernel/cgroup/cgroup.c
> @@ -2152,9 +2152,9 @@ void cgroup_unmark_ve_roots(struct ve_st
>   	struct cftype *cft;
>   
>   	cft = get_cftype_by_name(CGROUP_FILENAME_RELEASE_AGENT);
> +	BUG_ON(!cft || cft->file_offset);
>   
>   	mutex_lock(&cgroup_mutex);
> -	spin_lock_irq(&css_set_lock);
>   
>   	/*
>   	 * We can safely use ve->ve_ns without rcu_read_lock here, as we are
> @@ -2163,19 +2163,24 @@ void cgroup_unmark_ve_roots(struct ve_st
>   	 */
>   	cset = rcu_dereference_protected(ve->ve_ns,
>   			lockdep_is_held(&ve->op_sem))->cgroup_ns->root_cset;
> +	BUG_ON(!cset);
>   
> +	/*
> +	 * Traversing @cgrp_links without @css_set_lock is safe here for
> +	 * the same reasons as in cgroup_mark_ve_roots().
> +	 */
>   	list_for_each_entry(link, &cset->cgrp_links, cgrp_link) {
>   		cgrp = link->cgrp;
>   
>   		if (!is_virtualized_cgroup(cgrp))
>   			continue;
>   
> -		cgroup_rm_file(cgrp, cft);
> +		if (!cgroup_is_dead(cgrp))
> +			cgroup_rm_file(cgrp, cft);
>   		rcu_assign_pointer(cgrp->ve_owner, NULL);
>   		clear_bit(CGRP_VE_ROOT, &cgrp->flags);
>   	}
>   
> -	spin_unlock_irq(&css_set_lock);
>   	mutex_unlock(&cgroup_mutex);
>   	/* ve_owner == NULL will be visible */
>   	synchronize_rcu();
> 

-- 
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.


More information about the Devel mailing list