From patchwork Mon Jan 22 17:20:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haitao Huang X-Patchwork-Id: 190394 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp2825517dyb; Mon, 22 Jan 2024 12:36:14 -0800 (PST) X-Google-Smtp-Source: AGHT+IE1k3MK7Hdn9s8rjnH89cuA/UkK9NI3zAyPiocZ8c62TYM/AkEV8kxml0RUo61ym/aj3BPw X-Received: by 2002:aa7:d756:0:b0:55a:911d:8ee3 with SMTP id a22-20020aa7d756000000b0055a911d8ee3mr276136eds.51.1705955774516; Mon, 22 Jan 2024 12:36:14 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705955774; cv=pass; d=google.com; s=arc-20160816; b=1GqLWpeez10uzZBIbUuAtMbduCzyLTwQ/fqE8TjQ6py3W8Eywsok4Jda0EoV2QNkXc J40r04QCWgM9TDfieX3Kuf923xb7pvpM4c2g+HevP37ZZRDMRkN6G6RWWS1g1jhTQk/e Kzn7Rb65dSIhU3y58BXxsIzFYw/PDT/50AMAow/Yt5YNfxNXm5k+c6bTNtCSZ3fN7Ucv atgiPC6/WXgSCYJwf+99OUEkPVAM5VUce+3gnnbwqTvWlR3B8pKXBYGdG7pIyHmstEgE TzafXsTs+mklw1R6acZhRf1Y24T5Mpm20frX0GG8qAVo4+wyLsIz8RvzlNQjiIJPPVet 22QQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=+fKB8zVrom5PO6oUef3z5liPHe6Lw3NAUkQ49rqR4go=; fh=Vgrzu9fr1cYGsDqSNq8PcOKm1OcJf2aYsOF+33ACqic=; b=DX9ZAC1R2Oux6g1wNEVgdOozavWcUZp7bDje71RBz+MR2VJWix7cCT2bPgFG9L0YvO oyuiJEtocsKcWmTRst4FZ/LTTP4GTf4hwdWp91IbXFtudT7sdUW7NTJlSFn1u1rmbbii M1mqTXVvPL0BrGlobt4sXMRmhaz9a3FnBNL2C/PUntH6ymZb8hO74F666wsnxB3LVUjs HUAMiY6Y+ACCHaVIFADYlZi0Deje0TiR9H/OEnT+YhleEgRsYqZpdaaoxsLw+hKh/mYY oTgd3VjA1M0ZrCz8OTv+LJ6LsO+MLj+hwC2fWab1KKEAECId236kTs9mT2TbG1b7QOVr tt3w== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=P9JsFyFa; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-33773-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-33773-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id fe1-20020a056402390100b00559c8a31069si6541796edb.555.2024.01.22.12.36.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jan 2024 12:36:14 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-33773-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=P9JsFyFa; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-33773-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-33773-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id ED2461F29E94 for ; Mon, 22 Jan 2024 17:52:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7F4044F8AA; Mon, 22 Jan 2024 17:20:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="P9JsFyFa" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 752EF3F8D3; Mon, 22 Jan 2024 17:20:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705944051; cv=none; b=dcs2Ft6LWIXzvn1qlVobhjyJdWySQW9Kc/ZhYwgtuEPormaJIDDL7TOVKck2t19mkzPPKp7MaJLCQo8cPgwRpg0p9omp+dtWBjU9xYNZUjdUst95J7DIHc1Fi4Y/3hlILS3flXCmV4g+40p2x1CcErdTQkjZVqgag9MtYgKsmco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705944051; c=relaxed/simple; bh=82OWhuoYS1GjdlkPieFq7gaYKjlu2VU9BJ2KlGOFoCQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CAAPL/Fq2fVeCLVi4x55gtCFHDi0OQ8wNgOCV4qhPyjb3oE+KeOCFy/TD228w6Fqq9A4fB2czBpr6Yvgfcg+bKaEBIlSevMuBb2HFGATZ70eFTMYM2eSM1u0L1XVa5YT4yVOYLE1OUprAOZGqPj6pR3lRF8YHd+PsQ3/WAK6JRk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=P9JsFyFa; arc=none smtp.client-ip=198.175.65.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1705944050; x=1737480050; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=82OWhuoYS1GjdlkPieFq7gaYKjlu2VU9BJ2KlGOFoCQ=; b=P9JsFyFaSDZo2DaSlWd+hIHvv2Ru3lAhthhkJtNffMLxkrAJvB+XGxI6 iALGNXiT6Ep9T+NhbqM6ZwX5Y8022h9wrBZh2uOgu/aGTYaCwq4eYCQng oFtIKjZA8iVJxA9RqxfEhye1iFmCU8aiY7/qEYdqVVBsGItSEPDcpmnxP Au9GNXDek8AsKZ4atZM5SK4dyrM02pcVXGTjzX5JkX7hY+WmXmUvdtaPz QRJYIZp7TPowbXszXGRKRd3QzNtgmWI8lTUc151XJPoT+R3lUKyG5DPva Fosle9Fq2EVc9U5vMPF5W6YKstEvQgNikhgNqHuDIVk1cj9487wzWCnR1 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10961"; a="1150099" X-IronPort-AV: E=Sophos;i="6.05,211,1701158400"; d="scan'208";a="1150099" Received: from orviesa005.jf.intel.com ([10.64.159.145]) by orvoesa107.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jan 2024 09:20:49 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.05,211,1701158400"; d="scan'208";a="1262857" Received: from b4969161e530.jf.intel.com ([10.165.56.46]) by orviesa005.jf.intel.com with ESMTP; 22 Jan 2024 09:20:48 -0800 From: Haitao Huang To: jarkko@kernel.org, dave.hansen@linux.intel.com, tj@kernel.org, mkoutny@suse.com, linux-kernel@vger.kernel.org, linux-sgx@vger.kernel.org, x86@kernel.org, cgroups@vger.kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, sohil.mehta@intel.com Cc: zhiquan1.li@intel.com, kristen@linux.intel.com, seanjc@google.com, zhanb@microsoft.com, anakrish@microsoft.com, mikko.ylinen@linux.intel.com, yangjie@microsoft.com Subject: [PATCH v7 01/15] cgroup/misc: Add per resource callbacks for CSS events Date: Mon, 22 Jan 2024 09:20:34 -0800 Message-Id: <20240122172048.11953-2-haitao.huang@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240122172048.11953-1-haitao.huang@linux.intel.com> References: <20240122172048.11953-1-haitao.huang@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788822907732304400 X-GMAIL-MSGID: 1788824282624628290 From: Kristen Carlson Accardi The misc cgroup controller (subsystem) currently does not perform resource type specific action for Cgroups Subsystem State (CSS) events: the 'css_alloc' event when a cgroup is created and the 'css_free' event when a cgroup is destroyed. Define callbacks for those events and allow resource providers to register the callbacks per resource type as needed. This will be utilized later by the EPC misc cgroup support implemented in the SGX driver. Signed-off-by: Kristen Carlson Accardi Co-developed-by: Haitao Huang Signed-off-by: Haitao Huang --- V7: - Make ops one per resource type and store them in array (Michal) - Rename the ops struct to misc_res_ops, and enforce the constraints of required callback functions (Jarkko) - Moved addition of priv field to patch 4 where it was used first. (Jarkko) V6: - Create ops struct for per resource callbacks (Jarkko) - Drop max_write callback (Dave, Michal) - Style fixes (Kai) --- include/linux/misc_cgroup.h | 11 +++++++ kernel/cgroup/misc.c | 60 +++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/include/linux/misc_cgroup.h b/include/linux/misc_cgroup.h index e799b1f8d05b..0806d4436208 100644 --- a/include/linux/misc_cgroup.h +++ b/include/linux/misc_cgroup.h @@ -27,6 +27,16 @@ struct misc_cg; #include +/** + * struct misc_res_ops: per resource type callback ops. + * @alloc: invoked for resource specific initialization when cgroup is allocated. + * @free: invoked for resource specific cleanup when cgroup is deallocated. + */ +struct misc_res_ops { + int (*alloc)(struct misc_cg *cg); + void (*free)(struct misc_cg *cg); +}; + /** * struct misc_res: Per cgroup per misc type resource * @max: Maximum limit on the resource. @@ -56,6 +66,7 @@ struct misc_cg { u64 misc_cg_res_total_usage(enum misc_res_type type); int misc_cg_set_capacity(enum misc_res_type type, u64 capacity); +int misc_cg_set_ops(enum misc_res_type type, const struct misc_res_ops *ops); int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, u64 amount); void misc_cg_uncharge(enum misc_res_type type, struct misc_cg *cg, u64 amount); diff --git a/kernel/cgroup/misc.c b/kernel/cgroup/misc.c index 79a3717a5803..b8c32791334c 100644 --- a/kernel/cgroup/misc.c +++ b/kernel/cgroup/misc.c @@ -39,6 +39,9 @@ static struct misc_cg root_cg; */ static u64 misc_res_capacity[MISC_CG_RES_TYPES]; +/* Resource type specific operations */ +static const struct misc_res_ops *misc_res_ops[MISC_CG_RES_TYPES]; + /** * parent_misc() - Get the parent of the passed misc cgroup. * @cgroup: cgroup whose parent needs to be fetched. @@ -105,6 +108,36 @@ int misc_cg_set_capacity(enum misc_res_type type, u64 capacity) } EXPORT_SYMBOL_GPL(misc_cg_set_capacity); +/** + * misc_cg_set_ops() - set resource specific operations. + * @type: Type of the misc res. + * @ops: Operations for the given type. + * + * Context: Any context. + * Return: + * * %0 - Successfully registered the operations. + * * %-EINVAL - If @type is invalid, or the operations missing any required callbacks. + */ +int misc_cg_set_ops(enum misc_res_type type, const struct misc_res_ops *ops) +{ + if (!valid_type(type)) + return -EINVAL; + + if (!ops->alloc) { + pr_err("%s: alloc missing\n", __func__); + return -EINVAL; + } + + if (!ops->free) { + pr_err("%s: free missing\n", __func__); + return -EINVAL; + } + + misc_res_ops[type] = ops; + return 0; +} +EXPORT_SYMBOL_GPL(misc_cg_set_ops); + /** * misc_cg_cancel_charge() - Cancel the charge from the misc cgroup. * @type: Misc res type in misc cg to cancel the charge from. @@ -383,23 +416,37 @@ static struct cftype misc_cg_files[] = { static struct cgroup_subsys_state * misc_cg_alloc(struct cgroup_subsys_state *parent_css) { + struct misc_cg *parent_cg, *cg; enum misc_res_type i; - struct misc_cg *cg; + int ret; if (!parent_css) { - cg = &root_cg; + parent_cg = cg = &root_cg; } else { cg = kzalloc(sizeof(*cg), GFP_KERNEL); if (!cg) return ERR_PTR(-ENOMEM); + parent_cg = css_misc(parent_css); } for (i = 0; i < MISC_CG_RES_TYPES; i++) { WRITE_ONCE(cg->res[i].max, MAX_NUM); atomic64_set(&cg->res[i].usage, 0); + if (misc_res_ops[i]) { + ret = misc_res_ops[i]->alloc(cg); + if (ret) + goto alloc_err; + } } return &cg->css; + +alloc_err: + for (i = 0; i < MISC_CG_RES_TYPES; i++) + if (misc_res_ops[i]) + misc_res_ops[i]->free(cg); + kfree(cg); + return ERR_PTR(ret); } /** @@ -410,7 +457,14 @@ misc_cg_alloc(struct cgroup_subsys_state *parent_css) */ static void misc_cg_free(struct cgroup_subsys_state *css) { - kfree(css_misc(css)); + struct misc_cg *cg = css_misc(css); + enum misc_res_type i; + + for (i = 0; i < MISC_CG_RES_TYPES; i++) + if (misc_res_ops[i]) + misc_res_ops[i]->free(cg); + + kfree(cg); } /* Cgroup controller callbacks */