OpenVZ / Virtuozzo kernel development (devel@openvz.org)
 help / color / mirror / Atom feed
From: Konstantin Khorenko <khorenko@virtuozzo.com>
To: Vasileios Almpanis <vasileios.almpanis@virtuozzo.com>,
	Pavel Tikhomirov <ptikhomirov@virtuozzo.com>,
	cover.1789491989.git.vladimir.riabchun@virtuozzo.com,
	Konstantin Khorenko <khorenko@virtuozzo.com>,
	devel@openvz.org
Subject: [Devel] [PATCH hci-8.1 v10 05/13] ve/ve.c: generate VE resource accessors using macros
Date: Fri, 25 Sep 2026 18:53:26 +0200	[thread overview]
Message-ID: <20260925-b4-kh-ve_fail-v10-5-77a6b6ea4205@virtuozzo.com> (raw)
In-Reply-To: <20260925-b4-kh-ve_fail-v10-0-77a6b6ea4205@virtuozzo.com>

From: Vladimir Riabchun <vladimir.riabchun@virtuozzo.com>

We have a bunch of almost identical code, which takes place
and has some unclear variations in it. Unify all resource
getters and setters using macros.

This changes behavior a little bit: some resources (netns number
for example) required stopped VE. Now such limits could be updated
with a running VE.
Also, some max_nr_write functions didn't verify provided value,
now it is not possible to pass overflowing value.
netns_avail_nr is now read as s64, like the other avail counters:
once the limit can be lowered on a running VE, the value can go
negative.

https://virtuozzo.atlassian.net/browse/VSTOR-135520

Feature: per-ve failcounters
Signed-off-by: Vladimir Riabchun <vladimir.riabchun@virtuozzo.com>
Reviewed-by: Konstantin Khorenko <khorenko@virtuozzo.com>
---
 kernel/ve/ve.c | 209 +++++++++++++++------------------------------------------
 1 file changed, 54 insertions(+), 155 deletions(-)

diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index c113071540bf4..d7546cd5fffaa 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -43,6 +43,39 @@
 #include <linux/cpuset.h>		/* For css_tg() */
 #include "../sched/sched.h"		/* For css_tg() */
 
+#define VE_RESOURCE(name)						\
+static u64 ve_##name##_max_nr_read(struct cgroup_subsys_state *css,	\
+				 struct cftype *cft)			\
+{									\
+	return css_to_ve(css)->name##_max_nr;				\
+}									\
+									\
+static int ve_##name##_max_nr_write(struct cgroup_subsys_state *css,	\
+				  struct cftype *cft, u64 val)		\
+{									\
+	struct ve_struct *ve = css_to_ve(css);				\
+	int delta;							\
+									\
+	if (!ve_is_super(get_exec_env()))				\
+		return -EPERM;						\
+									\
+	if (val > INT_MAX)						\
+		return -EOVERFLOW;					\
+									\
+	down_write(&ve->op_sem);					\
+	delta = val - ve->name##_max_nr;				\
+	ve->name##_max_nr = val;					\
+	atomic_add(delta, &ve->name##_avail_nr);			\
+	up_write(&ve->op_sem);						\
+	return 0;							\
+}									\
+									\
+static s64 ve_##name##_avail_nr_read(struct cgroup_subsys_state *css,	\
+				   struct cftype *cft)			\
+{									\
+	return atomic_read(&css_to_ve(css)->name##_avail_nr);		\
+}
+
 extern struct kmapset_set sysfs_ve_perms_set;
 #ifdef CONFIG_PROC_FS
 extern struct kmapset_set proc_ve_perms_set;
@@ -1036,121 +1069,10 @@ static int ve_features_write(struct cgroup_subsys_state *css, struct cftype *cft
 	return 0;
 }
 
-static u64 ve_netns_max_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return css_to_ve(css)->netns_max_nr;
-}
-
-static int ve_netns_max_nr_write(struct cgroup_subsys_state *css, struct cftype *cft, u64 val)
-{
-	struct ve_struct *ve = css_to_ve(css);
-	int delta;
-
-	if (!ve_is_super(get_exec_env()))
-		return -EPERM;
-
-	down_write(&ve->op_sem);
-	if (VE_IS_RUNNING(ve) || ve->ve_nsproxy) {
-		up_write(&ve->op_sem);
-		return -EBUSY;
-	}
-	delta = val - ve->netns_max_nr;
-	ve->netns_max_nr = val;
-	atomic_add(delta, &ve->netns_avail_nr);
-	up_write(&ve->op_sem);
-	return 0;
-}
-static u64 ve_netns_avail_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return atomic_read(&css_to_ve(css)->netns_avail_nr);
-}
-
-static s64 ve_mnt_avail_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return atomic_read(&css_to_ve(css)->mnt_avail_nr);
-}
-
-static u64 ve_mnt_max_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return css_to_ve(css)->mnt_max_nr;
-}
-
-static int ve_mnt_max_nr_write(struct cgroup_subsys_state *css, struct cftype *cft, u64 val)
-{
-	struct ve_struct *ve = css_to_ve(css);
-	int delta;
-
-	if (!ve_is_super(get_exec_env()))
-		return -EPERM;
-
-	if (val > INT_MAX)
-		return -EOVERFLOW;
-
-	down_write(&ve->op_sem);
-	delta = val - ve->mnt_max_nr;
-	ve->mnt_max_nr = val;
-	atomic_add(delta, &ve->mnt_avail_nr);
-	up_write(&ve->op_sem);
-	return 0;
-}
-
-static u64 ve_netif_max_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return css_to_ve(css)->netif_max_nr;
-}
-
-static int ve_netif_max_nr_write(struct cgroup_subsys_state *css, struct cftype *cft, u64 val)
-{
-	struct ve_struct *ve = css_to_ve(css);
-	int delta;
-
-	if (!ve_is_super(get_exec_env()))
-		return -EPERM;
-
-	if (val > INT_MAX)
-		return -EOVERFLOW;
-
-	down_write(&ve->op_sem);
-	delta = val - ve->netif_max_nr;
-	ve->netif_max_nr = val;
-	atomic_add(delta, &ve->netif_avail_nr);
-	up_write(&ve->op_sem);
-	return 0;
-}
-
-static s64 ve_netif_avail_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return atomic_read(&css_to_ve(css)->netif_avail_nr);
-}
-
-static u64 ve_bpf_prog_max_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return css_to_ve(css)->bpf_prog_max_nr;
-}
-
-static int ve_bpf_prog_max_nr_write(struct cgroup_subsys_state *css, struct cftype *cft, u64 val)
-{
-	struct ve_struct *ve = css_to_ve(css);
-	int delta;
-
-	if (!ve_is_super(get_exec_env()))
-		return -EPERM;
-
-	if (val > INT_MAX)
-		return -EOVERFLOW;
-
-	down_write(&ve->op_sem);
-	delta = val - ve->bpf_prog_max_nr;
-	ve->bpf_prog_max_nr = val;
-	atomic_add(delta, &ve->bpf_prog_avail_nr);
-	up_write(&ve->op_sem);
-	return 0;
-}
-
-static s64 ve_bpf_prog_avail_nr_read(struct cgroup_subsys_state *css, struct cftype *cft)
-{
-	return atomic_read(&css_to_ve(css)->bpf_prog_avail_nr);
-}
+VE_RESOURCE(netns);
+VE_RESOURCE(mnt);
+VE_RESOURCE(netif);
+VE_RESOURCE(bpf_prog);
 
 static int ve_os_release_read(struct seq_file *sf, void *v)
 {
@@ -1598,6 +1520,19 @@ static int ve_rpc_kill_write(struct cgroup_subsys_state *css,
 	return 0;
 }
 
+/* checkpatch will report it, can't enclose this in parentheses. */
+#define VE_RESOURCE_CFTYPE(res)					\
+{								\
+	.name			= #res "_max_nr",		\
+	.flags			= CFTYPE_NOT_ON_ROOT,		\
+	.read_u64		= ve_##res##_max_nr_read,	\
+	.write_u64		= ve_##res##_max_nr_write,	\
+},								\
+{								\
+	.name			= #res "_avail_nr",		\
+	.read_s64		= ve_##res##_avail_nr_read,	\
+}
+
 static struct cftype ve_cftypes[] = {
 
 	{
@@ -1642,46 +1577,10 @@ static struct cftype ve_cftypes[] = {
 		.read_u64		= ve_pid_max_read_u64,
 		.write_u64		= ve_pid_max_write_running_u64,
 	},
-	{
-		.name			= "netns_max_nr",
-		.flags			= CFTYPE_NOT_ON_ROOT,
-		.read_u64		= ve_netns_max_nr_read,
-		.write_u64		= ve_netns_max_nr_write,
-	},
-	{
-		.name			= "netns_avail_nr",
-		.read_u64		= ve_netns_avail_nr_read,
-	},
-	{
-		.name			= "mnt_avail_nr",
-		.read_s64		= ve_mnt_avail_nr_read,
-	},
-	{
-		.name			= "mnt_max_nr",
-		.flags			= CFTYPE_NOT_ON_ROOT,
-		.read_u64		= ve_mnt_max_nr_read,
-		.write_u64		= ve_mnt_max_nr_write,
-	},
-	{
-		.name			= "netif_max_nr",
-		.flags			= CFTYPE_NOT_ON_ROOT,
-		.read_u64		= ve_netif_max_nr_read,
-		.write_u64		= ve_netif_max_nr_write,
-	},
-	{
-		.name			= "netif_avail_nr",
-		.read_s64		= ve_netif_avail_nr_read,
-	},
-	{
-		.name			= "bpf_prog_max_nr",
-		.flags			= CFTYPE_NOT_ON_ROOT,
-		.read_u64		= ve_bpf_prog_max_nr_read,
-		.write_u64		= ve_bpf_prog_max_nr_write,
-	},
-	{
-		.name			= "bpf_prog_avail_nr",
-		.read_s64		= ve_bpf_prog_avail_nr_read,
-	},
+	VE_RESOURCE_CFTYPE(netns),
+	VE_RESOURCE_CFTYPE(mnt),
+	VE_RESOURCE_CFTYPE(netif),
+	VE_RESOURCE_CFTYPE(bpf_prog),
 	{
 		.name			= "os_release",
 		.max_write_len		= __NEW_UTS_LEN + 1,

-- 
2.43.0

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

  parent reply	other threads:[~2026-09-25 16:55 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-25 16:53 [Devel] [PATCH hci-8.1 v10 00/13] Add per-VE failcount support Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 01/13] ve/ve.{h, c}: farewell to spaces as indents Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 02/13] ve/fs: count available mounts instead of used ones Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 03/13] selftests/ve: update ve_ns_owner_test Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 04/13] ve: make mount limit configurable per VE Konstantin Khorenko
2026-09-25 16:53 ` Konstantin Khorenko [this message]
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 06/13] ve/aio: initialize aio fields in ve0 Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 07/13] ve: introduce per-VE failcounter infrastructure Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 08/13] ve: add netns failcounter Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 09/13] ve: add mnt failcounter Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 10/13] ve: add netif failcounter Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 11/13] ve: add bpf_prog failcounter Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 12/13] ve: add aio failcounter Konstantin Khorenko
2026-09-25 16:53 ` [Devel] [PATCH hci-8.1 v10 13/13] selftests/ve: add mount accounting selftest Konstantin Khorenko
2026-09-25 17:10 ` [Devel] [PATCH hci-8.1 v10 00/13] Add per-VE failcount support Vladimir Riabchun
2026-09-25 17:33 ` Konstantin Khorenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260925-b4-kh-ve_fail-v10-5-77a6b6ea4205@virtuozzo.com \
    --to=khorenko@virtuozzo.com \
    --cc=cover.1789491989.git.vladimir.riabchun@virtuozzo.com \
    --cc=devel@openvz.org \
    --cc=ptikhomirov@virtuozzo.com \
    --cc=vasileios.almpanis@virtuozzo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox