From: kernel test robot <lkp@intel.com>
To: Youngjun Park <youngjun.park@lge.com>,
akpm@linux-foundation.org, hannes@cmpxchg.org
Cc: oe-kbuild-all@lists.linux.dev, mhocko@kernel.org,
roman.gushchin@linux.dev, shakeel.butt@linux.dev,
muchun.song@linux.dev, shikemeng@huaweicloud.com,
kasong@tencent.com, nphamcs@gmail.com, bhe@redhat.com,
baohua@kernel.org, chrisl@kernel.org, cgroups@vger.kernel.org,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
gunho.lee@lge.com, iamjoonsoo.kim@lge.com, taejoon.song@lge.com,
"Youngjun Park" <youngjun.park@lge.com>,
"Michal Koutný" <mkoutny@suse.com>
Subject: Re: [PATCH 1/4] mm/swap, memcg: Introduce infrastructure for cgroup-based swap priority
Date: Sat, 19 Jul 2025 01:08:46 +0800 [thread overview]
Message-ID: <202507190037.RCDNmMsJ-lkp@intel.com> (raw)
In-Reply-To: <20250716202006.3640584-2-youngjun.park@lge.com>
Hi Youngjun,
kernel test robot noticed the following build errors:
[auto build test ERROR on 347e9f5043c89695b01e66b3ed111755afcf1911]
url: https://github.com/intel-lab-lkp/linux/commits/Youngjun-Park/mm-swap-memcg-Introduce-infrastructure-for-cgroup-based-swap-priority/20250717-042648
base: 347e9f5043c89695b01e66b3ed111755afcf1911
patch link: https://lore.kernel.org/r/20250716202006.3640584-2-youngjun.park%40lge.com
patch subject: [PATCH 1/4] mm/swap, memcg: Introduce infrastructure for cgroup-based swap priority
config: sparc64-randconfig-r054-20250718 (https://download.01.org/0day-ci/archive/20250719/202507190037.RCDNmMsJ-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250719/202507190037.RCDNmMsJ-lkp@intel.com/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 <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507190037.RCDNmMsJ-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from include/linux/rbtree.h:24,
from include/linux/mm_types.h:11,
from include/linux/mmzone.h:22,
from include/linux/swap.h:7,
from mm/swap_cgroup_priority.c:16:
mm/swap_cgroup_priority.c: In function 'get_swap_cgroup_priority':
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/rcupdate.h:532:17: note: in definition of macro '__rcu_dereference_check'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/rcupdate.h:532:38: note: in definition of macro '__rcu_dereference_check'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
In file included from <command-line>:
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:548:23: note: in definition of macro '__compiletime_assert'
548 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:568:9: note: in expansion of macro '_compiletime_assert'
568 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:548:23: note: in definition of macro '__compiletime_assert'
548 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:568:9: note: in expansion of macro '_compiletime_assert'
568 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:548:23: note: in definition of macro '__compiletime_assert'
548 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:568:9: note: in expansion of macro '_compiletime_assert'
568 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:548:23: note: in definition of macro '__compiletime_assert'
548 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:568:9: note: in expansion of macro '_compiletime_assert'
568 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:548:23: note: in definition of macro '__compiletime_assert'
548 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:568:9: note: in expansion of macro '_compiletime_assert'
568 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:518:27: note: in definition of macro '__unqual_scalar_typeof'
518 | _Generic((x), \
| ^
include/asm-generic/rwonce.h:50:9: note: in expansion of macro '__READ_ONCE'
50 | __READ_ONCE(x); \
| ^~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
In file included from ./arch/sparc/include/generated/asm/rwonce.h:1,
from include/linux/compiler.h:390,
from include/linux/export.h:5,
from include/linux/linkage.h:7,
from include/linux/preempt.h:10,
from include/linux/spinlock.h:56,
from include/linux/swap.h:5:
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/asm-generic/rwonce.h:44:73: note: in definition of macro '__READ_ONCE'
44 | #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x))
| ^
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
>> mm/swap_cgroup_priority.c:115:37: error: invalid use of undefined type 'struct mem_cgroup'
115 | return rcu_dereference(memcg->swap_priority);
| ^~
include/linux/rcupdate.h:535:19: note: in definition of macro '__rcu_dereference_check'
535 | ((typeof(*p) __force __kernel *)(local)); \
| ^
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:115:16: note: in expansion of macro 'rcu_dereference'
115 | return rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c: In function 'show_swap_cgroup_priority':
mm/swap_cgroup_priority.c:186:30: error: invalid use of undefined type 'struct mem_cgroup'
186 | swap_priority = memcg->swap_priority;
| ^~
mm/swap_cgroup_priority.c: In function 'swap_alloc_cgroup_priority':
mm/swap_cgroup_priority.c:285:26: error: invalid use of undefined type 'struct mem_cgroup'
285 | if (memcg->swap_priority != swap_priority)
| ^~
mm/swap_cgroup_priority.c: In function 'apply_swap_cgroup_priority':
mm/swap_cgroup_priority.c:638:46: error: invalid use of undefined type 'struct mem_cgroup'
638 | swap_priority = rcu_dereference(memcg->swap_priority);
| ^~
include/linux/rcupdate.h:532:17: note: in definition of macro '__rcu_dereference_check'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:638:25: note: in expansion of macro 'rcu_dereference'
638 | swap_priority = rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:638:46: error: invalid use of undefined type 'struct mem_cgroup'
638 | swap_priority = rcu_dereference(memcg->swap_priority);
| ^~
include/linux/rcupdate.h:532:38: note: in definition of macro '__rcu_dereference_check'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:638:25: note: in expansion of macro 'rcu_dereference'
638 | swap_priority = rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:638:46: error: invalid use of undefined type 'struct mem_cgroup'
638 | swap_priority = rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:548:23: note: in definition of macro '__compiletime_assert'
548 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:568:9: note: in expansion of macro '_compiletime_assert'
568 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:638:25: note: in expansion of macro 'rcu_dereference'
638 | swap_priority = rcu_dereference(memcg->swap_priority);
| ^~~~~~~~~~~~~~~
mm/swap_cgroup_priority.c:638:46: error: invalid use of undefined type 'struct mem_cgroup'
638 | swap_priority = rcu_dereference(memcg->swap_priority);
| ^~
include/linux/compiler_types.h:548:23: note: in definition of macro '__compiletime_assert'
548 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:568:9: note: in expansion of macro '_compiletime_assert'
568 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:532:50: note: in expansion of macro 'READ_ONCE'
532 | typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
| ^~~~~~~~~
include/linux/rcupdate.h:680:9: note: in expansion of macro '__rcu_dereference_check'
680 | __rcu_dereference_check((p), __UNIQUE_ID(rcu), \
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:752:28: note: in expansion of macro 'rcu_dereference_check'
752 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
vim +115 mm/swap_cgroup_priority.c
> 16 #include <linux/swap.h>
17 #include <linux/rcupdate.h>
18 #include <linux/memcontrol.h>
19 #include <linux/plist.h>
20 #include "swap.h"
21 #include "swap_cgroup_priority.h"
22 #include "memcontrol-v1.h"
23
24 static LIST_HEAD(swap_cgroup_priority_list);
25
26 /*
27 * struct swap_cgroup_priority
28 *
29 * This structure is RCU protected. Its lifecycle is determined by its
30 * owning memcg or when its 'distance' reaches zero. The 'distance' field
31 * tracks priority differences from global swap. If zero, and its default_prio
32 * follows global swap priority(SWAP_PRIORITY_GLOBAL), the object is destroyed.
33 *
34 * pnode - Array of pointers to swap device priority nodes.
35 * owner - The owning memory cgroup.
36 * rcu - RCU free callback.
37 * link - Global linked list entry.
38 * least_priority - Current lowest priority.
39 * distance - Priority differences from global swap priority.
40 * default_prio - Default priority for this cgroup.
41 * plist - Priority list head.
42 */
43 struct swap_cgroup_priority {
44 struct swap_cgroup_priority_pnode *pnode[MAX_SWAPFILES];
45 struct mem_cgroup *owner;
46
47 union {
48 struct rcu_head rcu;
49 struct list_head link;
50 };
51
52 int least_priority;
53 s8 distance;
54 int default_prio;
55 struct plist_head plist[];
56 };
57
58 /*
59 * struct swap_cgroup_priority_pnode
60 *
61 * This structure represents a priority node for a specific swap device
62 * within a cgroup.
63 *
64 * swap - Pointer to the associated swap device.
65 * id - Unique identifier for the swap device.
66 * prio - Configured priority for this device.
67 * avail_lists - Connections to various priority lists.
68 */
69 struct swap_cgroup_priority_pnode {
70 struct swap_info_struct *swap;
71 u64 id;
72 signed short prio;
73 struct plist_node avail_lists[];
74 };
75
76 /*
77 * Even with a zero distance, a swap device isn't assigned if it doesn't
78 * meet global swap priority conditions; thus, we don't clear it.
79 */
80 static bool should_clear_swap_cgroup_priority(
81 struct swap_cgroup_priority *swap_priority)
82 {
83 WARN_ON_ONCE(swap_priority->distance < 0 ||
84 swap_priority->distance > MAX_SWAPFILES);
85
86 if (swap_priority->distance == 0 &&
87 swap_priority->default_prio == SWAP_PRIORITY_GLOBAL)
88 return true;
89
90 return false;
91 }
92
93 /*
94 * swapdev_id
95 *
96 * A unique identifier for a swap device.
97 *
98 * This ID ensures stable identification for users and crucial synchronization
99 * for swap cgroup priority settings. It provides a reliable reference even if
100 * device paths or numbers change.
101 */
102 static atomic64_t swapdev_id_counter;
103
104 void get_swapdev_id(struct swap_info_struct *si)
105 {
106 si->id = atomic64_inc_return(&swapdev_id_counter);
107 }
108
109 static struct swap_cgroup_priority *get_swap_cgroup_priority(
110 struct mem_cgroup *memcg)
111 {
112 if (!memcg)
113 return NULL;
114
> 115 return rcu_dereference(memcg->swap_priority);
116 }
117
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2025-07-18 17:09 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-16 20:20 [PATCH 0/4] mm/swap, memcg: Support per-cgroup swap device priorities Youngjun Park
2025-07-16 20:20 ` [PATCH 1/4] mm/swap, memcg: Introduce infrastructure for cgroup-based swap priority Youngjun Park
2025-07-17 11:20 ` kernel test robot
2025-07-22 14:09 ` YoungJun Park
2025-07-18 17:08 ` kernel test robot [this message]
2025-07-22 14:11 ` YoungJun Park
2025-07-21 15:13 ` kernel test robot
2025-07-22 14:14 ` YoungJun Park
2025-07-22 8:41 ` Michal Koutný
2025-07-22 14:05 ` YoungJun Park
2025-07-22 18:41 ` YoungJun Park
2025-08-14 14:03 ` Michal Koutný
2025-08-15 15:10 ` Chris Li
2025-08-16 17:21 ` YoungJun Park
2025-08-16 19:15 ` Chris Li
2025-08-19 10:12 ` YoungJun Park
2025-08-20 0:52 ` Chris Li
2025-08-20 14:39 ` YoungJun Park
2025-08-21 20:39 ` Chris Li
2025-08-22 5:45 ` YoungJun Park
2025-08-22 16:48 ` Chris Li
2025-08-24 12:05 ` YoungJun Park
2025-08-26 8:19 ` Chris Li
2025-08-26 12:57 ` YoungJun Park
2025-08-26 14:30 ` Chris Li
2025-08-30 4:05 ` YoungJun Park
2025-08-30 7:13 ` Chris Li
2025-08-31 13:53 ` YoungJun Park
2025-08-31 16:45 ` Chris Li
2025-09-01 16:03 ` YoungJun Park
2025-09-01 16:06 ` YoungJun Park
2025-09-01 22:40 ` Chris Li
2025-09-03 9:32 ` Chris Li
2025-09-03 10:18 ` YoungJun Park
2025-09-05 6:30 ` YoungJun Park
2025-09-05 23:45 ` Chris Li
2025-09-06 12:56 ` Chris Li
2025-09-07 17:51 ` YoungJun Park
2025-09-10 0:26 ` Chris Li
2025-09-07 17:39 ` YoungJun Park
2025-09-10 0:14 ` Chris Li
2025-09-12 15:39 ` YoungJun Park
2025-08-24 14:19 ` YoungJun Park
2025-08-16 16:41 ` YoungJun Park
2025-07-16 20:20 ` [PATCH 2/4] mm: swap: Apply per-cgroup swap priority mechanism to swap layer Youngjun Park
2025-07-16 20:20 ` [PATCH 3/4] mm: memcg: Add swap cgroup priority inheritance mechanism Youngjun Park
2025-07-16 20:20 ` [PATCH 4/4] mm: swap: Per-cgroup per-CPU swap device cache with shared clusters Youngjun Park
2025-07-22 17:44 ` Kairui Song
2025-07-22 18:30 ` YoungJun Park
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=202507190037.RCDNmMsJ-lkp@intel.com \
--to=lkp@intel.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=bhe@redhat.com \
--cc=cgroups@vger.kernel.org \
--cc=chrisl@kernel.org \
--cc=gunho.lee@lge.com \
--cc=hannes@cmpxchg.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=kasong@tencent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=mkoutny@suse.com \
--cc=muchun.song@linux.dev \
--cc=nphamcs@gmail.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=roman.gushchin@linux.dev \
--cc=shakeel.butt@linux.dev \
--cc=shikemeng@huaweicloud.com \
--cc=taejoon.song@lge.com \
--cc=youngjun.park@lge.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.