2024-06-03 12:13:08

by Xiu Jianfeng

[permalink] [raw]
Subject: [PATCH -next 0/3] mm/hugetlb_cgroup: rework on cftypes

Hi,

This patchset provides an intuitive view of the control files through
static templates of cftypes, improve the readability of the code.

Xiu Jianfeng (3):
mm/hugetlb_cgroup: identify the legacy using cgroup_subsys_on_dfl()
mm/hugetlb_cgroup: prepare cftypes based on template
mm/hugetlb_cgroup: switch to the new cftypes

include/linux/hugetlb.h | 5 -
mm/hugetlb_cgroup.c | 303 ++++++++++++++++++++++------------------
2 files changed, 165 insertions(+), 143 deletions(-)

--
2.34.1



2024-06-03 12:13:15

by Xiu Jianfeng

[permalink] [raw]
Subject: [PATCH -next 1/3] mm/hugetlb_cgroup: identify the legacy using cgroup_subsys_on_dfl()

Currently the numa_stat file encodes 1 into .private using the micro
MEMFILE_PRIVATE() to identify the legacy. Actually, we can use
cgroup_subsys_on_dfl() instead. This is helpful to handle .private
in the static array in the next patch.

Signed-off-by: Xiu Jianfeng <[email protected]>
---
mm/hugetlb_cgroup.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c
index e20339a346b9..45f94a869776 100644
--- a/mm/hugetlb_cgroup.c
+++ b/mm/hugetlb_cgroup.c
@@ -460,7 +460,7 @@ static int hugetlb_cgroup_read_numa_stat(struct seq_file *seq, void *dummy)
int nid;
struct cftype *cft = seq_cft(seq);
int idx = MEMFILE_IDX(cft->private);
- bool legacy = MEMFILE_ATTR(cft->private);
+ bool legacy = !cgroup_subsys_on_dfl(hugetlb_cgrp_subsys);
struct hugetlb_cgroup *h_cg = hugetlb_cgroup_from_css(seq_css(seq));
struct cgroup_subsys_state *css;
unsigned long usage;
@@ -839,7 +839,7 @@ static void __init __hugetlb_cgroup_file_legacy_init(int idx)
/* Add the numa stat file */
cft = &h->cgroup_files_legacy[8];
snprintf(cft->name, MAX_CFTYPE_NAME, "%s.numa_stat", buf);
- cft->private = MEMFILE_PRIVATE(idx, 1);
+ cft->private = MEMFILE_PRIVATE(idx, 0);
cft->seq_show = hugetlb_cgroup_read_numa_stat;

/* NULL terminate the last cft */
--
2.34.1


2024-06-03 12:13:24

by Xiu Jianfeng

[permalink] [raw]
Subject: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template

Unlike other cgroup subsystems, the hugetlb cgroup does not provide
a static array of cftype that explicitly displays the properties,
handling functions, etc., of each file. Instead, it dynamically creates
the attribute of cftypes based on the hstate during the startup
procedure. This reduces the readability of the code.

To fix this issue, introduce two templates of cftypes, and rebuild the
attributes according to the hstate to make it ready to be added to
cgroup framework.

Signed-off-by: Xiu Jianfeng <[email protected]>
---
mm/hugetlb_cgroup.c | 157 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 157 insertions(+)

diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c
index 45f94a869776..378f2353443f 100644
--- a/mm/hugetlb_cgroup.c
+++ b/mm/hugetlb_cgroup.c
@@ -27,7 +27,16 @@
#define MEMFILE_IDX(val) (((val) >> 16) & 0xffff)
#define MEMFILE_ATTR(val) ((val) & 0xffff)

+#define MEMFILE_OFFSET(t, m) (((offsetof(t, m) << 16) | sizeof_field(t, m)))
+#define MEMFILE_OFFSET0(val) (((val) >> 16) & 0xffff)
+#define MEMFILE_FIELD_SIZE(val) ((val) & 0xffff)
+
+#define DFL_TMPL_SIZE ARRAY_SIZE(hugetlb_dfl_tmpl)
+#define LEGACY_TMPL_SIZE ARRAY_SIZE(hugetlb_legacy_tmpl)
+
static struct hugetlb_cgroup *root_h_cgroup __read_mostly;
+static struct cftype *dfl_files;
+static struct cftype *legacy_files;

static inline struct page_counter *
__hugetlb_cgroup_counter_from_cgroup(struct hugetlb_cgroup *h_cg, int idx,
@@ -702,12 +711,144 @@ static int hugetlb_events_local_show(struct seq_file *seq, void *v)
return __hugetlb_events_show(seq, true);
}

+static struct cftype hugetlb_dfl_tmpl[] = {
+ {
+ .name = "max",
+ .private = RES_LIMIT,
+ .seq_show = hugetlb_cgroup_read_u64_max,
+ .write = hugetlb_cgroup_write_dfl,
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
+ {
+ .name = "rsvd.max",
+ .private = RES_RSVD_LIMIT,
+ .seq_show = hugetlb_cgroup_read_u64_max,
+ .write = hugetlb_cgroup_write_dfl,
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
+ {
+ .name = "current",
+ .private = RES_USAGE,
+ .seq_show = hugetlb_cgroup_read_u64_max,
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
+ {
+ .name = "rsvd.current",
+ .private = RES_RSVD_USAGE,
+ .seq_show = hugetlb_cgroup_read_u64_max,
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
+ {
+ .name = "events",
+ .seq_show = hugetlb_events_show,
+ .file_offset = MEMFILE_OFFSET(struct hugetlb_cgroup, events_file[0]),
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
+ {
+ .name = "events.local",
+ .seq_show = hugetlb_events_local_show,
+ .file_offset = MEMFILE_OFFSET(struct hugetlb_cgroup, events_local_file[0]),
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
+ {
+ .name = "numa_stat",
+ .seq_show = hugetlb_cgroup_read_numa_stat,
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
+ /* don't need terminator here */
+};
+
+static struct cftype hugetlb_legacy_tmpl[] = {
+ {
+ .name = "limit_in_bytes",
+ .private = RES_LIMIT,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ .write = hugetlb_cgroup_write_legacy,
+ },
+ {
+ .name = "rsvd.limit_in_bytes",
+ .private = RES_RSVD_LIMIT,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ .write = hugetlb_cgroup_write_legacy,
+ },
+ {
+ .name = "usage_in_bytes",
+ .private = RES_USAGE,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ },
+ {
+ .name = "rsvd.usage_in_bytes",
+ .private = RES_RSVD_USAGE,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ },
+ {
+ .name = "max_usage_in_bytes",
+ .private = RES_MAX_USAGE,
+ .write = hugetlb_cgroup_reset,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ },
+ {
+ .name = "rsvd.max_usage_in_bytes",
+ .private = RES_RSVD_MAX_USAGE,
+ .write = hugetlb_cgroup_reset,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ },
+ {
+ .name = "failcnt",
+ .private = RES_FAILCNT,
+ .write = hugetlb_cgroup_reset,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ },
+ {
+ .name = "rsvd.failcnt",
+ .private = RES_RSVD_FAILCNT,
+ .write = hugetlb_cgroup_reset,
+ .read_u64 = hugetlb_cgroup_read_u64,
+ },
+ {
+ .name = "numa_stat",
+ .seq_show = hugetlb_cgroup_read_numa_stat,
+ },
+ /* don't need terminator here */
+};
+
+static void __init
+hugetlb_cgroup_cfttypes_init(struct hstate *h, struct cftype *cft,
+ struct cftype *tmpl, int tmpl_size)
+{
+ char buf[32];
+ int i, idx = hstate_index(h);
+
+ /* format the size */
+ mem_fmt(buf, sizeof(buf), huge_page_size(h));
+
+ for (i = 0; i < tmpl_size; cft++, tmpl++, i++) {
+ *cft = *tmpl;
+ /* rebuild the name */
+ if (tmpl->name)
+ snprintf(cft->name, MAX_CFTYPE_NAME, "%s.%s", buf, tmpl->name);
+ /* rebuild the private */
+ if (tmpl->private)
+ cft->private = MEMFILE_PRIVATE(idx, tmpl->private);
+ /* rebuild the file_offset */
+ if (tmpl->file_offset) {
+ unsigned int offset = tmpl->file_offset;
+
+ cft->file_offset = MEMFILE_OFFSET0(offset) +
+ MEMFILE_FIELD_SIZE(offset) * idx;
+ }
+ }
+}
+
static void __init __hugetlb_cgroup_file_dfl_init(int idx)
{
char buf[32];
struct cftype *cft;
struct hstate *h = &hstates[idx];

+ hugetlb_cgroup_cfttypes_init(h, dfl_files + idx * DFL_TMPL_SIZE,
+ hugetlb_dfl_tmpl, DFL_TMPL_SIZE);
+
/* format the size */
mem_fmt(buf, sizeof(buf), huge_page_size(h));

@@ -779,6 +920,9 @@ static void __init __hugetlb_cgroup_file_legacy_init(int idx)
struct cftype *cft;
struct hstate *h = &hstates[idx];

+ hugetlb_cgroup_cfttypes_init(h, legacy_files + idx * LEGACY_TMPL_SIZE,
+ hugetlb_legacy_tmpl, LEGACY_TMPL_SIZE);
+
/* format the size */
mem_fmt(buf, sizeof(buf), huge_page_size(h));

@@ -856,10 +1000,23 @@ static void __init __hugetlb_cgroup_file_init(int idx)
__hugetlb_cgroup_file_legacy_init(idx);
}

+static void __init __hugetlb_cgroup_file_pre_init(void)
+{
+ int cft_count;
+
+ cft_count = hugetlb_max_hstate * DFL_TMPL_SIZE + 1; /* add terminator */
+ dfl_files = kcalloc(cft_count, sizeof(struct cftype), GFP_KERNEL);
+ BUG_ON(!dfl_files);
+ cft_count = hugetlb_max_hstate * LEGACY_TMPL_SIZE + 1; /* add terminator */
+ legacy_files = kcalloc(cft_count, sizeof(struct cftype), GFP_KERNEL);
+ BUG_ON(!legacy_files);
+}
+
void __init hugetlb_cgroup_file_init(void)
{
struct hstate *h;

+ __hugetlb_cgroup_file_pre_init();
for_each_hstate(h)
__hugetlb_cgroup_file_init(hstate_index(h));
}
--
2.34.1


2024-06-03 12:13:36

by Xiu Jianfeng

[permalink] [raw]
Subject: [PATCH -next 3/3] mm/hugetlb_cgroup: switch to the new cftypes

The previous patch has already reconstructed the cftype attributes
based on the templates and saved them in dfl_cftypes and legacy_cftypes.
then remove the old procedure and switch to the new cftypes.

Signed-off-by: Xiu Jianfeng <[email protected]>
---
include/linux/hugetlb.h | 5 --
mm/hugetlb_cgroup.c | 163 +++++-----------------------------------
2 files changed, 17 insertions(+), 151 deletions(-)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 279aca379b95..a951c0d06061 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -686,11 +686,6 @@ struct hstate {
unsigned int nr_huge_pages_node[MAX_NUMNODES];
unsigned int free_huge_pages_node[MAX_NUMNODES];
unsigned int surplus_huge_pages_node[MAX_NUMNODES];
-#ifdef CONFIG_CGROUP_HUGETLB
- /* cgroup control files */
- struct cftype cgroup_files_dfl[8];
- struct cftype cgroup_files_legacy[10];
-#endif
char name[HSTATE_NAME_LEN];
};

diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c
index 378f2353443f..856296d865c6 100644
--- a/mm/hugetlb_cgroup.c
+++ b/mm/hugetlb_cgroup.c
@@ -840,164 +840,26 @@ hugetlb_cgroup_cfttypes_init(struct hstate *h, struct cftype *cft,
}
}

-static void __init __hugetlb_cgroup_file_dfl_init(int idx)
+static void __init __hugetlb_cgroup_file_dfl_init(struct hstate *h)
{
- char buf[32];
- struct cftype *cft;
- struct hstate *h = &hstates[idx];
+ int idx = hstate_index(h);

hugetlb_cgroup_cfttypes_init(h, dfl_files + idx * DFL_TMPL_SIZE,
hugetlb_dfl_tmpl, DFL_TMPL_SIZE);
-
- /* format the size */
- mem_fmt(buf, sizeof(buf), huge_page_size(h));
-
- /* Add the limit file */
- cft = &h->cgroup_files_dfl[0];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.max", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_LIMIT);
- cft->seq_show = hugetlb_cgroup_read_u64_max;
- cft->write = hugetlb_cgroup_write_dfl;
- cft->flags = CFTYPE_NOT_ON_ROOT;
-
- /* Add the reservation limit file */
- cft = &h->cgroup_files_dfl[1];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.rsvd.max", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_RSVD_LIMIT);
- cft->seq_show = hugetlb_cgroup_read_u64_max;
- cft->write = hugetlb_cgroup_write_dfl;
- cft->flags = CFTYPE_NOT_ON_ROOT;
-
- /* Add the current usage file */
- cft = &h->cgroup_files_dfl[2];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.current", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_USAGE);
- cft->seq_show = hugetlb_cgroup_read_u64_max;
- cft->flags = CFTYPE_NOT_ON_ROOT;
-
- /* Add the current reservation usage file */
- cft = &h->cgroup_files_dfl[3];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.rsvd.current", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_RSVD_USAGE);
- cft->seq_show = hugetlb_cgroup_read_u64_max;
- cft->flags = CFTYPE_NOT_ON_ROOT;
-
- /* Add the events file */
- cft = &h->cgroup_files_dfl[4];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.events", buf);
- cft->private = MEMFILE_PRIVATE(idx, 0);
- cft->seq_show = hugetlb_events_show;
- cft->file_offset = offsetof(struct hugetlb_cgroup, events_file[idx]);
- cft->flags = CFTYPE_NOT_ON_ROOT;
-
- /* Add the events.local file */
- cft = &h->cgroup_files_dfl[5];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.events.local", buf);
- cft->private = MEMFILE_PRIVATE(idx, 0);
- cft->seq_show = hugetlb_events_local_show;
- cft->file_offset = offsetof(struct hugetlb_cgroup,
- events_local_file[idx]);
- cft->flags = CFTYPE_NOT_ON_ROOT;
-
- /* Add the numa stat file */
- cft = &h->cgroup_files_dfl[6];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.numa_stat", buf);
- cft->private = MEMFILE_PRIVATE(idx, 0);
- cft->seq_show = hugetlb_cgroup_read_numa_stat;
- cft->flags = CFTYPE_NOT_ON_ROOT;
-
- /* NULL terminate the last cft */
- cft = &h->cgroup_files_dfl[7];
- memset(cft, 0, sizeof(*cft));
-
- WARN_ON(cgroup_add_dfl_cftypes(&hugetlb_cgrp_subsys,
- h->cgroup_files_dfl));
}

-static void __init __hugetlb_cgroup_file_legacy_init(int idx)
+static void __init __hugetlb_cgroup_file_legacy_init(struct hstate *h)
{
- char buf[32];
- struct cftype *cft;
- struct hstate *h = &hstates[idx];
+ int idx = hstate_index(h);

hugetlb_cgroup_cfttypes_init(h, legacy_files + idx * LEGACY_TMPL_SIZE,
hugetlb_legacy_tmpl, LEGACY_TMPL_SIZE);
-
- /* format the size */
- mem_fmt(buf, sizeof(buf), huge_page_size(h));
-
- /* Add the limit file */
- cft = &h->cgroup_files_legacy[0];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.limit_in_bytes", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_LIMIT);
- cft->read_u64 = hugetlb_cgroup_read_u64;
- cft->write = hugetlb_cgroup_write_legacy;
-
- /* Add the reservation limit file */
- cft = &h->cgroup_files_legacy[1];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.rsvd.limit_in_bytes", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_RSVD_LIMIT);
- cft->read_u64 = hugetlb_cgroup_read_u64;
- cft->write = hugetlb_cgroup_write_legacy;
-
- /* Add the usage file */
- cft = &h->cgroup_files_legacy[2];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.usage_in_bytes", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_USAGE);
- cft->read_u64 = hugetlb_cgroup_read_u64;
-
- /* Add the reservation usage file */
- cft = &h->cgroup_files_legacy[3];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.rsvd.usage_in_bytes", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_RSVD_USAGE);
- cft->read_u64 = hugetlb_cgroup_read_u64;
-
- /* Add the MAX usage file */
- cft = &h->cgroup_files_legacy[4];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.max_usage_in_bytes", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_MAX_USAGE);
- cft->write = hugetlb_cgroup_reset;
- cft->read_u64 = hugetlb_cgroup_read_u64;
-
- /* Add the MAX reservation usage file */
- cft = &h->cgroup_files_legacy[5];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.rsvd.max_usage_in_bytes", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_RSVD_MAX_USAGE);
- cft->write = hugetlb_cgroup_reset;
- cft->read_u64 = hugetlb_cgroup_read_u64;
-
- /* Add the failcntfile */
- cft = &h->cgroup_files_legacy[6];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.failcnt", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_FAILCNT);
- cft->write = hugetlb_cgroup_reset;
- cft->read_u64 = hugetlb_cgroup_read_u64;
-
- /* Add the reservation failcntfile */
- cft = &h->cgroup_files_legacy[7];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.rsvd.failcnt", buf);
- cft->private = MEMFILE_PRIVATE(idx, RES_RSVD_FAILCNT);
- cft->write = hugetlb_cgroup_reset;
- cft->read_u64 = hugetlb_cgroup_read_u64;
-
- /* Add the numa stat file */
- cft = &h->cgroup_files_legacy[8];
- snprintf(cft->name, MAX_CFTYPE_NAME, "%s.numa_stat", buf);
- cft->private = MEMFILE_PRIVATE(idx, 0);
- cft->seq_show = hugetlb_cgroup_read_numa_stat;
-
- /* NULL terminate the last cft */
- cft = &h->cgroup_files_legacy[9];
- memset(cft, 0, sizeof(*cft));
-
- WARN_ON(cgroup_add_legacy_cftypes(&hugetlb_cgrp_subsys,
- h->cgroup_files_legacy));
}

-static void __init __hugetlb_cgroup_file_init(int idx)
+static void __init __hugetlb_cgroup_file_init(struct hstate *h)
{
- __hugetlb_cgroup_file_dfl_init(idx);
- __hugetlb_cgroup_file_legacy_init(idx);
+ __hugetlb_cgroup_file_dfl_init(h);
+ __hugetlb_cgroup_file_legacy_init(h);
}

static void __init __hugetlb_cgroup_file_pre_init(void)
@@ -1012,13 +874,22 @@ static void __init __hugetlb_cgroup_file_pre_init(void)
BUG_ON(!legacy_files);
}

+static void __init __hugetlb_cgroup_file_post_init(void)
+{
+ WARN_ON(cgroup_add_dfl_cftypes(&hugetlb_cgrp_subsys,
+ dfl_files));
+ WARN_ON(cgroup_add_legacy_cftypes(&hugetlb_cgrp_subsys,
+ legacy_files));
+}
+
void __init hugetlb_cgroup_file_init(void)
{
struct hstate *h;

__hugetlb_cgroup_file_pre_init();
for_each_hstate(h)
- __hugetlb_cgroup_file_init(hstate_index(h));
+ __hugetlb_cgroup_file_init(h);
+ __hugetlb_cgroup_file_post_init();
}

/*
--
2.34.1


2024-06-03 15:37:57

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template

Hi Xiu,

kernel test robot noticed the following build warnings:

[auto build test WARNING on akpm-mm/mm-everything]

url: https://github.com/intel-lab-lkp/linux/commits/Xiu-Jianfeng/mm-hugetlb_cgroup-identify-the-legacy-using-cgroup_subsys_on_dfl/20240603-201513
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20240603120506.1837322-3-xiujianfeng%40huawei.com
patch subject: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template
config: riscv-defconfig (https://download.01.org/0day-ci/archive/20240603/[email protected]/config)
compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project d7d2d4f53fc79b4b58e8d8d08151b577c3699d4a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240603/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

In file included from mm/hugetlb_cgroup.c:20:
In file included from include/linux/cgroup.h:25:
In file included from include/linux/kernel_stat.h:8:
In file included from include/linux/interrupt.h:21:
In file included from arch/riscv/include/asm/sections.h:9:
In file included from include/linux/mm.h:2245:
include/linux/vmstat.h:498:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
498 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
>> mm/hugetlb_cgroup.c:828:13: warning: address of array 'tmpl->name' will always evaluate to 'true' [-Wpointer-bool-conversion]
828 | if (tmpl->name)
| ~~ ~~~~~~^~~~
2 warnings generated.


vim +828 mm/hugetlb_cgroup.c

814
815 static void __init
816 hugetlb_cgroup_cfttypes_init(struct hstate *h, struct cftype *cft,
817 struct cftype *tmpl, int tmpl_size)
818 {
819 char buf[32];
820 int i, idx = hstate_index(h);
821
822 /* format the size */
823 mem_fmt(buf, sizeof(buf), huge_page_size(h));
824
825 for (i = 0; i < tmpl_size; cft++, tmpl++, i++) {
826 *cft = *tmpl;
827 /* rebuild the name */
> 828 if (tmpl->name)
829 snprintf(cft->name, MAX_CFTYPE_NAME, "%s.%s", buf, tmpl->name);
830 /* rebuild the private */
831 if (tmpl->private)
832 cft->private = MEMFILE_PRIVATE(idx, tmpl->private);
833 /* rebuild the file_offset */
834 if (tmpl->file_offset) {
835 unsigned int offset = tmpl->file_offset;
836
837 cft->file_offset = MEMFILE_OFFSET0(offset) +
838 MEMFILE_FIELD_SIZE(offset) * idx;
839 }
840 }
841 }
842

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2024-06-03 21:26:27

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template

Hi Xiu,

kernel test robot noticed the following build warnings:

[auto build test WARNING on akpm-mm/mm-everything]

url: https://github.com/intel-lab-lkp/linux/commits/Xiu-Jianfeng/mm-hugetlb_cgroup-identify-the-legacy-using-cgroup_subsys_on_dfl/20240603-201513
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20240603120506.1837322-3-xiujianfeng%40huawei.com
patch subject: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template
config: arm64-defconfig (https://download.01.org/0day-ci/archive/20240604/[email protected]/config)
compiler: aarch64-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240604/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

mm/hugetlb_cgroup.c: In function 'hugetlb_cgroup_cfttypes_init':
>> mm/hugetlb_cgroup.c:828:21: warning: the comparison will always evaluate as 'true' for the address of 'name' will never be NULL [-Waddress]
828 | if (tmpl->name)
| ^~~~
In file included from include/linux/cgroup.h:27,
from mm/hugetlb_cgroup.c:20:
include/linux/cgroup-defs.h:605:14: note: 'name' declared here
605 | char name[MAX_CFTYPE_NAME];
| ^~~~


vim +828 mm/hugetlb_cgroup.c

814
815 static void __init
816 hugetlb_cgroup_cfttypes_init(struct hstate *h, struct cftype *cft,
817 struct cftype *tmpl, int tmpl_size)
818 {
819 char buf[32];
820 int i, idx = hstate_index(h);
821
822 /* format the size */
823 mem_fmt(buf, sizeof(buf), huge_page_size(h));
824
825 for (i = 0; i < tmpl_size; cft++, tmpl++, i++) {
826 *cft = *tmpl;
827 /* rebuild the name */
> 828 if (tmpl->name)
829 snprintf(cft->name, MAX_CFTYPE_NAME, "%s.%s", buf, tmpl->name);
830 /* rebuild the private */
831 if (tmpl->private)
832 cft->private = MEMFILE_PRIVATE(idx, tmpl->private);
833 /* rebuild the file_offset */
834 if (tmpl->file_offset) {
835 unsigned int offset = tmpl->file_offset;
836
837 cft->file_offset = MEMFILE_OFFSET0(offset) +
838 MEMFILE_FIELD_SIZE(offset) * idx;
839 }
840 }
841 }
842

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2024-06-04 01:17:59

by Xiu Jianfeng

[permalink] [raw]
Subject: Re: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template



On 2024/6/4 5:25, kernel test robot wrote:
> Hi Xiu,
>
> kernel test robot noticed the following build warnings:
>
> [auto build test WARNING on akpm-mm/mm-everything]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Xiu-Jianfeng/mm-hugetlb_cgroup-identify-the-legacy-using-cgroup_subsys_on_dfl/20240603-201513
> base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/r/20240603120506.1837322-3-xiujianfeng%40huawei.com
> patch subject: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template
> config: arm64-defconfig (https://download.01.org/0day-ci/archive/20240604/[email protected]/config)
> compiler: aarch64-linux-gcc (GCC) 13.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240604/[email protected]/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <[email protected]>
> | Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
>
> All warnings (new ones prefixed by >>):
>
> mm/hugetlb_cgroup.c: In function 'hugetlb_cgroup_cfttypes_init':
>>> mm/hugetlb_cgroup.c:828:21: warning: the comparison will always evaluate as 'true' for the address of 'name' will never be NULL [-Waddress]
> 828 | if (tmpl->name)
> | ^~~~
> In file included from include/linux/cgroup.h:27,
> from mm/hugetlb_cgroup.c:20:
> include/linux/cgroup-defs.h:605:14: note: 'name' declared here
> 605 | char name[MAX_CFTYPE_NAME];
> | ^~~~
>

Thanks, will fix in the next version.

>
> vim +828 mm/hugetlb_cgroup.c
>
> 814
> 815 static void __init
> 816 hugetlb_cgroup_cfttypes_init(struct hstate *h, struct cftype *cft,
> 817 struct cftype *tmpl, int tmpl_size)
> 818 {
> 819 char buf[32];
> 820 int i, idx = hstate_index(h);
> 821
> 822 /* format the size */
> 823 mem_fmt(buf, sizeof(buf), huge_page_size(h));
> 824
> 825 for (i = 0; i < tmpl_size; cft++, tmpl++, i++) {
> 826 *cft = *tmpl;
> 827 /* rebuild the name */
> > 828 if (tmpl->name)
> 829 snprintf(cft->name, MAX_CFTYPE_NAME, "%s.%s", buf, tmpl->name);
> 830 /* rebuild the private */
> 831 if (tmpl->private)
> 832 cft->private = MEMFILE_PRIVATE(idx, tmpl->private);
> 833 /* rebuild the file_offset */
> 834 if (tmpl->file_offset) {
> 835 unsigned int offset = tmpl->file_offset;
> 836
> 837 cft->file_offset = MEMFILE_OFFSET0(offset) +
> 838 MEMFILE_FIELD_SIZE(offset) * idx;
> 839 }
> 840 }
> 841 }
> 842
>

2024-06-05 05:24:57

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template

Hi Xiu,

kernel test robot noticed the following build warnings:

url: https://github.com/intel-lab-lkp/linux/commits/Xiu-Jianfeng/mm-hugetlb_cgroup-identify-the-legacy-using-cgroup_subsys_on_dfl/20240603-201513
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20240603120506.1837322-3-xiujianfeng%40huawei.com
patch subject: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template
config: i386-randconfig-r071-20240604 (https://download.01.org/0day-ci/archive/20240605/[email protected]/config)
compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Reported-by: Dan Carpenter <[email protected]>
| Closes: https://lore.kernel.org/r/[email protected]/

smatch warnings:
mm/hugetlb_cgroup.c:828 hugetlb_cgroup_cfttypes_init() warn: this array is probably non-NULL. 'tmpl->name'

vim +828 mm/hugetlb_cgroup.c

66bcc9ace99241 Xiu Jianfeng 2024-06-03 815 static void __init
66bcc9ace99241 Xiu Jianfeng 2024-06-03 816 hugetlb_cgroup_cfttypes_init(struct hstate *h, struct cftype *cft,
66bcc9ace99241 Xiu Jianfeng 2024-06-03 817 struct cftype *tmpl, int tmpl_size)
66bcc9ace99241 Xiu Jianfeng 2024-06-03 818 {
66bcc9ace99241 Xiu Jianfeng 2024-06-03 819 char buf[32];
66bcc9ace99241 Xiu Jianfeng 2024-06-03 820 int i, idx = hstate_index(h);
66bcc9ace99241 Xiu Jianfeng 2024-06-03 821
66bcc9ace99241 Xiu Jianfeng 2024-06-03 822 /* format the size */
66bcc9ace99241 Xiu Jianfeng 2024-06-03 823 mem_fmt(buf, sizeof(buf), huge_page_size(h));
66bcc9ace99241 Xiu Jianfeng 2024-06-03 824
66bcc9ace99241 Xiu Jianfeng 2024-06-03 825 for (i = 0; i < tmpl_size; cft++, tmpl++, i++) {
66bcc9ace99241 Xiu Jianfeng 2024-06-03 826 *cft = *tmpl;
66bcc9ace99241 Xiu Jianfeng 2024-06-03 827 /* rebuild the name */
66bcc9ace99241 Xiu Jianfeng 2024-06-03 @828 if (tmpl->name)
66bcc9ace99241 Xiu Jianfeng 2024-06-03 829 snprintf(cft->name, MAX_CFTYPE_NAME, "%s.%s", buf, tmpl->name);

tmpl->name is an array so it's non-NULL. Just do the snprintf(). No
need for the if statement.

66bcc9ace99241 Xiu Jianfeng 2024-06-03 830 /* rebuild the private */
66bcc9ace99241 Xiu Jianfeng 2024-06-03 831 if (tmpl->private)
66bcc9ace99241 Xiu Jianfeng 2024-06-03 832 cft->private = MEMFILE_PRIVATE(idx, tmpl->private);
66bcc9ace99241 Xiu Jianfeng 2024-06-03 833 /* rebuild the file_offset */
66bcc9ace99241 Xiu Jianfeng 2024-06-03 834 if (tmpl->file_offset) {
66bcc9ace99241 Xiu Jianfeng 2024-06-03 835 unsigned int offset = tmpl->file_offset;
66bcc9ace99241 Xiu Jianfeng 2024-06-03 836
66bcc9ace99241 Xiu Jianfeng 2024-06-03 837 cft->file_offset = MEMFILE_OFFSET0(offset) +
66bcc9ace99241 Xiu Jianfeng 2024-06-03 838 MEMFILE_FIELD_SIZE(offset) * idx;
66bcc9ace99241 Xiu Jianfeng 2024-06-03 839 }
66bcc9ace99241 Xiu Jianfeng 2024-06-03 840 }
66bcc9ace99241 Xiu Jianfeng 2024-06-03 841 }

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


2024-06-05 06:15:39

by Xiu Jianfeng

[permalink] [raw]
Subject: Re: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template



On 2024/6/5 13:24, Dan Carpenter wrote:
> Hi Xiu,
>
> kernel test robot noticed the following build warnings:
>
> url: https://github.com/intel-lab-lkp/linux/commits/Xiu-Jianfeng/mm-hugetlb_cgroup-identify-the-legacy-using-cgroup_subsys_on_dfl/20240603-201513
> base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/r/20240603120506.1837322-3-xiujianfeng%40huawei.com
> patch subject: [PATCH -next 2/3] mm/hugetlb_cgroup: prepare cftypes based on template
> config: i386-randconfig-r071-20240604 (https://download.01.org/0day-ci/archive/20240605/[email protected]/config)
> compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <[email protected]>
> | Reported-by: Dan Carpenter <[email protected]>
> | Closes: https://lore.kernel.org/r/[email protected]/
>
> smatch warnings:
> mm/hugetlb_cgroup.c:828 hugetlb_cgroup_cfttypes_init() warn: this array is probably non-NULL. 'tmpl->name'
>
> vim +828 mm/hugetlb_cgroup.c
>
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 815 static void __init
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 816 hugetlb_cgroup_cfttypes_init(struct hstate *h, struct cftype *cft,
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 817 struct cftype *tmpl, int tmpl_size)
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 818 {
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 819 char buf[32];
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 820 int i, idx = hstate_index(h);
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 821
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 822 /* format the size */
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 823 mem_fmt(buf, sizeof(buf), huge_page_size(h));
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 824
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 825 for (i = 0; i < tmpl_size; cft++, tmpl++, i++) {
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 826 *cft = *tmpl;
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 827 /* rebuild the name */
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 @828 if (tmpl->name)
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 829 snprintf(cft->name, MAX_CFTYPE_NAME, "%s.%s", buf, tmpl->name);
>
> tmpl->name is an array so it's non-NULL. Just do the snprintf(). No
> need for the if statement.

Hi Dan,

Thanks for you review, will fix in the next version.

>
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 830 /* rebuild the private */
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 831 if (tmpl->private)
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 832 cft->private = MEMFILE_PRIVATE(idx, tmpl->private);
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 833 /* rebuild the file_offset */
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 834 if (tmpl->file_offset) {
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 835 unsigned int offset = tmpl->file_offset;
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 836
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 837 cft->file_offset = MEMFILE_OFFSET0(offset) +
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 838 MEMFILE_FIELD_SIZE(offset) * idx;
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 839 }
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 840 }
> 66bcc9ace99241 Xiu Jianfeng 2024-06-03 841 }
>