From patchwork Thu Dec 31 21:28:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dennis Zhou X-Patchwork-Id: 11994325 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15536C433DB for ; Thu, 31 Dec 2020 21:29:33 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 798DE208B8 for ; Thu, 31 Dec 2020 21:29:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 798DE208B8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 8DDEC8D00B6; Thu, 31 Dec 2020 16:29:31 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 8672F8D008E; Thu, 31 Dec 2020 16:29:31 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 755A68D00B6; Thu, 31 Dec 2020 16:29:31 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0089.hostedemail.com [216.40.44.89]) by kanga.kvack.org (Postfix) with ESMTP id 5C6D78D008E for ; Thu, 31 Dec 2020 16:29:31 -0500 (EST) Received: from smtpin01.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 200CC181AC9CC for ; Thu, 31 Dec 2020 21:29:31 +0000 (UTC) X-FDA: 77654868942.01.rate54_37153c1274b1 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin01.hostedemail.com (Postfix) with ESMTP id 03BB910049A52 for ; Thu, 31 Dec 2020 21:29:30 +0000 (UTC) X-HE-Tag: rate54_37153c1274b1 X-Filterd-Recvd-Size: 5813 Received: from mail-il1-f174.google.com (mail-il1-f174.google.com [209.85.166.174]) by imf35.hostedemail.com (Postfix) with ESMTP for ; Thu, 31 Dec 2020 21:29:30 +0000 (UTC) Received: by mail-il1-f174.google.com with SMTP id x15so18284800ilq.1 for ; Thu, 31 Dec 2020 13:29:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=s3PoZ0PHUx1hgtai3jyNcYrrctOineum5xKahaAQuf0=; b=QJdQYOB7wCaglGREPYiCoBqyQWJ5tnvuz5/mKmetFxj3oJxRpcagkI1RlXcrTzXl2k DQ5BP944sos366qjUGzOFnCcEIdjSRjQ/jzSZy5WEfomd/3qyQ5rOqCHJHqC9NaSnQEU WI6NRVBUi2fDea+RoU+61I1vhhcCRSGIYCUmb0XzCfKsX5U0wFGu6uPnhDSJnhrm+b5j 3WdCnZYi1NiNSvyHRk7NwKgoi25xgwwBpS+rv8NZSHbcWN8bkF9g20PXiJKiWMezjTlh M08LgdoqEB/zA06UhPbn0UhUYCNsh50XOrE5mehI96c+qjbpldqiUgXUmSH7kbRXzjxN j5bw== X-Gm-Message-State: AOAM530iynfR4C/JHVZMn41LinIOCvt3vBglw1qZzO1BruGlHnzBBPZZ s7uNjV7G1gCGhso8J0Q1pfg= X-Google-Smtp-Source: ABdhPJwEYHZ/2q0xIq0QPy5lZGzubep2jTAG3l806YSYcy6yUgLb+jOITjXbV94qdLlalD73g7rGwA== X-Received: by 2002:a05:6e02:10c8:: with SMTP id s8mr33393800ilj.13.1609450170050; Thu, 31 Dec 2020 13:29:30 -0800 (PST) Received: from abasin.c.googlers.com.com (110.41.72.34.bc.googleusercontent.com. [34.72.41.110]) by smtp.gmail.com with ESMTPSA id g13sm33454498iln.12.2020.12.31.13.29.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Dec 2020 13:29:29 -0800 (PST) From: Dennis Zhou To: Tejun Heo , Christoph Lameter Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, clang-built-linux@googlegroups.com, kbuild-all@lists.01.org, Dennis Zhou , kernel test robot Subject: [PATCH] percpu: fix clang modpost warning in pcpu_build_alloc_info() Date: Thu, 31 Dec 2020 21:28:52 +0000 Message-Id: <20201231212852.3175381-1-dennis@kernel.org> X-Mailer: git-send-email 2.29.2.729.g45daf8777d-goog MIME-Version: 1.0 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: This is an unusual situation so I thought it best to explain it in a separate patch. "percpu: reduce the number of cpu distance comparisons" introduces a dependency on cpumask helper functions in __init code. This code references a struct cpumask annotated __initdata. When the function is inlined (gcc), everything is fine, but clang decides not to inline these function calls. This causes modpost to warn about an __initdata access by a function not annotated with __init [1]. Ways I thought about fixing it: 1. figure out why clang thinks this inlining is too costly. 2. create a wrapper function annotated __init (this). 3. annotate cpumask with __refdata. Ultimately it comes down to if it's worth saving the cpumask memory and allowing it to be freed. IIUC, __refdata won't be freed, so option 3 is just a little wasteful. 1 is out of my depth, leaving 2. I don't feel great about this behavior being dependent on inlining semantics, but cpumask helpers are small and probably should be inlined. modpost complaint: WARNING: modpost: vmlinux.o(.text+0x735425): Section mismatch in reference from the function cpumask_clear_cpu() to the variable .init.data:pcpu_build_alloc_info.mask The function cpumask_clear_cpu() references the variable __initdata pcpu_build_alloc_info.mask. This is often because cpumask_clear_cpu lacks a __initdata annotation or the annotation of pcpu_build_alloc_info.mask is wrong. clang output: mm/percpu.c:2724:5: remark: cpumask_clear_cpu not inlined into pcpu_build_alloc_info because too costly to inline (cost=725, threshold=325) [-Rpass-missed=inline] [1] https://lore.kernel.org/linux-mm/202012220454.9F6Bkz9q-lkp@intel.com/ Reported-by: kernel test robot Signed-off-by: Dennis Zhou Signed-off-by: Arnd Bergmann --- This is on top of percpu#for-5.12. mm/percpu.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/mm/percpu.c b/mm/percpu.c index 80f8f885a990..357977c4cb00 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -2642,6 +2642,18 @@ early_param("percpu_alloc", percpu_alloc_setup); /* pcpu_build_alloc_info() is used by both embed and page first chunk */ #if defined(BUILD_EMBED_FIRST_CHUNK) || defined(BUILD_PAGE_FIRST_CHUNK) + +/* + * This wrapper is to avoid a warning where cpumask_clear_cpu() is not inlined + * when compiling with clang causing modpost to warn about accessing __initdata + * from a non __init function. By doing this, we allow the struct cpumask to be + * freed instead of it taking space by annotating with __refdata. + */ +static void __init pcpu_cpumask_clear_cpu(int cpu, struct cpumask *mask) +{ + cpumask_clear_cpu(cpu, mask); +} + /** * pcpu_build_alloc_info - build alloc_info considering distances between CPUs * @reserved_size: the size of reserved percpu area in bytes @@ -2713,7 +2725,7 @@ static struct pcpu_alloc_info * __init pcpu_build_alloc_info( cpu = cpumask_first(&mask); group_map[cpu] = group; group_cnt[group]++; - cpumask_clear_cpu(cpu, &mask); + pcpu_cpumask_clear_cpu(cpu, &mask); for_each_cpu(tcpu, &mask) { if (!cpu_distance_fn || @@ -2721,7 +2733,7 @@ static struct pcpu_alloc_info * __init pcpu_build_alloc_info( cpu_distance_fn(tcpu, cpu) == LOCAL_DISTANCE)) { group_map[tcpu] = group; group_cnt[group]++; - cpumask_clear_cpu(tcpu, &mask); + pcpu_cpumask_clear_cpu(tcpu, &mask); } } }