[v2,15/18] cgroup/misc: Add per resource callbacks for css events
Commit Message
Consumers of the misc cgroup controller might need to perform separate actions
in the event of a cgroup alloc, free or release call. In addition,
writes to the max value may also need separate action. Add the ability
to allow downstream users to setup callbacks for these operations, and
call the per resource type callback when appropriate.
This code will be utilized by the SGX driver in a future patch.
Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>
---
include/linux/misc_cgroup.h | 6 +++++
kernel/cgroup/misc.c | 51 ++++++++++++++++++++++++++++++++++---
2 files changed, 54 insertions(+), 3 deletions(-)
Comments
On Fri, Dec 02, 2022 at 10:36:51AM -0800, Kristen Carlson Accardi wrote:
> Consumers of the misc cgroup controller might need to perform separate actions
> in the event of a cgroup alloc, free or release call. In addition,
> writes to the max value may also need separate action. Add the ability
> to allow downstream users to setup callbacks for these operations, and
> call the per resource type callback when appropriate.
>
> This code will be utilized by the SGX driver in a future patch.
>
> Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>
I don't know what css is.
BR, Jarkko
On Thu, Dec 08, 2022 at 02:53:24PM +0000, Jarkko Sakkinen wrote:
> On Fri, Dec 02, 2022 at 10:36:51AM -0800, Kristen Carlson Accardi wrote:
> > Consumers of the misc cgroup controller might need to perform separate actions
> > in the event of a cgroup alloc, free or release call. In addition,
> > writes to the max value may also need separate action. Add the ability
> > to allow downstream users to setup callbacks for these operations, and
> > call the per resource type callback when appropriate.
> >
> > This code will be utilized by the SGX driver in a future patch.
> >
> > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>
>
> I don't know what css is.
Now I know but it should be described in the commit message, i.e.
what the css is abbrevation of, and what does it mean in practice.
BR, Jarkko
@@ -37,6 +37,12 @@ struct misc_res {
unsigned long max;
atomic_long_t usage;
atomic_long_t events;
+
+ /* per resource callback ops */
+ int (*misc_cg_alloc)(struct misc_cg *cg);
+ void (*misc_cg_free)(struct misc_cg *cg);
+ void (*misc_cg_released)(struct misc_cg *cg);
+ void (*misc_cg_max_write)(struct misc_cg *cg);
};
/**
@@ -278,10 +278,13 @@ static ssize_t misc_cg_max_write(struct kernfs_open_file *of, char *buf,
cg = css_misc(of_css(of));
- if (READ_ONCE(misc_res_capacity[type]))
+ if (READ_ONCE(misc_res_capacity[type])) {
WRITE_ONCE(cg->res[type].max, max);
- else
+ if (cg->res[type].misc_cg_max_write)
+ cg->res[type].misc_cg_max_write(cg);
+ } else {
ret = -EINVAL;
+ }
return ret ? ret : nbytes;
}
@@ -385,23 +388,39 @@ 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;
enum misc_res_type i;
struct misc_cg *cg;
+ int ret;
if (!parent_css) {
cg = &root_cg;
+ parent_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);
atomic_long_set(&cg->res[i].usage, 0);
+ if (parent_cg->res[i].misc_cg_alloc) {
+ ret = parent_cg->res[i].misc_cg_alloc(cg);
+ if (ret)
+ goto alloc_err;
+ }
}
return &cg->css;
+
+alloc_err:
+ for (i = 0; i < MISC_CG_RES_TYPES; i++)
+ if (parent_cg->res[i].misc_cg_free)
+ cg->res[i].misc_cg_free(cg);
+ kfree(cg);
+ return ERR_PTR(ret);
}
/**
@@ -412,13 +431,39 @@ 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 (cg->res[i].misc_cg_free)
+ cg->res[i].misc_cg_free(cg);
+
+ kfree(cg);
+}
+
+/**
+ * misc_cg_released() - Release the misc cgroup
+ * @css: cgroup subsys object.
+ *
+ * Call the misc_cg resource type released callbacks.
+ *
+ * Context: Any context.
+ */
+static void misc_cg_released(struct cgroup_subsys_state *css)
+{
+ struct misc_cg *cg = css_misc(css);
+ enum misc_res_type i;
+
+ for (i = 0; i < MISC_CG_RES_TYPES; i++)
+ if (cg->res[i].misc_cg_released)
+ cg->res[i].misc_cg_released(cg);
}
/* Cgroup controller callbacks */
struct cgroup_subsys misc_cgrp_subsys = {
.css_alloc = misc_cg_alloc,
.css_free = misc_cg_free,
+ .css_released = misc_cg_released,
.legacy_cftypes = misc_cg_files,
.dfl_cftypes = misc_cg_files,
};