Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752653AbbDTCRU (ORCPT ); Sun, 19 Apr 2015 22:17:20 -0400 Received: from ozlabs.org ([103.22.144.67]:37897 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751887AbbDTCRT (ORCPT ); Sun, 19 Apr 2015 22:17:19 -0400 From: Rusty Russell To: Paul Gortmaker Cc: linux-kernel@vger.kernel.org, Paul Gortmaker Subject: Re: [PATCH 2/2] modpost: don't emit section mismatch warnings for compiler optimizations In-Reply-To: <1429471248-4641-2-git-send-email-paul.gortmaker@windriver.com> References: <1429471248-4641-1-git-send-email-paul.gortmaker@windriver.com> <1429471248-4641-2-git-send-email-paul.gortmaker@windriver.com> User-Agent: Notmuch/0.17 (http://notmuchmail.org) Emacs/24.3.1 (x86_64-pc-linux-gnu) Date: Mon, 20 Apr 2015 11:32:12 +0930 Message-ID: <87wq17pnff.fsf@rustcorp.com.au> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3658 Lines: 96 Paul Gortmaker writes: > Currently an allyesconfig build [gcc-4.9.1] can generate the following: > > WARNING: vmlinux.o(.text.unlikely+0x3864): Section mismatch in > reference from the function cpumask_empty.constprop.3() to the > variable .init.data:nmi_ipi_mask > > which comes from the cpumask_empty usage in arch/x86/kernel/nmi_selftest.c. Thanks for the excellent explanation and patches. Applied! Rusty. > > Normally we would not see a symbol entry for cpumask_empty since it is: > > static inline bool cpumask_empty(const struct cpumask *srcp) > > however in this case, the variant of the symbol gets emitted when GCC does > constant propagation optimization. > > Fix things up so that any locally optimized constprop variants don't warn > when accessing variables that live in the __init sections. > > Signed-off-by: Paul Gortmaker > --- > scripts/mod/modpost.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c > index b18cecb6bf5a..572f1e4a2626 100644 > --- a/scripts/mod/modpost.c > +++ b/scripts/mod/modpost.c > @@ -908,6 +908,9 @@ static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL }; > static const char *const init_exit_sections[] = > {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL }; > > +/* all text sections */ > +static const char *const text_sections[] = { ALL_TEXT_SECTIONS, NULL }; > + > /* data section */ > static const char *const data_sections[] = { DATA_SECTIONS, NULL }; > > @@ -926,6 +929,7 @@ static const char *const data_sections[] = { DATA_SECTIONS, NULL }; > static const char *const head_sections[] = { ".head.text*", NULL }; > static const char *const linker_symbols[] = > { "__init_begin", "_sinittext", "_einittext", NULL }; > +static const char *const optim_symbols[] = { "*.constprop.*", NULL }; > > enum mismatch { > TEXT_TO_ANY_INIT, > @@ -1127,6 +1131,17 @@ static const struct sectioncheck *section_mismatch( > * This pattern is identified by > * refsymname = __init_begin, _sinittext, _einittext > * > + * Pattern 5: > + * GCC may optimize static inlines when fed constant arg(s) resulting > + * in functions like cpumask_empty() -- generating an associated symbol > + * cpumask_empty.constprop.3 that appears in the audit. If the const that > + * is passed in comes from __init, like say nmi_ipi_mask, we get a > + * meaningless section warning. May need to add isra symbols too... > + * This pattern is identified by > + * tosec = init section > + * fromsec = text section > + * refsymname = *.constprop.* > + * > **/ > static int secref_whitelist(const struct sectioncheck *mismatch, > const char *fromsec, const char *fromsym, > @@ -1159,6 +1174,12 @@ static int secref_whitelist(const struct sectioncheck *mismatch, > if (match(tosym, linker_symbols)) > return 0; > > + /* Check for pattern 5 */ > + if (match(fromsec, text_sections) && > + match(tosec, init_sections) && > + match(fromsym, optim_symbols)) > + return 0; > + > return 1; > } > > -- > 2.2.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/