diff --git a/kernel/xsched/cgroup.c b/kernel/xsched/cgroup.c index 8f3e2d9e9e12c5ab4d944729b548df93f574994e..e50556a82ceadbbcc838fd62456a4467fceb7eae 100644 --- a/kernel/xsched/cgroup.c +++ b/kernel/xsched/cgroup.c @@ -196,7 +196,7 @@ static int xcu_cg_init(struct xsched_group *xcg, return xcu_cfs_cg_init(xcg, parent_xg); default: XSCHED_INFO("xcu_cgroup: init RT group css=0x%lx\n", - (uintptr_t)&xcg->css); + (uintptr_t)&xcg->css); break; } @@ -243,20 +243,6 @@ static void xcu_css_free(struct cgroup_subsys_state *css) { struct xsched_group *xcg = xcu_cg_from_css(css); - if (!xsched_group_is_root(xcg)) { - switch (xcg->sched_class) { - case XSCHED_TYPE_CFS: - xcu_cfs_cg_deinit(xcg); - break; - default: - XSCHED_INFO("xcu_cgroup: deinit RT group css=0x%lx\n", - (uintptr_t)&xcg->css); - break; - } - } - - list_del(&xcg->group_node); - kmem_cache_free(xsched_group_cache, xcg); } @@ -318,6 +304,20 @@ static void xcu_css_offline(struct cgroup_subsys_state *css) hrtimer_cancel(&xcg->quota_timeout); cancel_work_sync(&xcg->refill_work); cancel_work_sync(&xcg->file_show_work); + + if (!xsched_group_is_root(xcg)) { + switch (xcg->sched_class) { + case XSCHED_TYPE_CFS: + xcu_cfs_cg_deinit(xcg); + break; + default: + XSCHED_INFO("xcu_cgroup: deinit RT group css=0x%lx\n", + (uintptr_t)&xcg->css); + break; + } + } + + list_del(&xcg->group_node); } static void xsched_group_xse_attach(struct xsched_group *xg, diff --git a/kernel/xsched/core.c b/kernel/xsched/core.c index 5e6c5eec2dc9e7f30418c483f1b5bd3fbf558e8c..1bf7a93985bbcdc2d0728d29cf6393b7e80faaa8 100644 --- a/kernel/xsched/core.c +++ b/kernel/xsched/core.c @@ -174,15 +174,14 @@ int delete_ctx(struct xsched_context *ctx) if (curr_xse == xse) xcu->xrq.curr_xse = NULL; dequeue_ctx(xse, xcu); - --xcu->nr_ctx; - mutex_unlock(&xcu->xcu_lock); - - xse->class->xse_deinit(xse); #ifdef CONFIG_CGROUP_XCU xsched_group_xse_detach(xse); #endif + mutex_unlock(&xcu->xcu_lock); + + xse->class->xse_deinit(xse); return 0; } diff --git a/kernel/xsched/vstream.c b/kernel/xsched/vstream.c index ebde50cbb8c6450ecaf2e7b496e2c788b9b651a4..bf2f8c6b5c6c1fb387d5ab11997c628e2bf9bf04 100644 --- a/kernel/xsched/vstream.c +++ b/kernel/xsched/vstream.c @@ -87,6 +87,7 @@ static void xsched_task_free(struct kref *kref) delete_ctx(ctx); list_del(&ctx->ctx_node); + --xcu->nr_ctx; mutex_unlock(&xcu->ctx_list_lock); mutex_lock(&xcu->xcu_lock);