The SGX driver needs to be able to store additional per cgroup data
specific to SGX along with the misc_cg struct. Add the ability to get
and set this data in struct misc_cg.
Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>
---
include/linux/misc_cgroup.h | 12 ++++++++++++
kernel/cgroup/misc.c | 39 +++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
On Fri, Nov 11, 2022 at 10:35:27AM -0800, Kristen Carlson Accardi wrote:
> +void *misc_cg_get_priv(enum misc_res_type type, struct misc_cg *cg)
> +{
> + if (!(valid_type(type) && cg))
> + return NULL;
> +
> + return cg->res[type].priv;
> +}
> +EXPORT_SYMBOL_GPL(misc_cg_get_priv);
Yeah, just deref it. I'm not sure what all these accessors are contributing.
Thanks.
@@ -43,6 +43,7 @@ struct misc_res {
unsigned long max;
atomic_long_t usage;
atomic_long_t events;
+ void *priv;
};
/**
@@ -63,6 +64,8 @@ struct misc_cg *root_misc(void);
struct misc_cg *parent_misc(struct misc_cg *cg);
unsigned long misc_cg_read(enum misc_res_type type, struct misc_cg *cg);
unsigned long misc_cg_max(enum misc_res_type type, struct misc_cg *cg);
+void *misc_cg_get_priv(enum misc_res_type type, struct misc_cg *cg);
+void misc_cg_set_priv(enum misc_res_type type, struct misc_cg *cg, void *priv);
unsigned long misc_cg_res_total_usage(enum misc_res_type type);
int misc_cg_set_capacity(enum misc_res_type type, unsigned long capacity);
int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg,
@@ -130,6 +133,15 @@ static inline unsigned long misc_cg_max(enum misc_res_type type, struct misc_cg
return 0;
}
+static void *misc_cg_get_priv(enum misc_res_type type, struct misc_cg *cg)
+{
+ return NULL;
+}
+
+static void misc_cg_set_priv(enum misc_res_type type, struct misc_cg *cg, void *priv)
+{
+}
+
static inline unsigned long misc_cg_res_total_usage(enum misc_res_type type)
{
return 0;
@@ -251,6 +251,45 @@ unsigned long misc_cg_max(enum misc_res_type type, struct misc_cg *cg)
}
EXPORT_SYMBOL_GPL(misc_cg_max);
+/**
+ * misc_cg_get_priv() - Return the priv value of the misc cgroup res.
+ * @type: Type of the misc res.
+ * @cg: Misc cgroup whose priv will be read
+ *
+ * Context: Any context.
+ * Return:
+ * The value of the priv field for the specified misc cgroup.
+ * If an invalid misc_res_type is given, NULL will be returned.
+ */
+void *misc_cg_get_priv(enum misc_res_type type, struct misc_cg *cg)
+{
+ if (!(valid_type(type) && cg))
+ return NULL;
+
+ return cg->res[type].priv;
+}
+EXPORT_SYMBOL_GPL(misc_cg_get_priv);
+
+/**
+ * misc_cg_set_priv() - Set the priv value of the misc cgroup res.
+ * @type: Type of the misc res.
+ * @cg: Misc cgroup whose priv will be written
+ * @priv: Value to store in the priv field of the struct misc_cg
+ *
+ * If an invalid misc_res_type is given, the priv data will not be
+ * stored.
+ *
+ * Context: Any context.
+ */
+void misc_cg_set_priv(enum misc_res_type type, struct misc_cg *cg, void *priv)
+{
+ if (!(valid_type(type) && cg))
+ return;
+
+ cg->res[type].priv = priv;
+}
+EXPORT_SYMBOL_GPL(misc_cg_set_priv);
+
/**
* misc_cg_max_show() - Show the misc cgroup max limit.
* @sf: Interface file