Merge tag 'net-5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[sfrench/cifs-2.6.git] / include / linux / kasan.h
index d53ea3c047bcde816c4837616ff410b8217d8e05..b1678a61e6a7631056a5176ab461e3e8ddc520a6 100644 (file)
@@ -30,7 +30,8 @@ struct kunit_kasan_expectation {
 /* Software KASAN implementations use shadow memory. */
 
 #ifdef CONFIG_KASAN_SW_TAGS
-#define KASAN_SHADOW_INIT 0xFF
+/* This matches KASAN_TAG_INVALID. */
+#define KASAN_SHADOW_INIT 0xFE
 #else
 #define KASAN_SHADOW_INIT 0
 #endif
@@ -95,6 +96,11 @@ static __always_inline bool kasan_enabled(void)
        return static_branch_likely(&kasan_flag_enabled);
 }
 
+static inline bool kasan_has_integrated_init(void)
+{
+       return kasan_enabled();
+}
+
 #else /* CONFIG_KASAN_HW_TAGS */
 
 static inline bool kasan_enabled(void)
@@ -102,6 +108,11 @@ static inline bool kasan_enabled(void)
        return true;
 }
 
+static inline bool kasan_has_integrated_init(void)
+{
+       return false;
+}
+
 #endif /* CONFIG_KASAN_HW_TAGS */
 
 slab_flags_t __kasan_never_merge(void);
@@ -119,20 +130,20 @@ static __always_inline void kasan_unpoison_range(const void *addr, size_t size)
                __kasan_unpoison_range(addr, size);
 }
 
-void __kasan_alloc_pages(struct page *page, unsigned int order);
+void __kasan_alloc_pages(struct page *page, unsigned int order, bool init);
 static __always_inline void kasan_alloc_pages(struct page *page,
-                                               unsigned int order)
+                                               unsigned int order, bool init)
 {
        if (kasan_enabled())
-               __kasan_alloc_pages(page, order);
+               __kasan_alloc_pages(page, order, init);
 }
 
-void __kasan_free_pages(struct page *page, unsigned int order);
+void __kasan_free_pages(struct page *page, unsigned int order, bool init);
 static __always_inline void kasan_free_pages(struct page *page,
-                                               unsigned int order)
+                                               unsigned int order, bool init)
 {
        if (kasan_enabled())
-               __kasan_free_pages(page, order);
+               __kasan_free_pages(page, order, init);
 }
 
 void __kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
@@ -192,11 +203,13 @@ static __always_inline void * __must_check kasan_init_slab_obj(
        return (void *)object;
 }
 
-bool __kasan_slab_free(struct kmem_cache *s, void *object, unsigned long ip);
-static __always_inline bool kasan_slab_free(struct kmem_cache *s, void *object)
+bool __kasan_slab_free(struct kmem_cache *s, void *object,
+                       unsigned long ip, bool init);
+static __always_inline bool kasan_slab_free(struct kmem_cache *s,
+                                               void *object, bool init)
 {
        if (kasan_enabled())
-               return __kasan_slab_free(s, object, _RET_IP_);
+               return __kasan_slab_free(s, object, _RET_IP_, init);
        return false;
 }
 
@@ -215,12 +228,12 @@ static __always_inline void kasan_slab_free_mempool(void *ptr)
 }
 
 void * __must_check __kasan_slab_alloc(struct kmem_cache *s,
-                                      void *object, gfp_t flags);
+                                      void *object, gfp_t flags, bool init);
 static __always_inline void * __must_check kasan_slab_alloc(
-                               struct kmem_cache *s, void *object, gfp_t flags)
+               struct kmem_cache *s, void *object, gfp_t flags, bool init)
 {
        if (kasan_enabled())
-               return __kasan_slab_alloc(s, object, flags);
+               return __kasan_slab_alloc(s, object, flags, init);
        return object;
 }
 
@@ -276,13 +289,17 @@ static inline bool kasan_enabled(void)
 {
        return false;
 }
+static inline bool kasan_has_integrated_init(void)
+{
+       return false;
+}
 static inline slab_flags_t kasan_never_merge(void)
 {
        return 0;
 }
 static inline void kasan_unpoison_range(const void *address, size_t size) {}
-static inline void kasan_alloc_pages(struct page *page, unsigned int order) {}
-static inline void kasan_free_pages(struct page *page, unsigned int order) {}
+static inline void kasan_alloc_pages(struct page *page, unsigned int order, bool init) {}
+static inline void kasan_free_pages(struct page *page, unsigned int order, bool init) {}
 static inline void kasan_cache_create(struct kmem_cache *cache,
                                      unsigned int *size,
                                      slab_flags_t *flags) {}
@@ -298,14 +315,14 @@ static inline void *kasan_init_slab_obj(struct kmem_cache *cache,
 {
        return (void *)object;
 }
-static inline bool kasan_slab_free(struct kmem_cache *s, void *object)
+static inline bool kasan_slab_free(struct kmem_cache *s, void *object, bool init)
 {
        return false;
 }
 static inline void kasan_kfree_large(void *ptr) {}
 static inline void kasan_slab_free_mempool(void *ptr) {}
 static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object,
-                                  gfp_t flags)
+                                  gfp_t flags, bool init)
 {
        return object;
 }