SLAB_STORE_USER stores one allocation track and one free track after the object. Several offset and size calculations open-code that as 2 * sizeof(struct track). Introduce helpers for the number and size of user tracking records, and use them for the existing metadata layout calculations. This is a preparatory cleanup for adding optional extra user tracking records without changing the current layout or behavior. Signed-off-by: Pengpeng Hou --- mm/slub.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/mm/slub.c b/mm/slub.c index a2bf3756ca7d..a9114dddc976 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -316,7 +316,20 @@ struct track { unsigned long when; /* When did the operation occur */ }; -enum track_item { TRACK_ALLOC, TRACK_FREE }; +enum track_item { TRACK_ALLOC, TRACK_FREE, TRACK_NR }; + +static inline unsigned int nr_user_tracks(struct kmem_cache *s) +{ + if (!(s->flags & SLAB_STORE_USER)) + return 0; + + return TRACK_NR; +} + +static inline unsigned int user_tracking_size(struct kmem_cache *s) +{ + return nr_user_tracks(s) * sizeof(struct track); +} #ifdef SLAB_SUPPORTS_SYSFS static int sysfs_slab_add(struct kmem_cache *); @@ -740,7 +753,7 @@ static inline void set_orig_size(struct kmem_cache *s, return; p += get_info_end(s); - p += sizeof(struct track) * 2; + p += user_tracking_size(s); *(unsigned long *)p = orig_size; } @@ -756,7 +769,7 @@ static inline unsigned long get_orig_size(struct kmem_cache *s, void *object) return s->object_size; p += get_info_end(s); - p += sizeof(struct track) * 2; + p += user_tracking_size(s); return *(unsigned long *)p; } @@ -873,8 +886,7 @@ static unsigned int obj_exts_offset_in_object(struct kmem_cache *s) { unsigned int offset = get_info_end(s); - if (kmem_cache_debug_flags(s, SLAB_STORE_USER)) - offset += sizeof(struct track) * 2; + offset += user_tracking_size(s); if (slub_debug_orig_size(s)) offset += sizeof(unsigned long); @@ -1077,7 +1089,7 @@ static void init_tracking(struct kmem_cache *s, void *object) return; p = get_track(s, object, TRACK_ALLOC); - memset(p, 0, 2*sizeof(struct track)); + memset(p, 0, user_tracking_size(s)); } static void print_track(const char *s, struct track *t, unsigned long pr_time) @@ -1185,8 +1197,7 @@ static void print_trailer(struct kmem_cache *s, struct slab *slab, u8 *p) off = get_info_end(s); - if (s->flags & SLAB_STORE_USER) - off += 2 * sizeof(struct track); + off += user_tracking_size(s); if (slub_debug_orig_size(s)) off += sizeof(unsigned long); @@ -1390,7 +1401,7 @@ static int check_pad_bytes(struct kmem_cache *s, struct slab *slab, u8 *p) if (s->flags & SLAB_STORE_USER) { /* We also have user information there */ - off += 2 * sizeof(struct track); + off += user_tracking_size(s); if (s->flags & SLAB_KMALLOC) off += sizeof(unsigned long); @@ -7845,7 +7856,7 @@ static int calculate_sizes(struct kmem_cache_args *args, struct kmem_cache *s) * Need to store information about allocs and frees after * the object. */ - size += 2 * sizeof(struct track); + size += user_tracking_size(s); /* Save the original kmalloc request size */ if (flags & SLAB_KMALLOC) -- 2.50.1 (Apple Git-155)