mirror of
https://github.com/torvalds/linux
synced 2024-07-22 11:10:46 +00:00
mm, slab, kasan: replace kasan_never_merge() with SLAB_NO_MERGE
The SLAB_KASAN flag prevents merging of caches in some configurations, which is handled in a rather complicated way via kasan_never_merge(). Since we now have a generic SLAB_NO_MERGE flag, we can instead use it for KASAN caches in addition to SLAB_KASAN in those configurations, and simplify the SLAB_NEVER_MERGE handling. Tested-by: Xiongwei Song <xiongwei.song@windriver.com> Reviewed-by: Chengming Zhou <chengming.zhou@linux.dev> Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com> Tested-by: David Rientjes <rientjes@google.com> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
parent
cc61eb851c
commit
96d8dbb6f6
|
@ -429,7 +429,6 @@ struct kasan_cache {
|
|||
};
|
||||
|
||||
size_t kasan_metadata_size(struct kmem_cache *cache, bool in_object);
|
||||
slab_flags_t kasan_never_merge(void);
|
||||
void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
|
||||
slab_flags_t *flags);
|
||||
|
||||
|
@ -446,11 +445,6 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache,
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
/* And thus nothing prevents cache merging. */
|
||||
static inline slab_flags_t kasan_never_merge(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/* And no cache-related metadata initialization is required. */
|
||||
static inline void kasan_cache_create(struct kmem_cache *cache,
|
||||
unsigned int *size,
|
||||
|
|
|
@ -334,14 +334,6 @@ DEFINE_ASAN_SET_SHADOW(f3);
|
|||
DEFINE_ASAN_SET_SHADOW(f5);
|
||||
DEFINE_ASAN_SET_SHADOW(f8);
|
||||
|
||||
/* Only allow cache merging when no per-object metadata is present. */
|
||||
slab_flags_t kasan_never_merge(void)
|
||||
{
|
||||
if (!kasan_requires_meta())
|
||||
return 0;
|
||||
return SLAB_KASAN;
|
||||
}
|
||||
|
||||
/*
|
||||
* Adaptive redzone policy taken from the userspace AddressSanitizer runtime.
|
||||
* For larger allocations larger redzones are used.
|
||||
|
@ -370,15 +362,13 @@ void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
|
|||
return;
|
||||
|
||||
/*
|
||||
* SLAB_KASAN is used to mark caches that are sanitized by KASAN
|
||||
* and that thus have per-object metadata.
|
||||
* Currently this flag is used in two places:
|
||||
* 1. In slab_ksize() to account for per-object metadata when
|
||||
* calculating the size of the accessible memory within the object.
|
||||
* 2. In slab_common.c via kasan_never_merge() to prevent merging of
|
||||
* caches with per-object metadata.
|
||||
* SLAB_KASAN is used to mark caches that are sanitized by KASAN and
|
||||
* that thus have per-object metadata. Currently, this flag is used in
|
||||
* slab_ksize() to account for per-object metadata when calculating the
|
||||
* size of the accessible memory within the object. Additionally, we use
|
||||
* SLAB_NO_MERGE to prevent merging of caches with per-object metadata.
|
||||
*/
|
||||
*flags |= SLAB_KASAN;
|
||||
*flags |= SLAB_KASAN | SLAB_NO_MERGE;
|
||||
|
||||
ok_size = *size;
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ static DECLARE_WORK(slab_caches_to_rcu_destroy_work,
|
|||
*/
|
||||
#define SLAB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
|
||||
SLAB_TRACE | SLAB_TYPESAFE_BY_RCU | SLAB_NOLEAKTRACE | \
|
||||
SLAB_FAILSLAB | SLAB_NO_MERGE | kasan_never_merge())
|
||||
SLAB_FAILSLAB | SLAB_NO_MERGE)
|
||||
|
||||
#define SLAB_MERGE_SAME (SLAB_RECLAIM_ACCOUNT | SLAB_CACHE_DMA | \
|
||||
SLAB_CACHE_DMA32 | SLAB_ACCOUNT)
|
||||
|
|
Loading…
Reference in a new issue