From: Marco Elver <elver@google.com>
To: Andrey Konovalov <andreyknvl@google.com>
Cc: linux-arm-kernel@lists.infradead.org,
Branislav Rankov <Branislav.Rankov@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Kevin Brodsky <kevin.brodsky@arm.com>,
Will Deacon <will.deacon@arm.com>,
linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com,
linux-mm@kvack.org, Alexander Potapenko <glider@google.com>,
Evgenii Stepanov <eugenis@google.com>,
Andrey Ryabinin <aryabinin@virtuozzo.com>,
Andrew Morton <akpm@linux-foundation.org>,
Vincenzo Frascino <vincenzo.frascino@arm.com>,
Dmitry Vyukov <dvyukov@google.com>
Subject: Re: [PATCH mm v3 13/19] kasan, mm: rename kasan_poison_kfree
Date: Mon, 16 Nov 2020 16:43:08 +0100 [thread overview]
Message-ID: <20201116154308.GF1357314@elver.google.com> (raw)
In-Reply-To: <798e1753fafb37151213a0ad0b1b2f08f66c3877.1605305978.git.andreyknvl@google.com>
On Fri, Nov 13, 2020 at 11:20PM +0100, Andrey Konovalov wrote:
> Rename kasan_poison_kfree() to kasan_slab_free_mempool() as it better
> reflects what this annotation does. Also add a comment that explains the
> PageSlab() check.
>
> No functional changes.
>
> Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
> Link: https://linux-review.googlesource.com/id/I5026f87364e556b506ef1baee725144bb04b8810
Reviewed-by: Marco Elver <elver@google.com>
> ---
> include/linux/kasan.h | 16 ++++++++--------
> mm/kasan/common.c | 40 +++++++++++++++++++++++-----------------
> mm/mempool.c | 2 +-
> 3 files changed, 32 insertions(+), 26 deletions(-)
>
> diff --git a/include/linux/kasan.h b/include/linux/kasan.h
> index 6bd95243a583..16cf53eac29b 100644
> --- a/include/linux/kasan.h
> +++ b/include/linux/kasan.h
> @@ -175,6 +175,13 @@ static __always_inline bool kasan_slab_free(struct kmem_cache *s, void *object,
> return false;
> }
>
> +void __kasan_slab_free_mempool(void *ptr, unsigned long ip);
> +static __always_inline void kasan_slab_free_mempool(void *ptr, unsigned long ip)
> +{
> + if (kasan_enabled())
> + __kasan_slab_free_mempool(ptr, ip);
> +}
> +
> void * __must_check __kasan_slab_alloc(struct kmem_cache *s,
> void *object, gfp_t flags);
> static __always_inline void * __must_check kasan_slab_alloc(
> @@ -215,13 +222,6 @@ static __always_inline void * __must_check kasan_krealloc(const void *object,
> return (void *)object;
> }
>
> -void __kasan_poison_kfree(void *ptr, unsigned long ip);
> -static __always_inline void kasan_poison_kfree(void *ptr, unsigned long ip)
> -{
> - if (kasan_enabled())
> - __kasan_poison_kfree(ptr, ip);
> -}
> -
> void __kasan_kfree_large(void *ptr, unsigned long ip);
> static __always_inline void kasan_kfree_large(void *ptr, unsigned long ip)
> {
> @@ -260,6 +260,7 @@ static inline bool kasan_slab_free(struct kmem_cache *s, void *object,
> {
> return false;
> }
> +static inline void kasan_slab_free_mempool(void *ptr, unsigned long ip) {}
> static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object,
> gfp_t flags)
> {
> @@ -279,7 +280,6 @@ static inline void *kasan_krealloc(const void *object, size_t new_size,
> {
> return (void *)object;
> }
> -static inline void kasan_poison_kfree(void *ptr, unsigned long ip) {}
> static inline void kasan_kfree_large(void *ptr, unsigned long ip) {}
>
> #endif /* CONFIG_KASAN */
> diff --git a/mm/kasan/common.c b/mm/kasan/common.c
> index 17918bd20ed9..1205faac90bd 100644
> --- a/mm/kasan/common.c
> +++ b/mm/kasan/common.c
> @@ -335,6 +335,29 @@ bool __kasan_slab_free(struct kmem_cache *cache, void *object, unsigned long ip)
> return ____kasan_slab_free(cache, object, ip, true);
> }
>
> +void __kasan_slab_free_mempool(void *ptr, unsigned long ip)
> +{
> + struct page *page;
> +
> + page = virt_to_head_page(ptr);
> +
> + /*
> + * Even though this function is only called for kmem_cache_alloc and
> + * kmalloc backed mempool allocations, those allocations can still be
> + * !PageSlab() when the size provided to kmalloc is larger than
> + * KMALLOC_MAX_SIZE, and kmalloc falls back onto page_alloc.
> + */
> + if (unlikely(!PageSlab(page))) {
> + if (ptr != page_address(page)) {
> + kasan_report_invalid_free(ptr, ip);
> + return;
> + }
> + poison_range(ptr, page_size(page), KASAN_FREE_PAGE);
> + } else {
> + ____kasan_slab_free(page->slab_cache, ptr, ip, false);
> + }
> +}
> +
> static void set_alloc_info(struct kmem_cache *cache, void *object, gfp_t flags)
> {
> kasan_set_track(&kasan_get_alloc_meta(cache, object)->alloc_track, flags);
> @@ -429,23 +452,6 @@ void * __must_check __kasan_krealloc(const void *object, size_t size, gfp_t flag
> flags, true);
> }
>
> -void __kasan_poison_kfree(void *ptr, unsigned long ip)
> -{
> - struct page *page;
> -
> - page = virt_to_head_page(ptr);
> -
> - if (unlikely(!PageSlab(page))) {
> - if (ptr != page_address(page)) {
> - kasan_report_invalid_free(ptr, ip);
> - return;
> - }
> - poison_range(ptr, page_size(page), KASAN_FREE_PAGE);
> - } else {
> - ____kasan_slab_free(page->slab_cache, ptr, ip, false);
> - }
> -}
> -
> void __kasan_kfree_large(void *ptr, unsigned long ip)
> {
> if (ptr != page_address(virt_to_head_page(ptr)))
> diff --git a/mm/mempool.c b/mm/mempool.c
> index 583a9865b181..624ed51b060f 100644
> --- a/mm/mempool.c
> +++ b/mm/mempool.c
> @@ -104,7 +104,7 @@ static inline void poison_element(mempool_t *pool, void *element)
> static __always_inline void kasan_poison_element(mempool_t *pool, void *element)
> {
> if (pool->alloc == mempool_alloc_slab || pool->alloc == mempool_kmalloc)
> - kasan_poison_kfree(element, _RET_IP_);
> + kasan_slab_free_mempool(element, _RET_IP_);
> else if (pool->alloc == mempool_alloc_pages)
> kasan_free_pages(element, (unsigned long)pool->pool_data);
> }
> --
> 2.29.2.299.gdc1121823c-goog
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Marco Elver <elver@google.com>
To: Andrey Konovalov <andreyknvl@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>,
Vincenzo Frascino <vincenzo.frascino@arm.com>,
Dmitry Vyukov <dvyukov@google.com>,
Andrey Ryabinin <aryabinin@virtuozzo.com>,
Alexander Potapenko <glider@google.com>,
Evgenii Stepanov <eugenis@google.com>,
Branislav Rankov <Branislav.Rankov@arm.com>,
Kevin Brodsky <kevin.brodsky@arm.com>,
kasan-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH mm v3 13/19] kasan, mm: rename kasan_poison_kfree
Date: Mon, 16 Nov 2020 16:43:08 +0100 [thread overview]
Message-ID: <20201116154308.GF1357314@elver.google.com> (raw)
In-Reply-To: <798e1753fafb37151213a0ad0b1b2f08f66c3877.1605305978.git.andreyknvl@google.com>
On Fri, Nov 13, 2020 at 11:20PM +0100, Andrey Konovalov wrote:
> Rename kasan_poison_kfree() to kasan_slab_free_mempool() as it better
> reflects what this annotation does. Also add a comment that explains the
> PageSlab() check.
>
> No functional changes.
>
> Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
> Link: https://linux-review.googlesource.com/id/I5026f87364e556b506ef1baee725144bb04b8810
Reviewed-by: Marco Elver <elver@google.com>
> ---
> include/linux/kasan.h | 16 ++++++++--------
> mm/kasan/common.c | 40 +++++++++++++++++++++++-----------------
> mm/mempool.c | 2 +-
> 3 files changed, 32 insertions(+), 26 deletions(-)
>
> diff --git a/include/linux/kasan.h b/include/linux/kasan.h
> index 6bd95243a583..16cf53eac29b 100644
> --- a/include/linux/kasan.h
> +++ b/include/linux/kasan.h
> @@ -175,6 +175,13 @@ static __always_inline bool kasan_slab_free(struct kmem_cache *s, void *object,
> return false;
> }
>
> +void __kasan_slab_free_mempool(void *ptr, unsigned long ip);
> +static __always_inline void kasan_slab_free_mempool(void *ptr, unsigned long ip)
> +{
> + if (kasan_enabled())
> + __kasan_slab_free_mempool(ptr, ip);
> +}
> +
> void * __must_check __kasan_slab_alloc(struct kmem_cache *s,
> void *object, gfp_t flags);
> static __always_inline void * __must_check kasan_slab_alloc(
> @@ -215,13 +222,6 @@ static __always_inline void * __must_check kasan_krealloc(const void *object,
> return (void *)object;
> }
>
> -void __kasan_poison_kfree(void *ptr, unsigned long ip);
> -static __always_inline void kasan_poison_kfree(void *ptr, unsigned long ip)
> -{
> - if (kasan_enabled())
> - __kasan_poison_kfree(ptr, ip);
> -}
> -
> void __kasan_kfree_large(void *ptr, unsigned long ip);
> static __always_inline void kasan_kfree_large(void *ptr, unsigned long ip)
> {
> @@ -260,6 +260,7 @@ static inline bool kasan_slab_free(struct kmem_cache *s, void *object,
> {
> return false;
> }
> +static inline void kasan_slab_free_mempool(void *ptr, unsigned long ip) {}
> static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object,
> gfp_t flags)
> {
> @@ -279,7 +280,6 @@ static inline void *kasan_krealloc(const void *object, size_t new_size,
> {
> return (void *)object;
> }
> -static inline void kasan_poison_kfree(void *ptr, unsigned long ip) {}
> static inline void kasan_kfree_large(void *ptr, unsigned long ip) {}
>
> #endif /* CONFIG_KASAN */
> diff --git a/mm/kasan/common.c b/mm/kasan/common.c
> index 17918bd20ed9..1205faac90bd 100644
> --- a/mm/kasan/common.c
> +++ b/mm/kasan/common.c
> @@ -335,6 +335,29 @@ bool __kasan_slab_free(struct kmem_cache *cache, void *object, unsigned long ip)
> return ____kasan_slab_free(cache, object, ip, true);
> }
>
> +void __kasan_slab_free_mempool(void *ptr, unsigned long ip)
> +{
> + struct page *page;
> +
> + page = virt_to_head_page(ptr);
> +
> + /*
> + * Even though this function is only called for kmem_cache_alloc and
> + * kmalloc backed mempool allocations, those allocations can still be
> + * !PageSlab() when the size provided to kmalloc is larger than
> + * KMALLOC_MAX_SIZE, and kmalloc falls back onto page_alloc.
> + */
> + if (unlikely(!PageSlab(page))) {
> + if (ptr != page_address(page)) {
> + kasan_report_invalid_free(ptr, ip);
> + return;
> + }
> + poison_range(ptr, page_size(page), KASAN_FREE_PAGE);
> + } else {
> + ____kasan_slab_free(page->slab_cache, ptr, ip, false);
> + }
> +}
> +
> static void set_alloc_info(struct kmem_cache *cache, void *object, gfp_t flags)
> {
> kasan_set_track(&kasan_get_alloc_meta(cache, object)->alloc_track, flags);
> @@ -429,23 +452,6 @@ void * __must_check __kasan_krealloc(const void *object, size_t size, gfp_t flag
> flags, true);
> }
>
> -void __kasan_poison_kfree(void *ptr, unsigned long ip)
> -{
> - struct page *page;
> -
> - page = virt_to_head_page(ptr);
> -
> - if (unlikely(!PageSlab(page))) {
> - if (ptr != page_address(page)) {
> - kasan_report_invalid_free(ptr, ip);
> - return;
> - }
> - poison_range(ptr, page_size(page), KASAN_FREE_PAGE);
> - } else {
> - ____kasan_slab_free(page->slab_cache, ptr, ip, false);
> - }
> -}
> -
> void __kasan_kfree_large(void *ptr, unsigned long ip)
> {
> if (ptr != page_address(virt_to_head_page(ptr)))
> diff --git a/mm/mempool.c b/mm/mempool.c
> index 583a9865b181..624ed51b060f 100644
> --- a/mm/mempool.c
> +++ b/mm/mempool.c
> @@ -104,7 +104,7 @@ static inline void poison_element(mempool_t *pool, void *element)
> static __always_inline void kasan_poison_element(mempool_t *pool, void *element)
> {
> if (pool->alloc == mempool_alloc_slab || pool->alloc == mempool_kmalloc)
> - kasan_poison_kfree(element, _RET_IP_);
> + kasan_slab_free_mempool(element, _RET_IP_);
> else if (pool->alloc == mempool_alloc_pages)
> kasan_free_pages(element, (unsigned long)pool->pool_data);
> }
> --
> 2.29.2.299.gdc1121823c-goog
>
next prev parent reply other threads:[~2020-11-16 15:43 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-13 22:19 [PATCH mm v3 00/19] kasan: boot parameters for hardware tag-based mode Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-13 22:19 ` [PATCH mm v3 01/19] kasan: simplify quarantine_put call site Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-13 22:19 ` [PATCH mm v3 02/19] kasan: rename get_alloc/free_info Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-13 22:19 ` [PATCH mm v3 03/19] kasan: introduce set_alloc_info Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-13 22:19 ` [PATCH mm v3 04/19] kasan, arm64: unpoison stack only with CONFIG_KASAN_STACK Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-16 11:00 ` Dmitry Vyukov
2020-11-16 11:00 ` Dmitry Vyukov
2020-11-13 22:19 ` [PATCH mm v3 05/19] kasan: allow VMAP_STACK for HW_TAGS mode Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-16 11:01 ` Dmitry Vyukov
2020-11-16 11:01 ` Dmitry Vyukov
2020-11-13 22:19 ` [PATCH mm v3 06/19] kasan: remove __kasan_unpoison_stack Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-13 22:19 ` [PATCH mm v3 07/19] kasan: inline kasan_reset_tag for tag-based modes Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-17 10:56 ` Dmitry Vyukov
2020-11-17 10:56 ` Dmitry Vyukov
2020-11-13 22:19 ` [PATCH mm v3 08/19] kasan: inline random_tag for HW_TAGS Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-17 10:58 ` Dmitry Vyukov
2020-11-17 10:58 ` Dmitry Vyukov
2020-11-13 22:19 ` [PATCH mm v3 09/19] kasan: open-code kasan_unpoison_slab Andrey Konovalov
2020-11-13 22:19 ` Andrey Konovalov
2020-11-16 15:06 ` Marco Elver
2020-11-16 15:06 ` Marco Elver
2020-11-13 22:20 ` [PATCH mm v3 10/19] kasan: inline (un)poison_range and check_invalid_free Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-16 15:11 ` Marco Elver
2020-11-16 15:11 ` Marco Elver
2020-11-13 22:20 ` [PATCH mm v3 11/19] kasan: add and integrate kasan boot parameters Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-16 15:15 ` Marco Elver
2020-11-16 15:15 ` Marco Elver
2020-11-17 11:09 ` Dmitry Vyukov
2020-11-17 11:09 ` Dmitry Vyukov
2020-11-13 22:20 ` [PATCH mm v3 12/19] kasan, mm: check kasan_enabled in annotations Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-16 15:26 ` Marco Elver
2020-11-16 15:26 ` Marco Elver
2020-11-17 11:12 ` Dmitry Vyukov
2020-11-17 11:12 ` Dmitry Vyukov
2020-11-13 22:20 ` [PATCH mm v3 13/19] kasan, mm: rename kasan_poison_kfree Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-16 15:43 ` Marco Elver [this message]
2020-11-16 15:43 ` Marco Elver
2020-11-13 22:20 ` [PATCH mm v3 14/19] kasan: don't round_up too much Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-13 22:20 ` [PATCH mm v3 15/19] kasan: simplify assign_tag and set_tag calls Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-13 22:20 ` [PATCH mm v3 16/19] kasan: clarify comment in __kasan_kfree_large Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-13 22:20 ` [PATCH mm v3 17/19] kasan: clean up metadata allocation and usage Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-16 15:46 ` Marco Elver
2020-11-16 15:46 ` Marco Elver
2020-11-17 13:12 ` Dmitry Vyukov
2020-11-17 13:12 ` Dmitry Vyukov
2020-11-17 13:18 ` Marco Elver
2020-11-17 13:18 ` Marco Elver
2020-11-17 13:27 ` Dmitry Vyukov
2020-11-17 13:27 ` Dmitry Vyukov
2020-11-23 18:54 ` Andrey Konovalov
2020-11-23 18:54 ` Andrey Konovalov
2020-11-23 19:16 ` Andrey Konovalov
2020-11-23 19:16 ` Andrey Konovalov
2020-11-13 22:20 ` [PATCH mm v3 18/19] kasan, mm: allow cache merging with no metadata Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-16 15:45 ` Marco Elver
2020-11-16 15:45 ` Marco Elver
2020-11-17 13:25 ` Dmitry Vyukov
2020-11-17 13:25 ` Dmitry Vyukov
2020-11-23 13:52 ` Andrey Konovalov
2020-11-23 13:52 ` Andrey Konovalov
2020-11-13 22:20 ` [PATCH mm v3 19/19] kasan: update documentation Andrey Konovalov
2020-11-13 22:20 ` Andrey Konovalov
2020-11-16 15:47 ` Marco Elver
2020-11-16 15:47 ` Marco Elver
2020-11-17 13:28 ` Dmitry Vyukov
2020-11-17 13:28 ` Dmitry Vyukov
2020-11-16 14:48 ` [PATCH mm v3 00/19] kasan: boot parameters for hardware tag-based mode Vincenzo Frascino
2020-11-16 14:48 ` Vincenzo Frascino
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201116154308.GF1357314@elver.google.com \
--to=elver@google.com \
--cc=Branislav.Rankov@arm.com \
--cc=akpm@linux-foundation.org \
--cc=andreyknvl@google.com \
--cc=aryabinin@virtuozzo.com \
--cc=catalin.marinas@arm.com \
--cc=dvyukov@google.com \
--cc=eugenis@google.com \
--cc=glider@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=kevin.brodsky@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=vincenzo.frascino@arm.com \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.