The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-123.1.2.vz7.5.7 ------> commit 3f27fe7672dc5e649fecf9da8896daec2ba0e92e Author: Vladimir Davydov <vdavy...@parallels.com> Date: Thu May 28 17:19:43 2015 +0400
bc: initialize all beancounters as unlimited Port diff-ubc-initialize-all-beancounters-as-unlimited Port the following RH6 commit: Author: Konstantin Khlebnikov Email: khlebni...@openvz.org Subject: UBC: initialize all beancounters as unlimited Date: Tue, 19 Feb 2013 13:11:03 +0400 Here more accurate version of Dmitry's patch. * we must set vmguarpages.barrier to zero to obey sistem-wide overcommit policy * default oomguarpages.barrier is 75% of ram to make fresh beancounters and host non-immune to oom-killer and in the same time give them chance to survive * correct some comments in code * and as usual this patch removes bunch of useless code Comment from Dmitry's version: We have problems with tools working under beancounter, like vzmdest, vzmsrc, etc. They use default limits from kernel and then apply limits from config file. Let's fix it in the kernel - set all limits to unlimited, so tools will limit only needed resources. https://jira.sw.ru/browse/PCLIN-31512 https://jira.sw.ru/browse/PCLIN-31511 Signed-off-by: Konstantin Khlebnikov <khlebni...@openvz.org> Cc: Dmitry Guryanov <dgurya...@parallels.com> Signed-off-by: Vladimir Davydov <vdavy...@parallels.com> --- config.OpenVZ | 1 - kernel/bc/Kconfig | 6 ----- kernel/bc/beancounter.c | 65 ++++++++++++------------------------------------- 3 files changed, 15 insertions(+), 57 deletions(-) diff --git a/config.OpenVZ b/config.OpenVZ index 68b5778..9fd794f 100644 --- a/config.OpenVZ +++ b/config.OpenVZ @@ -5306,4 +5306,3 @@ CONFIG_BC_IO_PRIORITY=y CONFIG_BC_PROC=y CONFIG_BC_DEBUG=y # CONFIG_BC_DEBUG_ITEMS is not set -# CONFIG_BC_UNLIMITED is not set diff --git a/kernel/bc/Kconfig b/kernel/bc/Kconfig index a3379f9..cabebdd 100644 --- a/kernel/bc/Kconfig +++ b/kernel/bc/Kconfig @@ -68,10 +68,4 @@ config BC_DEBUG_ITEMS When true some of the resources (e.g. kmemsize) are accounted in items instead of bytes. -config BC_UNLIMITED - bool "Use unlimited ubc settings" - default n - depends on BC_DEBUG - help - When ON all limits and barriers are set to max values. endmenu diff --git a/kernel/bc/beancounter.c b/kernel/bc/beancounter.c index bffdf0a..4ea2375 100644 --- a/kernel/bc/beancounter.c +++ b/kernel/bc/beancounter.c @@ -45,7 +45,7 @@ #include <bc/proc.h> static struct kmem_cache *ub_cachep; -static struct user_beancounter default_beancounter; + struct user_beancounter ub0 = { }; EXPORT_SYMBOL(ub0); @@ -280,7 +280,6 @@ static void uncharge_beancounter_precharge(struct user_beancounter *ub) static void init_beancounter_struct(struct user_beancounter *ub); static void init_beancounter_nolimits(struct user_beancounter *ub); -static void init_beancounter_syslimits(struct user_beancounter *ub); static DEFINE_SPINLOCK(ub_list_lock); LIST_HEAD(ub_list_head); /* protected by ub_list_lock */ @@ -304,12 +303,11 @@ static struct user_beancounter *alloc_ub(const char *name) struct user_beancounter *new_ub; ub_debug(UBD_ALLOC, "Creating ub %p\n", new_ub); - new_ub = (struct user_beancounter *)kmem_cache_alloc(ub_cachep, - GFP_KERNEL); + new_ub = kmem_cache_zalloc(ub_cachep, GFP_KERNEL); if (new_ub == NULL) return NULL; - memcpy(new_ub, &default_beancounter, sizeof(*new_ub)); + init_beancounter_nolimits(new_ub); init_beancounter_struct(new_ub); init_beancounter_precharges(new_ub); @@ -369,8 +367,6 @@ struct user_beancounter *get_beancounter_by_name(const char *name, int create) cg = cgroup_kernel_open(ub_cgroup_root, CGRP_CREAT, name); if (IS_ERR_OR_NULL(cg)) return NULL; - pr_warn_once("Allocating UB with syslimits is deprecated!\n"); - init_beancounter_syslimits(cgroup_ub(cg)); if (ub_update_memcg(cgroup_ub(cg)) != 0) pr_warn("Failed to init UB %s limits\n", name); } @@ -911,47 +907,24 @@ static void init_beancounter_nolimits(struct user_beancounter *ub) for (k = 0; k < UB_RESOURCES; k++) { ub->ub_parms[k].limit = UB_MAXVALUE; - /* FIXME: whether this is right for physpages and guarantees? */ ub->ub_parms[k].barrier = UB_MAXVALUE; } - ub->ub_parms[UB_VMGUARPAGES].limit = 0; + /* + * Unlimited vmguarpages gives immunity against systemwide overcommit + * policy. It makes sense in some cases but by default we must obey it. + */ ub->ub_parms[UB_VMGUARPAGES].barrier = 0; - /* FIXME: set unlimited rate? */ - ub->ub_ratelimit.burst = 4; - ub->ub_ratelimit.interval = 300*HZ; -} - -static void init_beancounter_syslimits(struct user_beancounter *ub) -{ - unsigned long mp; - extern int max_threads; - int k; - - mp = num_physpages; - ub->ub_parms[UB_KMEMSIZE].limit = UB_MAXVALUE; - ub->ub_parms[UB_LOCKEDPAGES].limit = 8; - ub->ub_parms[UB_PRIVVMPAGES].limit = UB_MAXVALUE; - ub->ub_parms[UB_SHMPAGES].limit = 64; - ub->ub_parms[UB_NUMPROC].limit = max_threads / 2; - ub->ub_parms[UB_NUMTCPSOCK].limit = 1024; - ub->ub_parms[UB_TCPSNDBUF].limit = 1024*4*1024; /* 4k per socket */ - ub->ub_parms[UB_TCPRCVBUF].limit = 1024*6*1024; /* 6k per socket */ - ub->ub_parms[UB_NUMOTHERSOCK].limit = 256; - ub->ub_parms[UB_DGRAMRCVBUF].limit = 256*4*1024; /* 4k per socket */ - ub->ub_parms[UB_OTHERSOCKBUF].limit = 256*8*1024; /* 8k per socket */ - ub->ub_parms[UB_NUMFLOCK].limit = 1024; - ub->ub_parms[UB_NUMPTY].limit = 16; - ub->ub_parms[UB_NUMSIGINFO].limit = 1024; - ub->ub_parms[UB_DCACHESIZE].limit = UB_MAXVALUE; - ub->ub_parms[UB_NUMFILE].limit = 1024; - ub->ub_parms[UB_PHYSPAGES].limit = UB_MAXVALUE; - ub->ub_parms[UB_SWAPPAGES].limit = UB_MAXVALUE; - - for (k = 0; k < UB_RESOURCES; k++) - ub->ub_parms[k].barrier = ub->ub_parms[k].limit; + /* + * Unlimited oomguarpages makes container or host mostly immune to + * to the OOM-killer while other containers exists. Withal we cannot + * set it to zero, otherwise single unconfigured container will be + * first target for OOM-killer. 75% of ram looks like sane default. + */ + ub->ub_parms[UB_OOMGUARPAGES].barrier = totalram_pages * 3 / 4; + /* Ratelimit for messages in the kernel log */ ub->ub_ratelimit.burst = 4; ub->ub_ratelimit.interval = 300*HZ; } @@ -1049,14 +1022,6 @@ void __init ub_init_late(void) ub_cachep = kmem_cache_create("user_beancounters", sizeof(struct user_beancounter), 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL); - - memset(&default_beancounter, 0, sizeof(default_beancounter)); -#ifdef CONFIG_BC_UNLIMITED - init_beancounter_nolimits(&default_beancounter); -#else - init_beancounter_syslimits(&default_beancounter); -#endif - init_beancounter_struct(&default_beancounter); } int __init ub_init_cgroup(void) _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel