xref: /linux-6.15/include/linux/misc_cgroup.h (revision ad6c08d8)
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