slab: move validate_slab_ptr() from alloc_consistency_checks() to its caller

In alloc_debug_processing() we can call validate_slab_ptr() upfront and
then don't need to recheck when alloc_consistency_checks() fails for
other reasons.

Reviewed-by: Harry Yoo <harry.yoo@oracle.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
Vlastimil Babka
2025-09-15 15:55:11 +02:00
parent 6f6fcd4634
commit 40522db59b

View File

@@ -1633,11 +1633,6 @@ void setup_slab_debug(struct kmem_cache *s, struct slab *slab, void *addr)
static inline int alloc_consistency_checks(struct kmem_cache *s,
struct slab *slab, void *object)
{
if (!validate_slab_ptr(slab)) {
slab_err(s, slab, "Not a valid slab page");
return 0;
}
if (!check_slab(s, slab))
return 0;
@@ -1656,6 +1651,11 @@ static noinline bool alloc_debug_processing(struct kmem_cache *s,
struct slab *slab, void *object, int orig_size)
{
if (s->flags & SLAB_CONSISTENCY_CHECKS) {
if (!validate_slab_ptr(slab)) {
slab_err(s, slab, "Not a valid slab page");
return false;
}
if (!alloc_consistency_checks(s, slab, object))
goto bad;
}
@@ -1667,17 +1667,15 @@ static noinline bool alloc_debug_processing(struct kmem_cache *s,
return true;
bad:
if (validate_slab_ptr(slab)) {
/*
* If this is a slab page then lets do the best we can
* to avoid issues in the future. Marking all objects
* as used avoids touching the remaining objects.
*/
slab_fix(s, "Marking all objects used");
slab->inuse = slab->objects;
slab->freelist = NULL;
slab->frozen = 1; /* mark consistency-failed slab as frozen */
}
/*
* Let's do the best we can to avoid issues in the future. Marking all
* objects as used avoids touching the remaining objects.
*/
slab_fix(s, "Marking all objects used");
slab->inuse = slab->objects;
slab->freelist = NULL;
slab->frozen = 1; /* mark consistency-failed slab as frozen */
return false;
}