From patchwork Sat Sep 9 11:54:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huacai Chen X-Patchwork-Id: 137853 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ab0a:0:b0:3f2:4152:657d with SMTP id m10csp1477867vqo; Sun, 10 Sep 2023 00:58:47 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHgGGz4ftHu8QE27/UoKneTq1AK76ZlLEfQVwsBM5g55/rktAF0BWNVSzDjHWp6cLNB8vbA X-Received: by 2002:a9d:739a:0:b0:6b9:5734:135f with SMTP id j26-20020a9d739a000000b006b95734135fmr7019362otk.28.1694332727218; Sun, 10 Sep 2023 00:58:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694332727; cv=none; d=google.com; s=arc-20160816; b=c0jbIHP8e2VjWnYVXBLfXok5ofVpKOe2nvVMzdEKTf+0oo6jEs1+5WB5sxOq27qHhS iu8+/+YPd6SeoJy9oSF1/4DRP0Lz0FpyuRCgusualE0VnVScDveDgOm3DO00X/ayF9BU 2PSkzBFhQL8lcmjLmxmH2zdrsO0E9G+g+hVkM/25daoJZ4TvoWnkQQcoC7XXcyZPkTMx FLQpSpngNCmtfUYRKiD2nh7xpjwoavl5RsSiceUdtkXfzOVB8yFGFNFlim3qK9i5cPXK QsYHFmd+9XthpDwu7kfEcX1xIbQz5z9hCeYQRqdcRaC5Driozba2q3tGQCeemUqtCaKv 4E+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=o6nq4ImTFzYssrtVr7aUHUK02trkLq3jsiEyHdXR0ZI=; fh=xtDa9BTF9s0YofmOh35Z2sKyUHouVGWU2gUcAK2awPA=; b=zAwnuthiOFelCs5YuIUuh1QLpr3C9nr78vwTMSF2qLpAoGLZlrBX68ZlkHgsoAQleA v0Aa0DTuhqouNYQysZ7SyovPKD8ozJvCwWPHWCSGuJkTA1eZbPGQGi0JBW+x9FzrKFN0 YzQLS0CbSBdTGPYCeSFroeJDj+RmKt1Viwj8od2jNuroVKV5OHx2u9UJHixKSQNEYNyJ WDU6bLQfQGKnU3acK9vsuH89iHYlOPdzIaKRe5nhoo5laORbUKlpNdyS3ogXgKnPvZtz srV/34furd2yFiqb5d33M/jm9yv/X4LC/XEjp8KvTDvlgKfQnPuXKSuf+hNJ2MI4V8dE lk1Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id bx9-20020a056a00428900b0068e3b9aeefdsi4419931pfb.55.2023.09.10.00.58.45; Sun, 10 Sep 2023 00:58:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345407AbjIILzI (ORCPT + 11 others); Sat, 9 Sep 2023 07:55:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231737AbjIILzH (ORCPT ); Sat, 9 Sep 2023 07:55:07 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51B3BE46 for ; Sat, 9 Sep 2023 04:55:03 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C83BFC433C8; Sat, 9 Sep 2023 11:54:59 +0000 (UTC) From: Huacai Chen To: Huacai Chen , Andrey Ryabinin , Andrey Konovalov , Alexander Potapenko Cc: loongarch@lists.linux.dev, Xuerui Wang , Jiaxun Yang , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org, loongson-kernel@lists.loongnix.cn, Huacai Chen , Linus Torvalds Subject: [PATCH 1/2] kasan: Cleanup the __HAVE_ARCH_SHADOW_MAP usage Date: Sat, 9 Sep 2023 19:54:48 +0800 Message-Id: <20230909115450.1903218-1-chenhuacai@loongson.cn> X-Mailer: git-send-email 2.39.3 MIME-Version: 1.0 X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776636633350563915 X-GMAIL-MSGID: 1776636633350563915 As Linus suggested, __HAVE_ARCH_XYZ is stupid and only for historical uses. So cleanup the __HAVE_ARCH_SHADOW_MAP usage and use self-defined macros instead. Suggested-by: Linus Torvalds Signed-off-by: Huacai Chen --- arch/loongarch/include/asm/kasan.h | 10 ++++++++-- include/linux/kasan.h | 2 +- mm/kasan/kasan.h | 8 +++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/arch/loongarch/include/asm/kasan.h b/arch/loongarch/include/asm/kasan.h index deeff8158f45..a12ecab37da7 100644 --- a/arch/loongarch/include/asm/kasan.h +++ b/arch/loongarch/include/asm/kasan.h @@ -10,8 +10,6 @@ #include #include -#define __HAVE_ARCH_SHADOW_MAP - #define KASAN_SHADOW_SCALE_SHIFT 3 #define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL) @@ -68,6 +66,7 @@ static __always_inline bool kasan_arch_is_ready(void) return !kasan_early_stage; } +#define kasan_mem_to_shadow kasan_mem_to_shadow static inline void *kasan_mem_to_shadow(const void *addr) { if (!kasan_arch_is_ready()) { @@ -97,6 +96,7 @@ static inline void *kasan_mem_to_shadow(const void *addr) } } +#define kasan_shadow_to_mem kasan_shadow_to_mem static inline const void *kasan_shadow_to_mem(const void *shadow_addr) { unsigned long addr = (unsigned long)shadow_addr; @@ -119,6 +119,12 @@ static inline const void *kasan_shadow_to_mem(const void *shadow_addr) } } +#define addr_has_metadata addr_has_metadata +static __always_inline bool addr_has_metadata(const void *addr) +{ + return (kasan_mem_to_shadow((void *)addr) != NULL); +} + void kasan_init(void); asmlinkage void kasan_early_init(void); diff --git a/include/linux/kasan.h b/include/linux/kasan.h index 3df5499f7936..842623d708c2 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -54,7 +54,7 @@ extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D]; int kasan_populate_early_shadow(const void *shadow_start, const void *shadow_end); -#ifndef __HAVE_ARCH_SHADOW_MAP +#ifndef kasan_mem_to_shadow static inline void *kasan_mem_to_shadow(const void *addr) { return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index f70e3d7a602e..d37831b8511c 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -291,7 +291,7 @@ struct kasan_stack_ring { #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) -#ifndef __HAVE_ARCH_SHADOW_MAP +#ifndef kasan_shadow_to_mem static inline const void *kasan_shadow_to_mem(const void *shadow_addr) { return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET) @@ -299,15 +299,13 @@ static inline const void *kasan_shadow_to_mem(const void *shadow_addr) } #endif +#ifndef addr_has_metadata static __always_inline bool addr_has_metadata(const void *addr) { -#ifdef __HAVE_ARCH_SHADOW_MAP - return (kasan_mem_to_shadow((void *)addr) != NULL); -#else return (kasan_reset_tag(addr) >= kasan_shadow_to_mem((void *)KASAN_SHADOW_START)); -#endif } +#endif /** * kasan_check_range - Check memory region, and report if invalid access. From patchwork Sat Sep 9 11:54:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huacai Chen X-Patchwork-Id: 137837 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ab0a:0:b0:3f2:4152:657d with SMTP id m10csp1212882vqo; Sat, 9 Sep 2023 09:29:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEZQMeXib7ryd8gkxUZsR3aBpFJBwjX6jGt8qARoVWexcqQ8CcPP+nyGt5eFoADhYyGB2DY X-Received: by 2002:aa7:c0cb:0:b0:52e:21f3:aa0c with SMTP id j11-20020aa7c0cb000000b0052e21f3aa0cmr4533824edp.37.1694276961671; Sat, 09 Sep 2023 09:29:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694276961; cv=none; d=google.com; s=arc-20160816; b=oI9+eTvAdBzOHQ2YELNEBMWsnkJA2Oh7FbCx6wvKIL2sARJfMkq6C2ilbQD0iWV7Cu //+wiigFHDh3JCJHXJnkfrcvk13htircJ0RFGwSFDl62dzo0kRk5Hf9NTMIrG0FlvJX3 bhikQRr0lDtV1PW0llQPz92M/pi8m9WGC/Bb1paPUskLxADFDK3Jr4J7ts4dxPBrvDgO NE1Zbg8yBZOPbLL2GPDQ9UaQPvNSZinBkqsZK/MuUg3EopaqR/oQdXywzFrPeNdeOm4z qpXJOqmv7oK25F3ppusgbFK8W7n1TzXomMahZQDKuvnSNWeuMsEnispYx56KhM8JUQ1j 3Lmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=8B0FGgzeRhNXwZwUMw7ubbRsWGehYl72wajQEDdDQss=; fh=xtDa9BTF9s0YofmOh35Z2sKyUHouVGWU2gUcAK2awPA=; b=cgVMV/6S28JRArQyUR2aRg3UdxUEXrroR2NCVFs5m1JNW4iKLddznv1PJ/Vsglr1m/ eAzdqfo5DjT3aTxyn1zMR8OvMgTzH7TnnmHlTemD+ppnheH9yAtzGJsn/pTj3IyS6ycH fNA3PRpMQxM7DoBn+1OyWZmhgURrudXcVbsFbVfxDQkWqE6o4d4hlYeG13N1uur4BlC7 sXiDNk1kX48OCJVb3sFL7V4qXCNk0hkE4POOWc79i/pOG2d3yqQixV9V7v4e+Eak2Ix6 +rvrrtWUi42wQAg+DinLBQg+2zqIealV7+nQ6GB2KNstr5PJ8VOyfoEQPVHAvkhedNb2 G61w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id p1-20020a056402074100b005234011bb47si3635560edy.679.2023.09.09.09.29.18; Sat, 09 Sep 2023 09:29:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345459AbjIILzU (ORCPT + 11 others); Sat, 9 Sep 2023 07:55:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48736 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345422AbjIILzT (ORCPT ); Sat, 9 Sep 2023 07:55:19 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 58F06E57 for ; Sat, 9 Sep 2023 04:55:14 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D20A6C433C8; Sat, 9 Sep 2023 11:55:10 +0000 (UTC) From: Huacai Chen To: Huacai Chen , Andrey Ryabinin , Andrey Konovalov , Alexander Potapenko Cc: loongarch@lists.linux.dev, Xuerui Wang , Jiaxun Yang , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org, loongson-kernel@lists.loongnix.cn, Huacai Chen , Linus Torvalds Subject: [PATCH 2/2] LoongArch: Don't inline kasan_mem_to_shadow()/kasan_shadow_to_mem() Date: Sat, 9 Sep 2023 19:54:49 +0800 Message-Id: <20230909115450.1903218-2-chenhuacai@loongson.cn> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20230909115450.1903218-1-chenhuacai@loongson.cn> References: <20230909115450.1903218-1-chenhuacai@loongson.cn> MIME-Version: 1.0 X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776578159449238766 X-GMAIL-MSGID: 1776578159449238766 As Linus suggested, kasan_mem_to_shadow()/kasan_shadow_to_mem() are not performance-critical and too big to inline. This is simply wrong so just define them out-of-line. If they really need to be inlined in future, such as the objtool / SMAP issue for X86, we should mark them __always_inline. Suggested-by: Linus Torvalds Signed-off-by: Huacai Chen --- arch/loongarch/include/asm/kasan.h | 59 +++--------------------------- arch/loongarch/mm/kasan_init.c | 51 ++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 53 deletions(-) diff --git a/arch/loongarch/include/asm/kasan.h b/arch/loongarch/include/asm/kasan.h index a12ecab37da7..cd6084f4e153 100644 --- a/arch/loongarch/include/asm/kasan.h +++ b/arch/loongarch/include/asm/kasan.h @@ -60,63 +60,16 @@ extern bool kasan_early_stage; extern unsigned char kasan_early_shadow_page[PAGE_SIZE]; -#define kasan_arch_is_ready kasan_arch_is_ready -static __always_inline bool kasan_arch_is_ready(void) -{ - return !kasan_early_stage; -} - #define kasan_mem_to_shadow kasan_mem_to_shadow -static inline void *kasan_mem_to_shadow(const void *addr) -{ - if (!kasan_arch_is_ready()) { - return (void *)(kasan_early_shadow_page); - } else { - unsigned long maddr = (unsigned long)addr; - unsigned long xrange = (maddr >> XRANGE_SHIFT) & 0xffff; - unsigned long offset = 0; - - maddr &= XRANGE_SHADOW_MASK; - switch (xrange) { - case XKPRANGE_CC_SEG: - offset = XKPRANGE_CC_SHADOW_OFFSET; - break; - case XKPRANGE_UC_SEG: - offset = XKPRANGE_UC_SHADOW_OFFSET; - break; - case XKVRANGE_VC_SEG: - offset = XKVRANGE_VC_SHADOW_OFFSET; - break; - default: - WARN_ON(1); - return NULL; - } - - return (void *)((maddr >> KASAN_SHADOW_SCALE_SHIFT) + offset); - } -} +void *kasan_mem_to_shadow(const void *addr); #define kasan_shadow_to_mem kasan_shadow_to_mem -static inline const void *kasan_shadow_to_mem(const void *shadow_addr) +const void *kasan_shadow_to_mem(const void *shadow_addr); + +#define kasan_arch_is_ready kasan_arch_is_ready +static __always_inline bool kasan_arch_is_ready(void) { - unsigned long addr = (unsigned long)shadow_addr; - - if (unlikely(addr > KASAN_SHADOW_END) || - unlikely(addr < KASAN_SHADOW_START)) { - WARN_ON(1); - return NULL; - } - - if (addr >= XKVRANGE_VC_SHADOW_OFFSET) - return (void *)(((addr - XKVRANGE_VC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKVRANGE_VC_START); - else if (addr >= XKPRANGE_UC_SHADOW_OFFSET) - return (void *)(((addr - XKPRANGE_UC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_UC_START); - else if (addr >= XKPRANGE_CC_SHADOW_OFFSET) - return (void *)(((addr - XKPRANGE_CC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_CC_START); - else { - WARN_ON(1); - return NULL; - } + return !kasan_early_stage; } #define addr_has_metadata addr_has_metadata diff --git a/arch/loongarch/mm/kasan_init.c b/arch/loongarch/mm/kasan_init.c index da68bc1a4643..cc3e81fe0186 100644 --- a/arch/loongarch/mm/kasan_init.c +++ b/arch/loongarch/mm/kasan_init.c @@ -35,6 +35,57 @@ static pgd_t kasan_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); bool kasan_early_stage = true; +void *kasan_mem_to_shadow(const void *addr) +{ + if (!kasan_arch_is_ready()) { + return (void *)(kasan_early_shadow_page); + } else { + unsigned long maddr = (unsigned long)addr; + unsigned long xrange = (maddr >> XRANGE_SHIFT) & 0xffff; + unsigned long offset = 0; + + maddr &= XRANGE_SHADOW_MASK; + switch (xrange) { + case XKPRANGE_CC_SEG: + offset = XKPRANGE_CC_SHADOW_OFFSET; + break; + case XKPRANGE_UC_SEG: + offset = XKPRANGE_UC_SHADOW_OFFSET; + break; + case XKVRANGE_VC_SEG: + offset = XKVRANGE_VC_SHADOW_OFFSET; + break; + default: + WARN_ON(1); + return NULL; + } + + return (void *)((maddr >> KASAN_SHADOW_SCALE_SHIFT) + offset); + } +} + +const void *kasan_shadow_to_mem(const void *shadow_addr) +{ + unsigned long addr = (unsigned long)shadow_addr; + + if (unlikely(addr > KASAN_SHADOW_END) || + unlikely(addr < KASAN_SHADOW_START)) { + WARN_ON(1); + return NULL; + } + + if (addr >= XKVRANGE_VC_SHADOW_OFFSET) + return (void *)(((addr - XKVRANGE_VC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKVRANGE_VC_START); + else if (addr >= XKPRANGE_UC_SHADOW_OFFSET) + return (void *)(((addr - XKPRANGE_UC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_UC_START); + else if (addr >= XKPRANGE_CC_SHADOW_OFFSET) + return (void *)(((addr - XKPRANGE_CC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_CC_START); + else { + WARN_ON(1); + return NULL; + } +} + /* * Alloc memory for shadow memory page table. */