diff options
| author | David S. Miller <davem@davemloft.net> | 2020-04-25 19:24:42 -0700 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2020-04-25 20:18:53 -0700 |
| commit | d483389678f9e03d53f226641ea39679debcbc81 (patch) | |
| tree | e33c9e59627e806ef97be9ef66c48afb1e4ab393 /mm/slub.c | |
| parent | 6033cebdfff9b10192eb254e8cc60fedd595ea7f (diff) | |
| parent | b2768df24ec400dd4f7fa79542f797e904812053 (diff) | |
| download | net-d483389678f9e03d53f226641ea39679debcbc81.tar.gz | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Simple overlapping changes to linux/vermagic.h
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'mm/slub.c')
| -rw-r--r-- | mm/slub.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/slub.c b/mm/slub.c index 332d4b459a907b..9bf44955c4f1e4 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -3533,6 +3533,7 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order) { slab_flags_t flags = s->flags; unsigned int size = s->object_size; + unsigned int freepointer_area; unsigned int order; /* @@ -3541,6 +3542,13 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order) * the possible location of the free pointer. */ size = ALIGN(size, sizeof(void *)); + /* + * This is the area of the object where a freepointer can be + * safely written. If redzoning adds more to the inuse size, we + * can't use that portion for writing the freepointer, so + * s->offset must be limited within this for the general case. + */ + freepointer_area = size; #ifdef CONFIG_SLUB_DEBUG /* @@ -3582,13 +3590,13 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order) */ s->offset = size; size += sizeof(void *); - } else if (size > sizeof(void *)) { + } else if (freepointer_area > sizeof(void *)) { /* * Store freelist pointer near middle of object to keep * it away from the edges of the object to avoid small * sized over/underflows from neighboring allocations. */ - s->offset = ALIGN(size / 2, sizeof(void *)); + s->offset = ALIGN(freepointer_area / 2, sizeof(void *)); } #ifdef CONFIG_SLUB_DEBUG |
