Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'slab-for-6.17-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab

Pull slab fixes from Vlastimil Babka:

- Stable fix to make slub_debug code not access invalid pointers in the
process of reporting issues (Li Qiong)

- Stable fix to make object tracking pass gfp flags to stackdepot to
avoid deadlock in contexts that can't even wake up kswapd due to e.g.
timers debugging enabled (yangshiguang)

* tag 'slab-for-6.17-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab:
mm: slub: avoid wake up kswapd in set_track_prepare
mm/slub: avoid accessing metadata when pointer is invalid in object_err()

+26 -11
+26 -11
mm/slub.c
··· 962 962 } 963 963 964 964 #ifdef CONFIG_STACKDEPOT 965 - static noinline depot_stack_handle_t set_track_prepare(void) 965 + static noinline depot_stack_handle_t set_track_prepare(gfp_t gfp_flags) 966 966 { 967 967 depot_stack_handle_t handle; 968 968 unsigned long entries[TRACK_ADDRS_COUNT]; 969 969 unsigned int nr_entries; 970 970 971 971 nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 3); 972 - handle = stack_depot_save(entries, nr_entries, GFP_NOWAIT); 972 + handle = stack_depot_save(entries, nr_entries, gfp_flags); 973 973 974 974 return handle; 975 975 } 976 976 #else 977 - static inline depot_stack_handle_t set_track_prepare(void) 977 + static inline depot_stack_handle_t set_track_prepare(gfp_t gfp_flags) 978 978 { 979 979 return 0; 980 980 } ··· 996 996 } 997 997 998 998 static __always_inline void set_track(struct kmem_cache *s, void *object, 999 - enum track_item alloc, unsigned long addr) 999 + enum track_item alloc, unsigned long addr, gfp_t gfp_flags) 1000 1000 { 1001 - depot_stack_handle_t handle = set_track_prepare(); 1001 + depot_stack_handle_t handle = set_track_prepare(gfp_flags); 1002 1002 1003 1003 set_track_update(s, object, alloc, addr, handle); 1004 1004 } ··· 1140 1140 return; 1141 1141 1142 1142 slab_bug(s, reason); 1143 - print_trailer(s, slab, object); 1143 + if (!object || !check_valid_pointer(s, slab, object)) { 1144 + print_slab_info(slab); 1145 + pr_err("Invalid pointer 0x%p\n", object); 1146 + } else { 1147 + print_trailer(s, slab, object); 1148 + } 1144 1149 add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE); 1145 1150 1146 1151 WARN_ON(1); ··· 1926 1921 static inline void slab_pad_check(struct kmem_cache *s, struct slab *slab) {} 1927 1922 static inline int check_object(struct kmem_cache *s, struct slab *slab, 1928 1923 void *object, u8 val) { return 1; } 1929 - static inline depot_stack_handle_t set_track_prepare(void) { return 0; } 1924 + static inline depot_stack_handle_t set_track_prepare(gfp_t gfp_flags) { return 0; } 1930 1925 static inline void set_track(struct kmem_cache *s, void *object, 1931 - enum track_item alloc, unsigned long addr) {} 1926 + enum track_item alloc, unsigned long addr, gfp_t gfp_flags) {} 1932 1927 static inline void add_full(struct kmem_cache *s, struct kmem_cache_node *n, 1933 1928 struct slab *slab) {} 1934 1929 static inline void remove_full(struct kmem_cache *s, struct kmem_cache_node *n, ··· 3881 3876 * For debug caches here we had to go through 3882 3877 * alloc_single_from_partial() so just store the 3883 3878 * tracking info and return the object. 3879 + * 3880 + * Due to disabled preemption we need to disallow 3881 + * blocking. The flags are further adjusted by 3882 + * gfp_nested_mask() in stack_depot itself. 3884 3883 */ 3885 3884 if (s->flags & SLAB_STORE_USER) 3886 - set_track(s, freelist, TRACK_ALLOC, addr); 3885 + set_track(s, freelist, TRACK_ALLOC, addr, 3886 + gfpflags & ~(__GFP_DIRECT_RECLAIM)); 3887 3887 3888 3888 return freelist; 3889 3889 } ··· 3920 3910 goto new_objects; 3921 3911 3922 3912 if (s->flags & SLAB_STORE_USER) 3923 - set_track(s, freelist, TRACK_ALLOC, addr); 3913 + set_track(s, freelist, TRACK_ALLOC, addr, 3914 + gfpflags & ~(__GFP_DIRECT_RECLAIM)); 3924 3915 3925 3916 return freelist; 3926 3917 } ··· 4432 4421 unsigned long flags; 4433 4422 depot_stack_handle_t handle = 0; 4434 4423 4424 + /* 4425 + * We cannot use GFP_NOWAIT as there are callsites where waking up 4426 + * kswapd could deadlock 4427 + */ 4435 4428 if (s->flags & SLAB_STORE_USER) 4436 - handle = set_track_prepare(); 4429 + handle = set_track_prepare(__GFP_NOWARN); 4437 4430 4438 4431 spin_lock_irqsave(&n->list_lock, flags); 4439 4432