Message ID | nycvar.YFH.7.76.2210212114480.29912@cbobk.fhfr.pm (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2] mm/slab: Annotate kmem_cache_node->list_lock as raw | expand |
Hi Jiri, I love your patch! Yet something to improve: [auto build test ERROR on akpm-mm/mm-everything] [also build test ERROR on v6.1-rc1 next-20221021] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/UPDATE-20221022-031645/Jiri-Kosina/mm-slab-Annotate-kmem_cache_node-list_lock-as-raw/20221021-225037 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/nycvar.YFH.7.76.2210212114480.29912%40cbobk.fhfr.pm patch subject: [PATCH v2] mm/slab: Annotate kmem_cache_node->list_lock as raw config: x86_64-rhel-8.3-func compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 reproduce (this is a W=1 build): # https://github.com/intel-lab-lkp/linux/commit/87acd941576d0867488b675c1fe0d35ffd4d4541 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review UPDATE-20221022-031645/Jiri-Kosina/mm-slab-Annotate-kmem_cache_node-list_lock-as-raw/20221021-225037 git checkout 87acd941576d0867488b675c1fe0d35ffd4d4541 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c: In function 'alloc_single_from_new_slab': >> mm/slub.c:2124:27: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 2124 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:2124:9: note: in expansion of macro 'spin_lock_irqsave' 2124 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ >> mm/slub.c:2132:32: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 2132 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c: In function 'get_partial_node': mm/slub.c:2210:27: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 2210 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:2210:9: note: in expansion of macro 'spin_lock_irqsave' 2210 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ mm/slub.c:2247:32: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 2247 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c: In function 'deactivate_slab': mm/slub.c:2489:35: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 2489 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:2489:17: note: in expansion of macro 'spin_lock_irqsave' 2489 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c:2497:35: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 2497 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:2497:17: note: in expansion of macro 'spin_lock_irqsave' 2497 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ mm/slub.c:2508:48: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 2508 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: -- 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:2946:9: note: in expansion of macro 'spin_lock_irqsave' 2946 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ mm/slub.c:2949:32: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 2949 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ mm/slub.c: In function '__slab_free': mm/slub.c:3483:48: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 3483 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c:3515:51: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 3515 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:3515:33: note: in expansion of macro 'spin_lock_irqsave' 3515 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ mm/slub.c:3557:32: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 3557 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ mm/slub.c:3572:32: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 3572 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ mm/slub.c: In function 'init_kmem_cache_node': mm/slub.c:4008:24: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 4008 | spin_lock_init(&n->list_lock); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:342:24: note: in definition of macro 'spin_lock_init' 342 | spinlock_check(_lock); \ | ^~~~~ include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ In file included from include/linux/spinlock.h:88, from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: >> include/linux/spinlock_types.h:41:9: error: incompatible types when assigning to type 'raw_spinlock_t' {aka 'struct raw_spinlock'} from type 'spinlock_t' {aka 'struct spinlock'} 41 | (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname) | ^ include/linux/spinlock.h:343:20: note: in expansion of macro '__SPIN_LOCK_UNLOCKED' 343 | *(_lock) = __SPIN_LOCK_UNLOCKED(_lock); \ | ^~~~~~~~~~~~~~~~~~~~ mm/slub.c:4008:9: note: in expansion of macro 'spin_lock_init' 4008 | spin_lock_init(&n->list_lock); | ^~~~~~~~~~~~~~ mm/slub.c: In function 'free_partial': >> mm/slub.c:4393:23: error: passing argument 1 of 'spin_lock_irq' from incompatible pointer type [-Werror=incompatible-pointer-types] 4393 | spin_lock_irq(&n->list_lock); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:373:55: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 373 | static __always_inline void spin_lock_irq(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ >> mm/slub.c:4403:25: error: passing argument 1 of 'spin_unlock_irq' from incompatible pointer type [-Werror=incompatible-pointer-types] 4403 | spin_unlock_irq(&n->list_lock); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:398:57: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 398 | static __always_inline void spin_unlock_irq(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c: In function '__kmem_cache_do_shrink': mm/slub.c:4607:35: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 4607 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:4607:17: note: in expansion of macro 'spin_lock_irqsave' 4607 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ mm/slub.c:4639:40: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 4639 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c: In function 'validate_slab_node': mm/slub.c:4962:27: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 4962 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:4962:9: note: in expansion of macro 'spin_lock_irqsave' 4962 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:323:67: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 323 | static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock) | ~~~~~~~~~~~~^~~~ mm/slub.c:4988:32: error: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type [-Werror=incompatible-pointer-types] 4988 | spin_unlock_irqrestore(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: include/linux/spinlock.h:403:64: note: expected 'spinlock_t *' {aka 'struct spinlock *'} but argument is of type 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} 403 | static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | ~~~~~~~~~~~~^~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, from mm/slub.c:13: mm/slub.c: In function 'slab_debug_trace_open': mm/slub.c:6202:35: error: passing argument 1 of 'spinlock_check' from incompatible pointer type [-Werror=incompatible-pointer-types] 6202 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~ | | | raw_spinlock_t * {aka struct raw_spinlock *} include/linux/spinlock.h:243:48: note: in definition of macro 'raw_spin_lock_irqsave' 243 | flags = _raw_spin_lock_irqsave(lock); \ | ^~~~ mm/slub.c:6202:17: note: in expansion of macro 'spin_lock_irqsave' 6202 | spin_lock_irqsave(&n->list_lock, flags); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/mmzone.h:8, from include/linux/gfp.h:7, from include/linux/mm.h:7, vim +/spin_unlock_irqrestore +2132 mm/slub.c c7323a5ad07863 Vlastimil Babka 2022-08-23 2097 c7323a5ad07863 Vlastimil Babka 2022-08-23 2098 /* c7323a5ad07863 Vlastimil Babka 2022-08-23 2099 * Called only for kmem_cache_debug() caches to allocate from a freshly c7323a5ad07863 Vlastimil Babka 2022-08-23 2100 * allocated slab. Allocate a single object instead of whole freelist c7323a5ad07863 Vlastimil Babka 2022-08-23 2101 * and put the slab to the partial (or full) list. c7323a5ad07863 Vlastimil Babka 2022-08-23 2102 */ c7323a5ad07863 Vlastimil Babka 2022-08-23 2103 static void *alloc_single_from_new_slab(struct kmem_cache *s, 6edf2576a6cc46 Feng Tang 2022-09-13 2104 struct slab *slab, int orig_size) c7323a5ad07863 Vlastimil Babka 2022-08-23 2105 { c7323a5ad07863 Vlastimil Babka 2022-08-23 2106 int nid = slab_nid(slab); c7323a5ad07863 Vlastimil Babka 2022-08-23 2107 struct kmem_cache_node *n = get_node(s, nid); c7323a5ad07863 Vlastimil Babka 2022-08-23 2108 unsigned long flags; c7323a5ad07863 Vlastimil Babka 2022-08-23 2109 void *object; c7323a5ad07863 Vlastimil Babka 2022-08-23 2110 c7323a5ad07863 Vlastimil Babka 2022-08-23 2111 c7323a5ad07863 Vlastimil Babka 2022-08-23 2112 object = slab->freelist; c7323a5ad07863 Vlastimil Babka 2022-08-23 2113 slab->freelist = get_freepointer(s, object); c7323a5ad07863 Vlastimil Babka 2022-08-23 2114 slab->inuse = 1; c7323a5ad07863 Vlastimil Babka 2022-08-23 2115 6edf2576a6cc46 Feng Tang 2022-09-13 2116 if (!alloc_debug_processing(s, slab, object, orig_size)) c7323a5ad07863 Vlastimil Babka 2022-08-23 2117 /* c7323a5ad07863 Vlastimil Babka 2022-08-23 2118 * It's not really expected that this would fail on a c7323a5ad07863 Vlastimil Babka 2022-08-23 2119 * freshly allocated slab, but a concurrent memory c7323a5ad07863 Vlastimil Babka 2022-08-23 2120 * corruption in theory could cause that. c7323a5ad07863 Vlastimil Babka 2022-08-23 2121 */ c7323a5ad07863 Vlastimil Babka 2022-08-23 2122 return NULL; c7323a5ad07863 Vlastimil Babka 2022-08-23 2123 c7323a5ad07863 Vlastimil Babka 2022-08-23 @2124 spin_lock_irqsave(&n->list_lock, flags); c7323a5ad07863 Vlastimil Babka 2022-08-23 2125 c7323a5ad07863 Vlastimil Babka 2022-08-23 2126 if (slab->inuse == slab->objects) c7323a5ad07863 Vlastimil Babka 2022-08-23 2127 add_full(s, n, slab); c7323a5ad07863 Vlastimil Babka 2022-08-23 2128 else c7323a5ad07863 Vlastimil Babka 2022-08-23 2129 add_partial(n, slab, DEACTIVATE_TO_HEAD); c7323a5ad07863 Vlastimil Babka 2022-08-23 2130 c7323a5ad07863 Vlastimil Babka 2022-08-23 2131 inc_slabs_node(s, nid, slab->objects); c7323a5ad07863 Vlastimil Babka 2022-08-23 @2132 spin_unlock_irqrestore(&n->list_lock, flags); c7323a5ad07863 Vlastimil Babka 2022-08-23 2133 c7323a5ad07863 Vlastimil Babka 2022-08-23 2134 return object; c7323a5ad07863 Vlastimil Babka 2022-08-23 2135 } c7323a5ad07863 Vlastimil Babka 2022-08-23 2136
diff --git a/mm/slab.c b/mm/slab.c index 59c8e28f7b6a..d8a287900193 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -234,7 +234,7 @@ static void kmem_cache_node_init(struct kmem_cache_node *parent) parent->shared = NULL; parent->alien = NULL; parent->colour_next = 0; - spin_lock_init(&parent->list_lock); + raw_spin_lock_init(&parent->list_lock); parent->free_objects = 0; parent->free_touched = 0; } @@ -559,9 +559,9 @@ static noinline void cache_free_pfmemalloc(struct kmem_cache *cachep, slab_node = slab_nid(slab); n = get_node(cachep, slab_node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); free_block(cachep, &objp, 1, slab_node, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); slabs_destroy(cachep, &list); } @@ -684,7 +684,7 @@ static void __drain_alien_cache(struct kmem_cache *cachep, struct kmem_cache_node *n = get_node(cachep, node); if (ac->avail) { - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); /* * Stuff objects into the remote nodes shared array first. * That way we could avoid the overhead of putting the objects @@ -695,7 +695,7 @@ static void __drain_alien_cache(struct kmem_cache *cachep, free_block(cachep, ac->entry, ac->avail, node, list); ac->avail = 0; - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); } } @@ -768,9 +768,9 @@ static int __cache_free_alien(struct kmem_cache *cachep, void *objp, slabs_destroy(cachep, &list); } else { n = get_node(cachep, slab_node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); free_block(cachep, &objp, 1, slab_node, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); slabs_destroy(cachep, &list); } return 1; @@ -811,10 +811,10 @@ static int init_cache_node(struct kmem_cache *cachep, int node, gfp_t gfp) */ n = get_node(cachep, node); if (n) { - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); n->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount + cachep->num; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); return 0; } @@ -893,7 +893,7 @@ static int setup_kmem_cache_node(struct kmem_cache *cachep, goto fail; n = get_node(cachep, node); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); if (n->shared && force_change) { free_block(cachep, n->shared->entry, n->shared->avail, node, &list); @@ -911,7 +911,7 @@ static int setup_kmem_cache_node(struct kmem_cache *cachep, new_alien = NULL; } - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); /* @@ -950,7 +950,7 @@ static void cpuup_canceled(long cpu) if (!n) continue; - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); /* Free limit for this kmem_cache_node */ n->free_limit -= cachep->batchcount; @@ -961,7 +961,7 @@ static void cpuup_canceled(long cpu) nc->avail = 0; if (!cpumask_empty(mask)) { - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); goto free_slab; } @@ -975,7 +975,7 @@ static void cpuup_canceled(long cpu) alien = n->alien; n->alien = NULL; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); kfree(shared); if (alien) { @@ -1159,7 +1159,7 @@ static void __init init_list(struct kmem_cache *cachep, struct kmem_cache_node * /* * Do not assume that spinlocks can be initialized via memcpy: */ - spin_lock_init(&ptr->list_lock); + raw_spin_lock_init(&ptr->list_lock); MAKE_ALL_LISTS(cachep, ptr, nodeid); cachep->node[nodeid] = ptr; @@ -1330,11 +1330,11 @@ slab_out_of_memory(struct kmem_cache *cachep, gfp_t gfpflags, int nodeid) for_each_kmem_cache_node(cachep, node, n) { unsigned long total_slabs, free_slabs, free_objs; - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); total_slabs = n->total_slabs; free_slabs = n->free_slabs; free_objs = n->free_objects; - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); pr_warn(" node %d: slabs: %ld/%ld, objs: %ld/%ld\n", node, total_slabs - free_slabs, total_slabs, @@ -2096,7 +2096,7 @@ static void check_spinlock_acquired(struct kmem_cache *cachep) { #ifdef CONFIG_SMP check_irq_off(); - assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); + assert_raw_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); #endif } @@ -2104,7 +2104,7 @@ static void check_spinlock_acquired_node(struct kmem_cache *cachep, int node) { #ifdef CONFIG_SMP check_irq_off(); - assert_spin_locked(&get_node(cachep, node)->list_lock); + assert_raw_spin_locked(&get_node(cachep, node)->list_lock); #endif } @@ -2144,9 +2144,9 @@ static void do_drain(void *arg) check_irq_off(); ac = cpu_cache_get(cachep); n = get_node(cachep, node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); free_block(cachep, ac->entry, ac->avail, node, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); ac->avail = 0; slabs_destroy(cachep, &list); } @@ -2164,9 +2164,9 @@ static void drain_cpu_caches(struct kmem_cache *cachep) drain_alien_cache(cachep, n->alien); for_each_kmem_cache_node(cachep, node, n) { - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); drain_array_locked(cachep, n->shared, node, true, &list); - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); } @@ -2188,10 +2188,10 @@ static int drain_freelist(struct kmem_cache *cache, nr_freed = 0; while (nr_freed < tofree && !list_empty(&n->slabs_free)) { - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); p = n->slabs_free.prev; if (p == &n->slabs_free) { - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); goto out; } @@ -2204,7 +2204,7 @@ static int drain_freelist(struct kmem_cache *cache, * to the cache. */ n->free_objects -= cache->num; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slab_destroy(cache, slab); nr_freed++; } @@ -2629,7 +2629,7 @@ static void cache_grow_end(struct kmem_cache *cachep, struct slab *slab) INIT_LIST_HEAD(&slab->slab_list); n = get_node(cachep, slab_nid(slab)); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); n->total_slabs++; if (!slab->active) { list_add_tail(&slab->slab_list, &n->slabs_free); @@ -2639,7 +2639,7 @@ static void cache_grow_end(struct kmem_cache *cachep, struct slab *slab) STATS_INC_GROWN(cachep); n->free_objects += cachep->num - slab->active; - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); } @@ -2805,7 +2805,7 @@ static struct slab *get_first_slab(struct kmem_cache_node *n, bool pfmemalloc) { struct slab *slab; - assert_spin_locked(&n->list_lock); + assert_raw_spin_locked(&n->list_lock); slab = list_first_entry_or_null(&n->slabs_partial, struct slab, slab_list); if (!slab) { @@ -2832,10 +2832,10 @@ static noinline void *cache_alloc_pfmemalloc(struct kmem_cache *cachep, if (!gfp_pfmemalloc_allowed(flags)) return NULL; - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); slab = get_first_slab(n, true); if (!slab) { - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); return NULL; } @@ -2844,7 +2844,7 @@ static noinline void *cache_alloc_pfmemalloc(struct kmem_cache *cachep, fixup_slab_list(cachep, n, slab, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); return obj; @@ -2903,7 +2903,7 @@ static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags) if (!n->free_objects && (!shared || !shared->avail)) goto direct_grow; - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); shared = READ_ONCE(n->shared); /* See if we can refill from the shared array */ @@ -2927,7 +2927,7 @@ static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags) must_grow: n->free_objects -= ac->avail; alloc_done: - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); direct_grow: @@ -3147,7 +3147,7 @@ static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, BUG_ON(!n); check_irq_off(); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); slab = get_first_slab(n, false); if (!slab) goto must_grow; @@ -3165,12 +3165,12 @@ static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, fixup_slab_list(cachep, n, slab, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); return obj; must_grow: - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); slab = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid); if (slab) { /* This slab isn't counted yet so don't update free_objects */ @@ -3325,7 +3325,7 @@ static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac) check_irq_off(); n = get_node(cachep, node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); if (n->shared) { struct array_cache *shared_array = n->shared; int max = shared_array->limit - shared_array->avail; @@ -3354,7 +3354,7 @@ static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac) STATS_SET_FREEABLE(cachep, i); } #endif - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); ac->avail -= batchcount; memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail); slabs_destroy(cachep, &list); @@ -3721,9 +3721,9 @@ static int do_tune_cpucache(struct kmem_cache *cachep, int limit, node = cpu_to_mem(cpu); n = get_node(cachep, node); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); free_block(cachep, ac->entry, ac->avail, node, &list); - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); } free_percpu(prev); @@ -3815,9 +3815,9 @@ static void drain_array(struct kmem_cache *cachep, struct kmem_cache_node *n, return; } - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); drain_array_locked(cachep, ac, node, false, &list); - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); } @@ -3901,7 +3901,7 @@ void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo) for_each_kmem_cache_node(cachep, node, n) { check_irq_on(); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); total_slabs += n->total_slabs; free_slabs += n->free_slabs; @@ -3910,7 +3910,7 @@ void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo) if (n->shared) shared_avail += n->shared->avail; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); } num_objs = total_slabs * cachep->num; active_slabs = total_slabs - free_slabs; diff --git a/mm/slab.h b/mm/slab.h index 0202a8c2f0d2..7e0bdd7773f0 100644 --- a/mm/slab.h +++ b/mm/slab.h @@ -750,7 +750,7 @@ static inline void slab_post_alloc_hook(struct kmem_cache *s, * The slab lists for all objects. */ struct kmem_cache_node { - spinlock_t list_lock; + raw_spinlock_t list_lock; #ifdef CONFIG_SLAB struct list_head slabs_partial; /* partial list first, better asm code */