From patchwork Mon Nov 6 20:10:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: andrey.konovalov@linux.dev X-Patchwork-Id: 13447421 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47DB4C4332F for ; Mon, 6 Nov 2023 20:11:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CC5656B0293; Mon, 6 Nov 2023 15:11:42 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C75486B0294; Mon, 6 Nov 2023 15:11:42 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B3E036B0295; Mon, 6 Nov 2023 15:11:42 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id A4E676B0293 for ; Mon, 6 Nov 2023 15:11:42 -0500 (EST) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 773D91A082A for ; Mon, 6 Nov 2023 20:11:42 +0000 (UTC) X-FDA: 81428624844.19.0BDA1E1 Received: from out-182.mta1.migadu.com (out-182.mta1.migadu.com [95.215.58.182]) by imf22.hostedemail.com (Postfix) with ESMTP id 50810C0009 for ; Mon, 6 Nov 2023 20:11:39 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=whzKutAZ; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf22.hostedemail.com: domain of andrey.konovalov@linux.dev designates 95.215.58.182 as permitted sender) smtp.mailfrom=andrey.konovalov@linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1699301500; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=wOW8bM5LUt0/83cpSlqfBj0DKQkCrWZjISfEAI+z8F8=; b=TPux2FST/Cmq8p92XbXEG4URkTC3os638pEoCgIQQMtZZ8crzbZjIvS/AwXqHaxVBi4SbM B+YaIU205RTaKej+OxSl7vQjaO7ysrdSzI7NEbz1UbQsDC5JSKkgtqTinVxLxt4EEBFTXF 9q/bHExfMhm/Ewm3R23b9mtyo0JCMLk= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=whzKutAZ; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf22.hostedemail.com: domain of andrey.konovalov@linux.dev designates 95.215.58.182 as permitted sender) smtp.mailfrom=andrey.konovalov@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1699301500; a=rsa-sha256; cv=none; b=g3Bt1sPg85P8OldOe7D+qP9XamWqiGmmw5NYEcBZIguv8GDGxRYpju61LY8ijP+J/1JHq8 Hr/KM+KlXbX9F/qomPzmIbcYJj0j6LejWV9bUyvzCBG4fL7vB7pPQpNmiXrC23igKiw1kQ kfxMfKYT3uNcccjEtI2jAkYZtaR+2Dg= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1699301498; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wOW8bM5LUt0/83cpSlqfBj0DKQkCrWZjISfEAI+z8F8=; b=whzKutAZQjowRwHa43pazOIwGIr0bQTB71FOqN2VXFxSHeCtofhsbtvlLPo7irVUIhiyw6 pancxW7Jzm82f5iCk4fHMKj/CtH9ujxzi66CbOwDe/5jAaY5Ge9UJvVHW0GX5ta8Tzklfq sce+wX6Wcualha3H+6sfIg6SEBbZJSo= From: andrey.konovalov@linux.dev To: Marco Elver , Alexander Potapenko Cc: Andrey Konovalov , Dmitry Vyukov , Andrey Ryabinin , kasan-dev@googlegroups.com, Evgenii Stepanov , Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Konovalov Subject: [PATCH RFC 06/20] kasan: introduce kasan_mempool_poison_pages Date: Mon, 6 Nov 2023 21:10:15 +0100 Message-Id: <3a377ec3223f9c98f3ac471845e084abe7fd6fe0.1699297309.git.andreyknvl@google.com> In-Reply-To: References: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 50810C0009 X-Stat-Signature: q7rmt6nt18q1za11jec3giza7xwtjns1 X-HE-Tag: 1699301499-735759 X-HE-Meta: U2FsdGVkX1+IXroUmCjrDhpYRl+ei+qCd2BphpR0p1Nk2kOgPk5HrZmkOpw1u1VU2EwcXXzzmBdETqz90tOc0EYyN+Jn7Y7iBWgRQ0oaKJ6O2k1/VE9gL/L4Ut5aLg1ekIGHdEyvQiB5HwSHBdzFV2FkLfNBFHkd4xOy/O5AMweuWHm+KHolzpB2vhT8OKqxSj6KpJElGq5fVmg7yh6+/AA4bRmNFDHjjOcT1QkRnatJG05jtDqx3tDoteUpyANjqgDxEkTSxuwX8ifgIboqR5Pwc8bnrl5W7w91AO9BxycZ28CrqF9T2Jd5M4MCIVK/VOOc/XTgxoiEg60Q+Xi2O/EWffPux3M89vcw8mIsfahNkV2127Yy9ZDHWDSdQEHS4+2j9lx0nUK0PmVfQJA8QopPmw0Rh3iYTcxo0bba1kkJ3PzVNaog03lfQKBWQBQWUNuIjvKFe2AJ1B7id4SdYX4qO6+X5JtFQZRDuuOGaaKGEFW+LsF729AgD/EKCsWv+5HXkCK1pqGeVhHA/1Uqi30PtFsUeoldpSxyVHM/5qMDIVPejJOQEYKFGLjW4EHNocle6TF4HntVexu1xTjaqoIKsU6nHhAqq2YJ+Sc389lWuYhlOaJfbSVjrpSTuyxdf/lT68zx+eW/Tm727952BzwHNGqD/FOOOGzlEPj71rU04o4ieuwW7qf1euYWheGDXIxCX8Mmc559XtVEMBBAq0j21qNgTgazCnkLnO+iOLR2nBhuHpMIHerhAnmkPcpZV6nZx73PZSOhb7vZ9tGGzt0oyxYcX3YqCcYM9Z2erdmvNZS6cwx2wd5gJq/ocOia30SMWXcrVeulDtgmqQt4NJqtFtMZ4JGyykYnxb+blWP6oX1izDVFBOvEqxC4VwWXwc+g/13dEw4YQEe2ucWLZ4yyP5mRYj2LNSUki2f+WNolXnyZD5PDxwECuWVOTVrhBQnKis2Sn1ZyGOIEmwn e1sFVPUz wJ4scLdMBf/o/Z+cSKlWk4d1ENK+OA0xgbtBrr/D7pJHLmFEFEs9CGRliQ4PPpMfOtFHHckIutAWiF9wIJSeF0SK2A3NdhT3baq7UNyOi2kKrjyzIC8Yl+VTyAalgkTr0NmRvpmU/wimadiZz5Ah/dAN/zyqKmScrNSW3aPWN01eug0Cp1MSfmaz23Ms+XrWCOZP3tL60QnQwjzquyFMaK2SeAw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Andrey Konovalov Introduce and document a kasan_mempool_poison_pages hook to be used by the mempool code instead of kasan_poison_pages. Compated to kasan_poison_pages, the new hook: 1. For the tag-based modes, skips checking and poisoning allocations that were not tagged due to sampling. 2. Checks for double-free and invalid-free bugs. In the future, kasan_poison_pages can also be updated to handle #2, but this is out-of-scope of this series. Signed-off-by: Andrey Konovalov --- include/linux/kasan.h | 27 +++++++++++++++++++++++++++ mm/kasan/common.c | 23 +++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/linux/kasan.h b/include/linux/kasan.h index c5fe303bc1c2..de2a695ad34d 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -212,6 +212,29 @@ static __always_inline void * __must_check kasan_krealloc(const void *object, return (void *)object; } +bool __kasan_mempool_poison_pages(struct page *page, unsigned int order, + unsigned long ip); +/** + * kasan_mempool_poison_pages - Check and poison a mempool page allocation. + * @page: Pointer to the page allocation. + * @order: Order of the allocation. + * + * This function is intended for kernel subsystems that cache page allocations + * to reuse them instead of freeing them back to page_alloc (e.g. mempool). + * + * This function is similar to kasan_mempool_poison_object() but operates on + * page allocations. + * + * Return: true if the allocation can be safely reused; false otherwise. + */ +static __always_inline bool kasan_mempool_poison_pages(struct page *page, + unsigned int order) +{ + if (kasan_enabled()) + return __kasan_mempool_poison_pages(page, order, _RET_IP_); + return true; +} + bool __kasan_mempool_poison_object(void *ptr, unsigned long ip); /** * kasan_mempool_poison_object - Check and poison a mempool slab allocation. @@ -326,6 +349,10 @@ static inline void *kasan_krealloc(const void *object, size_t new_size, { return (void *)object; } +static inline bool kasan_mempool_poison_pages(struct page *page, unsigned int order) +{ + return true; +} static inline bool kasan_mempool_poison_object(void *ptr) { return true; diff --git a/mm/kasan/common.c b/mm/kasan/common.c index 033c860afe51..9ccc78b20cf2 100644 --- a/mm/kasan/common.c +++ b/mm/kasan/common.c @@ -416,6 +416,29 @@ void * __must_check __kasan_krealloc(const void *object, size_t size, gfp_t flag return ____kasan_kmalloc(slab->slab_cache, object, size, flags); } +bool __kasan_mempool_poison_pages(struct page *page, unsigned int order, + unsigned long ip) +{ + unsigned long *ptr; + + if (unlikely(PageHighMem(page))) + return true; + + /* Bail out if allocation was excluded due to sampling. */ + if (!IS_ENABLED(CONFIG_KASAN_GENERIC) && + page_kasan_tag(page) == KASAN_TAG_KERNEL) + return true; + + ptr = page_address(page); + + if (check_page_allocation(ptr, ip)) + return false; + + kasan_poison(ptr, PAGE_SIZE << order, KASAN_PAGE_FREE, false); + + return true; +} + bool __kasan_mempool_poison_object(void *ptr, unsigned long ip) { struct folio *folio;