Received: by 2002:a05:7412:1703:b0:e2:908c:2ebd with SMTP id dm3csp863410rdb; Fri, 25 Aug 2023 03:38:11 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHQj0BgS5QMHATVkijNx3G/ik6jg2uIE+96iUcVW5PZHClllxkwBGoQ2vGXhzAYIBrSoX/Y X-Received: by 2002:a17:907:2711:b0:9a1:df30:e158 with SMTP id w17-20020a170907271100b009a1df30e158mr6778834ejk.36.1692959891576; Fri, 25 Aug 2023 03:38:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692959891; cv=none; d=google.com; s=arc-20160816; b=a6dPAKxAjevC/h+Oiqwgvm/xNY/K3My79FeztZL02oDTep/ZEvWW/A81WADrPLqnbQ qOd08q/AI1VCxl89aJIi9O9+oUPyFIabn3W+SKjEQhf4pjIlk0NV3nBbqw+Ldv5ybc+z TVIlRoqywBZVYwXuk/PnH8R+xEW13h2obLvKVcM4kJkAByp23pGyKxaX00t7GnU5BNHM 0+Dd73+ogzL++hyfJpkOmDA7M1L0tlnPLKSv3Gmq4xiELjJQehLG7rU6K668J3B8taGd E8FilN8XMsO3JByE3KDAv+RuBLpmo9hb5mdacTBhGSwh99T6zTiCU/87iOqVAM+ZSw+y iQEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=7IJefDucW9rcfSVI6mcwfbutsQgS/vEuPzw0pBfQgMA=; fh=Fi3ns0ZJor1YaaWP5Ji9yVgstvmBXbhR9Hocn5sJ36w=; b=aitbUTwoMDVOrJNeEK4WAf3W4BkQYPCjhnMKc4qJemBH/YURb5EuHlxADQGD77ZXkJ YYTqA3YGfuG6EsUDlB/uTTn/J37Qruf5CWc5CFjorOnbJFo09JMl2nm/byT+7F06U8i7 KZN9woP47qJAdleJtYXCkJIkQiCOGjOOWT91KZT/L7nsntdBbCfhTzpYsm3Mnb2o2SVD +8MXjO7utr2C6OiWC57kbAmy97jUr4SsDepC8Tp8V1lE+PmBtDI/haVzyA8tikSaQCVP XpJtsUHPuEaI782MWScxzSTuz/lFhMPybYj09mX7Tb2Cghc3GrwIu+63hOY52WqywOLy oyOg== 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v9-20020a170906488900b0099cd52f95dfsi810527ejq.332.2023.08.25.03.37.40; Fri, 25 Aug 2023 03:38:11 -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 S234223AbjHYHTt (ORCPT + 99 others); Fri, 25 Aug 2023 03:19:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55146 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243175AbjHYHTY (ORCPT ); Fri, 25 Aug 2023 03:19:24 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1479919B5 for ; Fri, 25 Aug 2023 00:19:19 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.169]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RXBCP1xy8z4f3kjV for ; Fri, 25 Aug 2023 15:19:13 +0800 (CST) Received: from [10.174.178.55] (unknown [10.174.178.55]) by APP4 (Coremail) with SMTP id gCh0CgBH16nuVehkUYQkBg--.15410S3; Fri, 25 Aug 2023 15:19:14 +0800 (CST) Subject: Re: [PATCH] kallsyms: Fix kallsyms_selftest failure To: Yonghong Song , Kees Cook , Nick Desaulniers , Petr Mladek , Song Liu , Steven Rostedt Cc: Fangrui Song , kernel-team@fb.com, Leizhen , linux-kernel@vger.kernel.org, llvm@lists.linux.dev, kernel test robot References: <20230825034659.1037627-1-yonghong.song@linux.dev> From: "Leizhen (ThunderTown)" Message-ID: <95a7d98c-b227-7929-b833-f6adc3b7e3ca@huaweicloud.com> Date: Fri, 25 Aug 2023 15:19:10 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0 MIME-Version: 1.0 In-Reply-To: <20230825034659.1037627-1-yonghong.song@linux.dev> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-CM-TRANSID: gCh0CgBH16nuVehkUYQkBg--.15410S3 X-Coremail-Antispam: 1UD129KBjvJXoWxuFyxCw1xAF1rZFyrtFW7CFg_yoW7Xw47pr WSyFsrGF48Ar1Fka4UJay8WryxCws5Xw1UGayqkFykCFn5ury0qwn7Kw4fu3s8ZrZ8uFWr XanYvFyxtF10yFUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUvIb4IE77IF4wAFF20E14v26r4j6ryUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4 vEj48ve4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7Cj xVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x 0267AKxVW0oVCq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG 6I80ewAv7VC0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFV Cjc4AY6r1j6r4UM4x0Y48IcVAKI48JM4IIrI8v6xkF7I0E8cxan2IY04v7Mxk0xIA0c2IE e2xFo4CEbIxvr21l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxV Aqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q 6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6x kF7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWrZr1j6s0DMIIF0xvEx4A2jsIE 14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf 9x07UWE__UUUUU= X-CM-SenderInfo: hwkx0vthuozvpl2kv046kxt4xhlfz01xgou0bp/ X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE autolearn=ham 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 On 2023/8/25 11:46, Yonghong Song wrote: > Kernel test robot reported a kallsyms_test failure when clang lto is > enabled (thin or full) and CONFIG_KALLSYMS_SELFTEST is also enabled. > I can reproduce in my local environment with the following error message > with thin lto: > [ 1.877897] kallsyms_selftest: Test for 1750th symbol failed: (tsc_cs_mark_unstable) addr=ffffffff81038090 > [ 1.877901] kallsyms_selftest: abort > > It appears that commit 8cc32a9bbf29 ("kallsyms: strip LTO-only suffixes > from promoted global functions") caused the failure. Commit 8cc32a9bbf29 > changed cleanup_symbol_name() based on ".llvm." instead of '.' where > ".llvm." is appended to a before-lto-optimization local symbol name. > We need to propagate such knowledge in kallsyms_selftest.c as well. > > Further more, compare_symbol_name() in kallsyms.c needs change as well. > In scripts/kallsyms.c, kallsyms_names and kallsyms_seqs_of_names are used > to record symbol names themselves and index to symbol names respectively. > For example: > kallsyms_names: > ... > __amd_smn_rw._entry <== seq 1000 > __amd_smn_rw._entry.5 <== seq 1001 > __amd_smn_rw.llvm. <== seq 1002 > ... > > kallsyms_seqs_of_names are sorted based on cleanup_symbol_name() through, so > the order in kallsyms_seqs_of_names actually has > > index 1000: seq 1002 <== __amd_smn_rw.llvm. (actual symbol comparison using '__amd_smn_rw') > index 1001: seq 1000 <== __amd_smn_rw._entry > index 1002: seq 1001 <== __amd_smn_rw._entry.5 > > Let us say at a particular point, at index 1000, symbol '__amd_smn_rw.llvm.' > is comparing to '__amd_smn_rw._entry' where '__amd_smn_rw._entry' is the one to > search e.g., with function kallsyms_on_each_match_symbol(). The current implementation > will find out '__amd_smn_rw._entry' is less than '__amd_smn_rw.llvm.' and > then continue to search e.g., index 999 and never found a match although the actual > index 1001 is a match. > > To fix this issue, let us do cleanup_symbol_name() first and then do comparison. > In the above case, comparing '__amd_smn_rw' vs '__amd_smn_rw._entry' and > '__amd_smn_rw._entry' being greater than '__amd_smn_rw', the next comparison will > be > index 1000 and eventually index 1001 will be hit an a match is found. > > For any symbols not having '.llvm.' substr, there is no functionality change > for compare_symbol_name(). Reviewed-by: Zhen Lei > > Fixes: 8cc32a9bbf29 ("kallsyms: strip LTO-only suffixes from promoted global functions") > Reported-by: kernel test robot > Closes: https://lore.kernel.org/oe-lkp/202308232200.1c932a90-oliver.sang@intel.com > Signed-off-by: Yonghong Song > --- > kernel/kallsyms.c | 17 +++++++---------- > kernel/kallsyms_selftest.c | 23 +---------------------- > 2 files changed, 8 insertions(+), 32 deletions(-) > > diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c > index 016d997131d4..e12d26c10dba 100644 > --- a/kernel/kallsyms.c > +++ b/kernel/kallsyms.c > @@ -188,16 +188,13 @@ static bool cleanup_symbol_name(char *s) > > static int compare_symbol_name(const char *name, char *namebuf) > { > - int ret; > - > - ret = strcmp(name, namebuf); > - if (!ret) > - return ret; > - > - if (cleanup_symbol_name(namebuf) && !strcmp(name, namebuf)) > - return 0; > - > - return ret; > + /* The kallsyms_seqs_of_names is sorted based on names after > + * cleanup_symbol_name() (see scripts/kallsyms.c) if clang lto is enabled. > + * To ensure correct bisection in kallsyms_lookup_names(), do > + * cleanup_symbol_name(namebuf) before comparing name and namebuf. > + */ > + cleanup_symbol_name(namebuf); > + return strcmp(name, namebuf); > } > > static unsigned int get_symbol_seq(int index) > diff --git a/kernel/kallsyms_selftest.c b/kernel/kallsyms_selftest.c > index a2e3745d15c4..e05ddc33a752 100644 > --- a/kernel/kallsyms_selftest.c > +++ b/kernel/kallsyms_selftest.c > @@ -196,7 +196,7 @@ static bool match_cleanup_name(const char *s, const char *name) > if (!IS_ENABLED(CONFIG_LTO_CLANG)) > return false; > > - p = strchr(s, '.'); > + p = strstr(s, ".llvm."); > if (!p) > return false; > > @@ -344,27 +344,6 @@ static int test_kallsyms_basic_function(void) > goto failed; > } > > - /* > - * The first '.' may be the initial letter, in which case the > - * entire symbol name will be truncated to an empty string in > - * cleanup_symbol_name(). Do not test these symbols. > - * > - * For example: > - * cat /proc/kallsyms | awk '{print $3}' | grep -E "^\." | head > - * .E_read_words > - * .E_leading_bytes > - * .E_trailing_bytes > - * .E_write_words > - * .E_copy > - * .str.292.llvm.12122243386960820698 > - * .str.24.llvm.12122243386960820698 > - * .str.29.llvm.12122243386960820698 > - * .str.75.llvm.12122243386960820698 > - * .str.99.llvm.12122243386960820698 > - */ > - if (IS_ENABLED(CONFIG_LTO_CLANG) && !namebuf[0]) > - continue; > - > lookup_addr = kallsyms_lookup_name(namebuf); > > memset(stat, 0, sizeof(*stat)); > -- Regards, Zhen Lei