void kasan_kmalloc_large(const void *ptr, size_t size);
 void kasan_kfree_large(const void *ptr);
+void kasan_kfree(void *ptr);
 void kasan_kmalloc(struct kmem_cache *s, const void *object, size_t size);
 void kasan_krealloc(const void *object, size_t new_size);
 
 
 static inline void kasan_kmalloc_large(void *ptr, size_t size) {}
 static inline void kasan_kfree_large(const void *ptr) {}
+static inline void kasan_kfree(void *ptr) {}
 static inline void kasan_kmalloc(struct kmem_cache *s, const void *object,
                                size_t size) {}
 static inline void kasan_krealloc(const void *object, size_t new_size) {}
 
                kasan_kmalloc(page->slab_cache, object, size);
 }
 
+void kasan_kfree(void *ptr)
+{
+       struct page *page;
+
+       page = virt_to_head_page(ptr);
+
+       if (unlikely(!PageSlab(page)))
+               kasan_poison_shadow(ptr, PAGE_SIZE << compound_order(page),
+                               KASAN_FREE_PAGE);
+       else
+               kasan_slab_free(page->slab_cache, ptr);
+}
+
 void kasan_kfree_large(const void *ptr)
 {
        struct page *page = virt_to_page(ptr);
 
 #include <linux/mm.h>
 #include <linux/slab.h>
 #include <linux/highmem.h>
+#include <linux/kasan.h>
 #include <linux/kmemleak.h>
 #include <linux/export.h>
 #include <linux/mempool.h>
 }
 #endif /* CONFIG_DEBUG_SLAB || CONFIG_SLUB_DEBUG_ON */
 
+static void kasan_poison_element(mempool_t *pool, void *element)
+{
+       if (pool->alloc == mempool_alloc_slab)
+               kasan_slab_free(pool->pool_data, element);
+       if (pool->alloc == mempool_kmalloc)
+               kasan_kfree(element);
+       if (pool->alloc == mempool_alloc_pages)
+               kasan_free_pages(element, (unsigned long)pool->pool_data);
+}
+
+static void kasan_unpoison_element(mempool_t *pool, void *element)
+{
+       if (pool->alloc == mempool_alloc_slab)
+               kasan_slab_alloc(pool->pool_data, element);
+       if (pool->alloc == mempool_kmalloc)
+               kasan_krealloc(element, (size_t)pool->pool_data);
+       if (pool->alloc == mempool_alloc_pages)
+               kasan_alloc_pages(element, (unsigned long)pool->pool_data);
+}
+
 static void add_element(mempool_t *pool, void *element)
 {
        BUG_ON(pool->curr_nr >= pool->min_nr);
        poison_element(pool, element);
+       kasan_poison_element(pool, element);
        pool->elements[pool->curr_nr++] = element;
 }
 
 
        BUG_ON(pool->curr_nr < 0);
        check_element(pool, element);
+       kasan_unpoison_element(pool, element);
        return element;
 }