1a72232eaSVipin Sharma /* SPDX-License-Identifier: GPL-2.0 */
2a72232eaSVipin Sharma /*
3a72232eaSVipin Sharma * Miscellaneous cgroup controller.
4a72232eaSVipin Sharma *
5a72232eaSVipin Sharma * Copyright 2020 Google LLC
6a72232eaSVipin Sharma * Author: Vipin Sharma <[email protected]>
7a72232eaSVipin Sharma */
8a72232eaSVipin Sharma #ifndef _MISC_CGROUP_H_
9a72232eaSVipin Sharma #define _MISC_CGROUP_H_
10a72232eaSVipin Sharma
11a72232eaSVipin Sharma /**
127a447968SRandy Dunlap * enum misc_res_type - Types of misc cgroup entries supported by the host.
13a72232eaSVipin Sharma */
14a72232eaSVipin Sharma enum misc_res_type {
157aef27f0SVipin Sharma #ifdef CONFIG_KVM_AMD_SEV
167a447968SRandy Dunlap /** @MISC_CG_RES_SEV: AMD SEV ASIDs resource */
177aef27f0SVipin Sharma MISC_CG_RES_SEV,
187a447968SRandy Dunlap /** @MISC_CG_RES_SEV_ES: AMD SEV-ES ASIDs resource */
197aef27f0SVipin Sharma MISC_CG_RES_SEV_ES,
207aef27f0SVipin Sharma #endif
217a447968SRandy Dunlap /** @MISC_CG_RES_TYPES: count of enum misc_res_type constants */
22a72232eaSVipin Sharma MISC_CG_RES_TYPES
23a72232eaSVipin Sharma };
24a72232eaSVipin Sharma
25a72232eaSVipin Sharma struct misc_cg;
26a72232eaSVipin Sharma
27a72232eaSVipin Sharma #ifdef CONFIG_CGROUP_MISC
28a72232eaSVipin Sharma
29a72232eaSVipin Sharma #include <linux/cgroup.h>
30a72232eaSVipin Sharma
31a72232eaSVipin Sharma /**
32a72232eaSVipin Sharma * struct misc_res: Per cgroup per misc type resource
33a72232eaSVipin Sharma * @max: Maximum limit on the resource.
341028f391SXiu Jianfeng * @watermark: Historical maximum usage of the resource.
35a72232eaSVipin Sharma * @usage: Current usage of the resource.
3662157e11SKamalesh Babulal * @events: Number of times, the resource limit exceeded.
37a72232eaSVipin Sharma */
38a72232eaSVipin Sharma struct misc_res {
3932bf85c6SHaitao Huang u64 max;
401028f391SXiu Jianfeng atomic64_t watermark;
4132bf85c6SHaitao Huang atomic64_t usage;
4232bf85c6SHaitao Huang atomic64_t events;
43*6a26f9c6SXiu Jianfeng atomic64_t events_local;
44a72232eaSVipin Sharma };
45a72232eaSVipin Sharma
46a72232eaSVipin Sharma /**
47a72232eaSVipin Sharma * struct misc_cg - Miscellaneous controller's cgroup structure.
48a72232eaSVipin Sharma * @css: cgroup subsys state object.
4962157e11SKamalesh Babulal * @events_file: Handle for the misc resources events file.
50a72232eaSVipin Sharma * @res: Array of misc resources usage in the cgroup.
51a72232eaSVipin Sharma */
52a72232eaSVipin Sharma struct misc_cg {
53a72232eaSVipin Sharma struct cgroup_subsys_state css;
54f279294bSChunguang Xu
55f279294bSChunguang Xu /* misc.events */
56f279294bSChunguang Xu struct cgroup_file events_file;
57*6a26f9c6SXiu Jianfeng /* misc.events.local */
58*6a26f9c6SXiu Jianfeng struct cgroup_file events_local_file;
59f279294bSChunguang Xu
60a72232eaSVipin Sharma struct misc_res res[MISC_CG_RES_TYPES];
61a72232eaSVipin Sharma };
62a72232eaSVipin Sharma
6332bf85c6SHaitao Huang int misc_cg_set_capacity(enum misc_res_type type, u64 capacity);
6432bf85c6SHaitao Huang int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, u64 amount);
6532bf85c6SHaitao Huang void misc_cg_uncharge(enum misc_res_type type, struct misc_cg *cg, u64 amount);
66a72232eaSVipin Sharma
67a72232eaSVipin Sharma /**
68a72232eaSVipin Sharma * css_misc() - Get misc cgroup from the css.
69a72232eaSVipin Sharma * @css: cgroup subsys state object.
70a72232eaSVipin Sharma *
71a72232eaSVipin Sharma * Context: Any context.
72a72232eaSVipin Sharma * Return:
73a72232eaSVipin Sharma * * %NULL - If @css is null.
74a72232eaSVipin Sharma * * struct misc_cg* - misc cgroup pointer of the passed css.
75a72232eaSVipin Sharma */
css_misc(struct cgroup_subsys_state * css)76a72232eaSVipin Sharma static inline struct misc_cg *css_misc(struct cgroup_subsys_state *css)
77a72232eaSVipin Sharma {
78a72232eaSVipin Sharma return css ? container_of(css, struct misc_cg, css) : NULL;
79a72232eaSVipin Sharma }
80a72232eaSVipin Sharma
81a72232eaSVipin Sharma /*
82a72232eaSVipin Sharma * get_current_misc_cg() - Find and get the misc cgroup of the current task.
83a72232eaSVipin Sharma *
84a72232eaSVipin Sharma * Returned cgroup has its ref count increased by 1. Caller must call
85a72232eaSVipin Sharma * put_misc_cg() to return the reference.
86a72232eaSVipin Sharma *
87a72232eaSVipin Sharma * Return: Misc cgroup to which the current task belongs to.
88a72232eaSVipin Sharma */
get_current_misc_cg(void)89a72232eaSVipin Sharma static inline struct misc_cg *get_current_misc_cg(void)
90a72232eaSVipin Sharma {
91a72232eaSVipin Sharma return css_misc(task_get_css(current, misc_cgrp_id));
92a72232eaSVipin Sharma }
93a72232eaSVipin Sharma
94a72232eaSVipin Sharma /*
95a72232eaSVipin Sharma * put_misc_cg() - Put the misc cgroup and reduce its ref count.
96a72232eaSVipin Sharma * @cg - cgroup to put.
97a72232eaSVipin Sharma */
put_misc_cg(struct misc_cg * cg)98a72232eaSVipin Sharma static inline void put_misc_cg(struct misc_cg *cg)
99a72232eaSVipin Sharma {
100a72232eaSVipin Sharma if (cg)
101a72232eaSVipin Sharma css_put(&cg->css);
102a72232eaSVipin Sharma }
103a72232eaSVipin Sharma
104a72232eaSVipin Sharma #else /* !CONFIG_CGROUP_MISC */
105a72232eaSVipin Sharma
misc_cg_set_capacity(enum misc_res_type type,u64 capacity)10632bf85c6SHaitao Huang static inline int misc_cg_set_capacity(enum misc_res_type type, u64 capacity)
107a72232eaSVipin Sharma {
108a72232eaSVipin Sharma return 0;
109a72232eaSVipin Sharma }
110a72232eaSVipin Sharma
misc_cg_try_charge(enum misc_res_type type,struct misc_cg * cg,u64 amount)111a72232eaSVipin Sharma static inline int misc_cg_try_charge(enum misc_res_type type,
112a72232eaSVipin Sharma struct misc_cg *cg,
11332bf85c6SHaitao Huang u64 amount)
114a72232eaSVipin Sharma {
115a72232eaSVipin Sharma return 0;
116a72232eaSVipin Sharma }
117a72232eaSVipin Sharma
misc_cg_uncharge(enum misc_res_type type,struct misc_cg * cg,u64 amount)118a72232eaSVipin Sharma static inline void misc_cg_uncharge(enum misc_res_type type,
119a72232eaSVipin Sharma struct misc_cg *cg,
12032bf85c6SHaitao Huang u64 amount)
121a72232eaSVipin Sharma {
122a72232eaSVipin Sharma }
123a72232eaSVipin Sharma
get_current_misc_cg(void)124a72232eaSVipin Sharma static inline struct misc_cg *get_current_misc_cg(void)
125a72232eaSVipin Sharma {
126a72232eaSVipin Sharma return NULL;
127a72232eaSVipin Sharma }
128a72232eaSVipin Sharma
put_misc_cg(struct misc_cg * cg)129a72232eaSVipin Sharma static inline void put_misc_cg(struct misc_cg *cg)
130a72232eaSVipin Sharma {
131a72232eaSVipin Sharma }
132a72232eaSVipin Sharma
133a72232eaSVipin Sharma #endif /* CONFIG_CGROUP_MISC */
134a72232eaSVipin Sharma #endif /* _MISC_CGROUP_H_ */
135