Re: [bug report] mm: memcg: move charge migration code to memcontrol-v1.c

From: Michal Hocko
Date: Mon Jul 15 2024 - 04:19:54 EST


On Fri 12-07-24 18:56:03, Roman Gushchin wrote:
> On Fri, Jul 12, 2024 at 09:07:45AM -0500, Dan Carpenter wrote:
> > Hello Roman Gushchin,
> >
> > Commit e548ad4a7cbf ("mm: memcg: move charge migration code to
> > memcontrol-v1.c") from Jun 24, 2024 (linux-next), leads to the
> > following Smatch static checker warning:
> >
> > mm/memcontrol-v1.c:609 mem_cgroup_move_charge_write()
> > warn: was expecting a 64 bit value instead of '~(1 | 2)'
> >
> > mm/memcontrol-v1.c
> > 599 #ifdef CONFIG_MMU
> > 600 static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css,
> > 601 struct cftype *cft, u64 val)
> > 602 {
> > 603 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
> > 604
> > 605 pr_warn_once("Cgroup memory moving (move_charge_at_immigrate) is deprecated. "
> > 606 "Please report your usecase to linux-mm@xxxxxxxxx if you "
> > 607 "depend on this functionality.\n");
> > 608
> > --> 609 if (val & ~MOVE_MASK)
> >
> > val is a u64 and MOVE_MASK is a u32. This only checks if something in the low
> > 32 bits is set and it ignores the high 32 bits.
>
> Hi Dan,
>
> thank you for the report!
>
> The mentioned commit just moved to code from memcontrol.c to memcontrol-v1.c,
> so the bug is actually much much older. Anyway, the fix is attached below.
>
> Andrew, can you please pick it up?
>
> I don't think the problem and the fix deserve a stable backport.

Agreed!

> Thank you!
>
> --
>
> >From 8b3d1ebb8d99cd9d3ab331f69ba9170f09a5c9b6 Mon Sep 17 00:00:00 2001
> From: Roman Gushchin <roman.gushchin@xxxxxxxxx>
> Date: Fri, 12 Jul 2024 18:35:14 +0000
> Subject: [PATCH] mm: memcg1: convert charge move flags to unsigned long long
>
> Currently MOVE_ANON and MOVE_FILE flags are defined as integers
> and it leads to the following Smatch static checker warning:
> mm/memcontrol-v1.c:609 mem_cgroup_move_charge_write()
> warn: was expecting a 64 bit value instead of '~(1 | 2)'
>
> Fix this be redefining them as unsigned long long.
>
> Even though the issue allows to set high 32 bits of mc.flags
> to an arbitrary number, these bits are never used, so it doesn't
> have any significant consequences.
>
> Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
> Signed-off-by: Roman Gushchin <roman.gushchin@xxxxxxxxx>

Acked-by: Michal Hocko <mhocko@xxxxxxxx>

Thanks!

> ---
> mm/memcontrol-v1.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/mm/memcontrol-v1.c b/mm/memcontrol-v1.c
> index 6b3e56e88a8a..2aeea4d8bf8e 100644
> --- a/mm/memcontrol-v1.c
> +++ b/mm/memcontrol-v1.c
> @@ -44,8 +44,8 @@ static struct mem_cgroup_tree soft_limit_tree __read_mostly;
> /*
> * Types of charges to be moved.
> */
> -#define MOVE_ANON 0x1U
> -#define MOVE_FILE 0x2U
> +#define MOVE_ANON 0x1ULL
> +#define MOVE_FILE 0x2ULL
> #define MOVE_MASK (MOVE_ANON | MOVE_FILE)
>
> /* "mc" and its members are protected by cgroup_mutex */
> --
> 2.45.2.993.g49e7a77208-goog

--
Michal Hocko
SUSE Labs