[Devel] [PATCH RH9 1/2] kernel/cgroup: implement cgroup_get_e_ve_css
Kirill Tkhai
ktkhai at virtuozzo.com
Wed Oct 13 19:51:09 MSK 2021
From: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
Existing cgroup_get_e_css() is not suited for cgroup-v1 and will always
return root cgroup css. Implement new cgroup_get_e_ve_css to return
ve css.
https://jira.sw.ru/browse/PSBM-131253
Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
Reviewed-by: Kirill Tkhai <ktkhai at virtuozzo.com>
==========================
mm/writeback: Adopt cgroup-v2 writeback (limit per-memcg dirty memory)
In cgroup-v1 all writeback IO is accounted to root blkcg by design. With
cgroup-v2 it became possible to link memcg and blkcg, so writeback code
was enhanced to
1) consider balancing dirty pages per memory cgroup
2) account writeback generated IO to blkcg
In vz7 writeback was balancing by means of beancounter cgroup. However we
dropped it.
In vz8 @aryabinin tried to enable cgroup-v2 writeback with 5cc286c98ee20
("mm, cgroup, writeback: Enable per-cgroup writeback for v1 cgroup."),
but cgroup_get_e_css(), which is used to find blkcg based on memcg,
does not work well with cgroup-v1 and always returns root blkcg.
However we can implement a new function to associate blkcg with memcg via
ve css_set.
Test results with 256M container without patch:
===============================================
# echo "253:22358 100000000" > /sys/fs/cgroup/blkio/machine.slice/1/blkio.throttle.write_bps_device
# vzctl exec 1 dd if=/dev/zero of=/test bs=1M count=1000
# 1048576000 bytes (1.0 GB, 1000 MiB) copied, 1.35522 s, 774 MB/s
Since dirty balancing is global, Container can dirty more than it's RAM
and blkio limits are not respected.
With patch:
===========
# echo "253:22765 100000000" > /sys/fs/cgroup/blkio/machine.slice/1/blkio.throttle.write_bps_device
# vzctl exec 1 dd if=/dev/zero of=/test bs=1M count=1000
# 1048576000 bytes (1.0 GB, 1000 MiB) copied, 10.2267 s, 103 MB/s
Per-ve dirty balancing and throttling work as expected.
v2:
Since ve->ve_ns is pointing to task nsproxy, it can be changed during ve
lifetime. We already have a helper ve_get_init_css() that handles this
case, so I decided to reuse it's code in new cgroup_get_e_ve_css().
Additionally I have added two patches that improve current code:
1) drop 'get' from css_get_local_root() name since get with css functions
usually results in taking reference
2) drop duplicate code and reuse css_local_root() helper in
ve_get_init_css()
Andrey Zhadchenko (4):
kernel/cgroup: rename css_get_local_root
kernel/ve: simplify ve_get_init_css
kernel/cgroup: implement cgroup_get_e_ve_css
mm/backing-dev: associate writeback with correct blkcg
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
include/linux/cgroup.h | 2 ++
kernel/cgroup/cgroup.c | 19 +++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 05b4688cf949..892362bde6b1 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -962,6 +962,8 @@ static inline void cgroup_bpf_put(struct cgroup *cgrp) {}
#ifdef CONFIG_VE
int ve_hide_cgroups(struct cgroup_root *root);
struct ve_struct *get_curr_ve(void);
+struct cgroup_subsys_state *cgroup_get_e_ve_css(struct cgroup *cgrp,
+ struct cgroup_subsys *ss);
#endif
#endif /* _LINUX_CGROUP_H */
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index bb9bce3de45a..c08497c7eb5d 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -610,6 +610,25 @@ struct cgroup_subsys_state *cgroup_get_e_css(struct cgroup *cgrp,
}
EXPORT_SYMBOL_GPL(cgroup_get_e_css);
+#ifdef CONFIG_VE
+struct cgroup_subsys_state *cgroup_get_e_ve_css(struct cgroup *cgrp,
+ struct cgroup_subsys *ss)
+{
+ struct cgroup_subsys_state *css;
+ struct ve_struct *ve;
+
+ rcu_read_lock();
+
+ ve = cgroup_ve_owner(cgrp);
+ if (!ve)
+ ve = get_ve0();
+ css = ve_get_init_css(ve, ss->id);
+
+ rcu_read_unlock();
+ return css;
+}
+#endif
+
static void cgroup_get_live(struct cgroup *cgrp)
{
WARN_ON_ONCE(cgroup_is_dead(cgrp));
More information about the Devel
mailing list