Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp3156669pxb; Mon, 16 Nov 2020 07:14:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJyX1U9ksnyXch3+DX4kVqWaWrJLL6UrymCEbRNPPMpyELDOUlyRBNNRRkriSbiWmFBASuAe X-Received: by 2002:a05:6402:553:: with SMTP id i19mr15611668edx.194.1605539642020; Mon, 16 Nov 2020 07:14:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605539642; cv=none; d=google.com; s=arc-20160816; b=MSo8eE9VQy2pkIR2aJr44Sq0CAQCIHxJ/Zb1EJKqm0mjQpl3mf5lOruARtyouveF57 HKeHDsv2jbiFRCnLiV1dj7qYgfoybdPbHEhQ/NCVDObfCddJAZolblIVkb2lQaig0THA OkPPV9aeQNlJYWpCGL7SC+cHN9Q2vN+YeM0mGu4gLD9uAkL5NtVf2SRoXaz0i8PTJ3/V Mf3dRNjSnUy8Ae/mA56WmlLcHsrpb9YjeiBBKo/xbSDOTlttY2SEMIMDyAi/v8qUltYp sQudOI5+zPUmtjcKXH9odwM0cU78Va6wNzw2vdEbE9Y0HmH9qCCtcVjuPNlBqHai2jGP EZZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=ph474WBwjZPtIC8WXwer+eWtTufIJgCo5S0VZjhhIPE=; b=xECckcMRyqVzSIMVhYUeB5MIn6nMxVS82hFcLFqVPO/IJ1wwasnBhuurm/O/wZyYOa QraRh0z8xJ2RoFI63O6Fit+nKM7h2cpxYQsmIrgp0MLkMdO2TB05PDAsfEEsPz7WMPb3 hbig25qX49Lj0z8qKMq+tz4bF+xeHLIi/QUZEsXevIpscymelw88oe6o0k4qjPJIdWfo 1jbvKEB7Z9m3TO4idhwG1nfS5iTgim3CfKpm5rNR3QeWC0u9OglQ6eQtECN1VplRI6LZ OhvJpViY9xpU9w+cQDanKbd71bXoji/GqfaI0XnKZ83gTn10wYi+2Q3TepWm36u26Awu u1ig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=fqv5T6oy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ch9si3090423edb.237.2020.11.16.07.13.35; Mon, 16 Nov 2020 07:14:02 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=fqv5T6oy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731468AbgKPPLg (ORCPT + 99 others); Mon, 16 Nov 2020 10:11:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51180 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728029AbgKPPLg (ORCPT ); Mon, 16 Nov 2020 10:11:36 -0500 Received: from mail-wr1-x443.google.com (mail-wr1-x443.google.com [IPv6:2a00:1450:4864:20::443]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 90811C0613CF for ; Mon, 16 Nov 2020 07:11:34 -0800 (PST) Received: by mail-wr1-x443.google.com with SMTP id p1so19024940wrf.12 for ; Mon, 16 Nov 2020 07:11:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=ph474WBwjZPtIC8WXwer+eWtTufIJgCo5S0VZjhhIPE=; b=fqv5T6oyUPs3UyvG6i30zxMwtpOg6tczmHuVWpNWm+hQXxuNi/kdQEczNFJpFKC77q F37j43S/vqJ9S7adkg3K85WLETVanVbPSbghDnruXZOVhD/0Js3wagMTAB+hgfGQm0HP xzphqBY72oN1yPlFCW4T1Je4vU8BHtiTbvg5TSFbX4uOk/uYTbTM9oG4XKvpQMMV5rsj 4XUkYvW1/4BqGp2xGZLNhqt5nIDJCOyXJhLm8K+b7k6o78gbzZPMawtbXuT/ivFD9kpm w666BOPjJkvsKI4azNQGTbx7XN+In0C+v4KyG6rbP7L77FuugdxOqQdz9vSIPJ6yySGC unCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=ph474WBwjZPtIC8WXwer+eWtTufIJgCo5S0VZjhhIPE=; b=sjbvmF/3VGOjH62YVLCs9FYOh7uN+G2hWAqTgZQL6tWbZBAIDPblaCX31F2Fz0nm5s 4tv8f3WFujLEA7mmUJcT+y0Ax7lXU0yh5nLO8r245hBKX0QP+GVQpCnlA8eTefpjV3hl 9Rqq/8CiYDqgEAj3vuSkqXv4PaSSUD8In/jSpvusDE2iEUHIROcrXzM355Jsf9xCcPaa udrfyQqkz26sDDi7L81CHB0XaZwvJeCRfMibT1frSqFQvkgKOOUvXyK/NbboL1L4Pbar n0C57cE63QM9/lDtcdDooA8JmoStPS3O5Aqd9Umba9ZAMYFIwalI/uFVZebHQ+JcLox4 g0Ow== X-Gm-Message-State: AOAM531/cPSZWccTowb5b0CfCejuHQsqiYqWrmOGTLNckzEqkEktBNEO Tf3KY8Ntk+teKK40e+0vof/8qQ== X-Received: by 2002:adf:8521:: with SMTP id 30mr20230790wrh.265.1605539492993; Mon, 16 Nov 2020 07:11:32 -0800 (PST) Received: from elver.google.com ([2a00:79e0:15:13:f693:9fff:fef4:2449]) by smtp.gmail.com with ESMTPSA id t136sm17495991wmt.18.2020.11.16.07.11.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Nov 2020 07:11:32 -0800 (PST) Date: Mon, 16 Nov 2020 16:11:26 +0100 From: Marco Elver To: Andrey Konovalov Cc: Andrew Morton , Catalin Marinas , Will Deacon , Vincenzo Frascino , Dmitry Vyukov , Andrey Ryabinin , Alexander Potapenko , Evgenii Stepanov , Branislav Rankov , Kevin Brodsky , kasan-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH mm v3 10/19] kasan: inline (un)poison_range and check_invalid_free Message-ID: <20201116151126.GB1357314@elver.google.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.14.6 (2020-07-11) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Nov 13, 2020 at 11:20PM +0100, Andrey Konovalov wrote: > Using (un)poison_range() or check_invalid_free() currently results in > function calls. Move their definitions to mm/kasan/kasan.h and turn them > into static inline functions for hardware tag-based mode to avoid > unneeded function calls. > > Signed-off-by: Andrey Konovalov > Link: https://linux-review.googlesource.com/id/Ia9d8191024a12d1374675b3d27197f10193f50bb Reviewed-by: Marco Elver > --- > mm/kasan/hw_tags.c | 30 ------------------------------ > mm/kasan/kasan.h | 45 ++++++++++++++++++++++++++++++++++++++++----- > 2 files changed, 40 insertions(+), 35 deletions(-) > > diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c > index 3cdd87d189f6..863fed4edd3f 100644 > --- a/mm/kasan/hw_tags.c > +++ b/mm/kasan/hw_tags.c > @@ -10,7 +10,6 @@ > > #include > #include > -#include > #include > #include > #include > @@ -31,35 +30,6 @@ void __init kasan_init_hw_tags(void) > pr_info("KernelAddressSanitizer initialized\n"); > } > > -void poison_range(const void *address, size_t size, u8 value) > -{ > - /* Skip KFENCE memory if called explicitly outside of sl*b. */ > - if (is_kfence_address(address)) > - return; > - > - hw_set_mem_tag_range(kasan_reset_tag(address), > - round_up(size, KASAN_GRANULE_SIZE), value); > -} > - > -void unpoison_range(const void *address, size_t size) > -{ > - /* Skip KFENCE memory if called explicitly outside of sl*b. */ > - if (is_kfence_address(address)) > - return; > - > - hw_set_mem_tag_range(kasan_reset_tag(address), > - round_up(size, KASAN_GRANULE_SIZE), get_tag(address)); > -} > - > -bool check_invalid_free(void *addr) > -{ > - u8 ptr_tag = get_tag(addr); > - u8 mem_tag = hw_get_mem_tag(addr); > - > - return (mem_tag == KASAN_TAG_INVALID) || > - (ptr_tag != KASAN_TAG_KERNEL && ptr_tag != mem_tag); > -} > - > void kasan_set_free_info(struct kmem_cache *cache, > void *object, u8 tag) > { > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > index 7876a2547b7d..8aa83b7ad79e 100644 > --- a/mm/kasan/kasan.h > +++ b/mm/kasan/kasan.h > @@ -3,6 +3,7 @@ > #define __MM_KASAN_KASAN_H > > #include > +#include > #include > > #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > @@ -154,9 +155,6 @@ struct kasan_alloc_meta *kasan_get_alloc_meta(struct kmem_cache *cache, > struct kasan_free_meta *kasan_get_free_meta(struct kmem_cache *cache, > const void *object); > > -void poison_range(const void *address, size_t size, u8 value); > -void unpoison_range(const void *address, size_t size); > - > #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > > static inline const void *kasan_shadow_to_mem(const void *shadow_addr) > @@ -196,8 +194,6 @@ void print_tags(u8 addr_tag, const void *addr); > static inline void print_tags(u8 addr_tag, const void *addr) { } > #endif > > -bool check_invalid_free(void *addr); > - > void *find_first_bad_addr(void *addr, size_t size); > const char *get_bug_type(struct kasan_access_info *info); > void metadata_fetch_row(char *buffer, void *row); > @@ -278,6 +274,45 @@ static inline u8 random_tag(void) { return hw_get_random_tag(); } > static inline u8 random_tag(void) { return 0; } > #endif > > +#ifdef CONFIG_KASAN_HW_TAGS > + > +static inline void poison_range(const void *address, size_t size, u8 value) > +{ > + /* Skip KFENCE memory if called explicitly outside of sl*b. */ > + if (is_kfence_address(address)) > + return; > + > + hw_set_mem_tag_range(kasan_reset_tag(address), > + round_up(size, KASAN_GRANULE_SIZE), value); > +} > + > +static inline void unpoison_range(const void *address, size_t size) > +{ > + /* Skip KFENCE memory if called explicitly outside of sl*b. */ > + if (is_kfence_address(address)) > + return; > + > + hw_set_mem_tag_range(kasan_reset_tag(address), > + round_up(size, KASAN_GRANULE_SIZE), get_tag(address)); > +} > + > +static inline bool check_invalid_free(void *addr) > +{ > + u8 ptr_tag = get_tag(addr); > + u8 mem_tag = hw_get_mem_tag(addr); > + > + return (mem_tag == KASAN_TAG_INVALID) || > + (ptr_tag != KASAN_TAG_KERNEL && ptr_tag != mem_tag); > +} > + > +#else /* CONFIG_KASAN_HW_TAGS */ > + > +void poison_range(const void *address, size_t size, u8 value); > +void unpoison_range(const void *address, size_t size); > +bool check_invalid_free(void *addr); > + > +#endif /* CONFIG_KASAN_HW_TAGS */ > + > /* > * Exported functions for interfaces called from assembly or from generated > * code. Declarations here to avoid warning about missing declarations. > -- > 2.29.2.299.gdc1121823c-goog >