From: Tycho Andersen <tandersen@xxxxxxxxxxx> Similar to cases in e.g. the pids cgroup with pids_charge(), if a migration fails we will need to force-unwind it, which may put misc cgroups over their limits. We need to charge them anyway, which is what this helper is for. Signed-off-by: Tycho Andersen <tandersen@xxxxxxxxxxx> --- include/linux/misc_cgroup.h | 1 + kernel/cgroup/misc.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/linux/misc_cgroup.h b/include/linux/misc_cgroup.h index e799b1f8d05b..6ddffeeb6f97 100644 --- a/include/linux/misc_cgroup.h +++ b/include/linux/misc_cgroup.h @@ -57,6 +57,7 @@ struct misc_cg { u64 misc_cg_res_total_usage(enum misc_res_type type); int misc_cg_set_capacity(enum misc_res_type type, u64 capacity); int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, u64 amount); +void misc_cg_charge(enum misc_res_type type, struct misc_cg *cg, u64 amount); void misc_cg_uncharge(enum misc_res_type type, struct misc_cg *cg, u64 amount); /** diff --git a/kernel/cgroup/misc.c b/kernel/cgroup/misc.c index 79a3717a5803..bbce097270cf 100644 --- a/kernel/cgroup/misc.c +++ b/kernel/cgroup/misc.c @@ -121,6 +121,38 @@ static void misc_cg_cancel_charge(enum misc_res_type type, struct misc_cg *cg, misc_res_name[type]); } +/** + * misc_cg_charge() - Charge the cgroup, ignoring limits/capacity. + * @type: Misc res type to charge. + * @cg: Misc cgroup which will be charged. + * @amount: Amount to charge. + * + * Charge @amount to the misc cgroup. Caller must use the same cgroup during + * the uncharge call. + * + * Context: Any context. + */ +void misc_cg_charge(enum misc_res_type type, struct misc_cg *cg, u64 amount) +{ + struct misc_res *res; + struct misc_cg *i; + + if (!(valid_type(type) && cg && READ_ONCE(misc_res_capacity[type]))) { + WARN_ON_ONCE(!valid_type(type)); + return; + } + + if (!amount) + return; + + for (i = cg; i; i = parent_misc(i)) { + res = &i->res[type]; + + atomic_long_add(amount, &res->usage); + } +} +EXPORT_SYMBOL_GPL(misc_cg_charge); + /** * misc_cg_try_charge() - Try charging the misc cgroup. * @type: Misc res type to charge. -- 2.34.1