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. */