From patchwork Wed Mar 16 17:02:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Metcalf X-Patchwork-Id: 8602871 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id E06449F44D for ; Wed, 16 Mar 2016 17:13:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0E124202E6 for ; Wed, 16 Mar 2016 17:13:10 +0000 (UTC) Received: from bombadil.infradead.org (unknown [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9D130202AE for ; Wed, 16 Mar 2016 17:13:03 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1agErP-0006lm-EV; Wed, 16 Mar 2016 17:03:51 +0000 Received: from mail-db3on0053.outbound.protection.outlook.com ([157.55.234.53] helo=emea01-db3-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1agEqk-0006Nj-QX for linux-arm-kernel@lists.infradead.org; Wed, 16 Mar 2016 17:03:19 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=W7njB7tqY6C5VNzvPpQA+iWG6u4GavA38tuSSOi8D7A=; b=TdMIwapnE1Xk0l5eUJpKnNcBBEQ2VTRnA+Tup9jrH/Txr5LUDjVc6yNwW4EvX0UBJ/6M9r0HcWWTp1whXZ8GHLZJnaFtpBzNfZqeOBRTbubxyYn/RqqGjSKVl9URSzhYE2VZQA5fzkq/W7tiTMVylf+rOkzayKTK0/AOFdLXUIE= Received: from DB4PR05CA0036.eurprd05.prod.outlook.com (10.160.40.46) by HE1PR05MB1689.eurprd05.prod.outlook.com (10.169.119.155) with Microsoft SMTP Server (TLS) id 15.1.434.16; Wed, 16 Mar 2016 17:02:43 +0000 Received: from DB3FFO11FD016.protection.gbl (2a01:111:f400:7e04::156) by DB4PR05CA0036.outlook.office365.com (2a01:111:e400:9850::46) with Microsoft SMTP Server (TLS) id 15.1.434.16 via Frontend Transport; Wed, 16 Mar 2016 17:02:43 +0000 Authentication-Results: spf=fail (sender IP is 12.216.194.146) smtp.mailfrom=ezchip.com; mellanox.com; dkim=none (message not signed) header.d=none; mellanox.com; dmarc=fail action=none header.from=mellanox.com; Received-SPF: Fail (protection.outlook.com: domain of ezchip.com does not designate 12.216.194.146 as permitted sender) receiver=protection.outlook.com; client-ip=12.216.194.146; helo=ld-1.internal.tilera.com; Received: from ld-1.internal.tilera.com (12.216.194.146) by DB3FFO11FD016.mail.protection.outlook.com (10.47.216.190) with Microsoft SMTP Server (TLS) id 15.1.434.11 via Frontend Transport; Wed, 16 Mar 2016 17:02:41 +0000 Received: (from cmetcalf@localhost) by ld-1.internal.tilera.com (8.14.4/8.14.4/Submit) id u2GH2eHM029389; Wed, 16 Mar 2016 13:02:40 -0400 From: Chris Metcalf To: Peter Zijlstra , Russell King , Thomas Gleixner , Aaron Tomlin , Ingo Molnar , Andrew Morton , Daniel Thompson , , , , Subject: [PATCH v2 4/4] nmi_backtrace: generate one-line reports for idle cpus Date: Wed, 16 Mar 2016 13:02:13 -0400 Message-ID: <1458147733-29338-5-git-send-email-cmetcalf@mellanox.com> X-Mailer: git-send-email 2.7.2 In-Reply-To: <1458147733-29338-1-git-send-email-cmetcalf@mellanox.com> References: <1458147733-29338-1-git-send-email-cmetcalf@mellanox.com> X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:12.216.194.146; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(50466002)(5003940100001)(11100500001)(6806005)(92566002)(50986999)(76176999)(575784001)(86362001)(5008740100001)(960300001)(47776003)(104016004)(1096002)(87936001)(1220700001)(33646002)(2906002)(4326007)(5890100001)(5001970100001)(107886002)(36756003)(105606002)(5001770100001)(189998001)(586003)(48376002)(106466001)(2201001)(229853001)(85426001)(19580395003)(19580405001)(42186005)(2950100001)(921003)(2101003)(83996005)(1121003); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR05MB1689; H:ld-1.internal.tilera.com; FPR:; SPF:Fail; MLV:sfv; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB3FFO11FD016; 1:02ncF6qxu377Bldz7lH40e9pVF/ejD496+49AChJY0CHNFtCnwhS+Ed43DEiVcsu6qNk9as1WHO9k33gFYTd2dfFVug/3BMinB/S+GLGhwBT73N99laItXp0NfGtUT5tYv9ieqklT0gKU8ysIPdq6IcIF1SZsDWdJb2VzaufoO84LU2tJ1s3R2MlZ1SRuuVUpVX39NhAww2AwvT6HwFez8stUE7lx1qBro9dIyPvs42ex9Wd32hfOt6qRkBABDjVWSjsC9HdAWo0jHsfhMlawNLQWk5PON98g91OuLqZqoUCUoiZ1EuS82jc70ZH2sbyRGW5rZ4vj0keKzrew22Lrm49DeeRNUWFSTHrOpV43wu51ZrEztwmZiKCJeoLZtgCxz45HkjtLSWtm/xwtBR3DHv4lIDSgqK0R7In0UuzmXs9T3+iUyvEuMLOk2WjZDSiq8dPmXBJwiUo4MnQNDiaPwpx+Eu0ovNfhIh4ackgmDlz65tcUFlcG1dJFDdfiDWHOVBfctneYDKqJPL0T0Busu/+LKyouxRPW+8Vx0odhNw= MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 3ca64238-c611-4c63-e73d-08d34dbcc9eb X-Microsoft-Exchange-Diagnostics: 1; HE1PR05MB1689; 2:3mzLL4K4+qNpOR0kYlCDEAUsbrQaTjx9TSC/3vlPxhtdm5PYhjw+aDhcJOuAmEaYABFPsyk5JU7K2w66B9qDh88jhZO6HUGGpfiONP/O9EXVeT4C/asZB4us6HBiVFrEVizZPmv9NU17HXDdHDeWRHViYvINmqO6G7WxDMCrRjyHDe7iLs8/gMfcTH3TMhQD; 3:zfEtXXELRZTIbxpzSQkrN8RAL36VcSDEXA5ZlD5uJjYeoyKTHog39g8MZmN2u+J9i1UdHNPy7SDUf7RKxfIOsAbNT9c8VJI3L/y16b6kEhU5bs/I1FGQSiH6PFBHwjKdEIZ0SlQvsOlABLKIvGBZCUKz7jPhNzcq574NYtK3DUcvLdr4aItrAdLx0Hz1kSV5BIufke5so3mNn7GdStJ8viNx7OAab8Cpwem/DOJBKhQ=; 25:XVZjSkTwbTtZzaTC5vmDtgISohKbCveNPunzWnx1+xaHXMrqSmcXykLlb/vliPdt1a4da0mj8ZhuO4fKtz8qvf6mVSSdKn7AfyqsGbkK80mbF+LYmfDT3ZeOa/GTdi3RexJeTbybpqDm6T34Drr9z8RW3X968d69ZD6f+uyxW3ksZRHFSBwvAUl1SABZIidSlJfHuGwFCfV8qMPwCz0HDz3fXHciPo6YrTeXD0M8adkVM9HEAaBWWM1IUmxweod+Cuv9553+jE4Baha5Is//tSFKUj2gmWDhD1taTIG2oE2EpOYYY2pmc59GAyM5VFKAmutVE/lLRVoshz2qDDOPBg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR05MB1689; X-MLNXRule-EZCH-Linux: Rule triggered X-Microsoft-Exchange-Diagnostics: 1; HE1PR05MB1689; 20:Q4zZGII3qMS84r1hCFydTI3MWfvLTzOemQCJoVW0z16X7hc124idh83P9zkBTNsQko3H3jOF1CJo1UZCYdBVJFjJzF01nlozaQ+Bqmsg7nWWeE5wGJpG5tiR84W0fGnvTxng50oMgPkBuELbqILoXra41xgv2coaNg7DGsPOCCDppCDEQ98UyRZO58oe0YzXS+BsCyaqdWFey0G75mefqcO0fID3gXZUJCzzBoBtCNbDk4yNQXyWJRVk+Z5VAC6eUTdbPBkrSeUCBO0w8lVhdKXkMbTCSSTF60xCsRVJcadYSc5Pm5WRe92ZJ8Gf1LTnsFAXGm5S7iuwwkyfTRDw66x5b/rbteARVcu5IlFZCVAkBhiK/HgecATw1OXrUexfGCV05TjFiKkqsqDZZ+i+f3eChqpMkD/P5H2nUa0qAhoq5P+F+MBtuYFQUDAJDhidGUX+xTTVAEHC7bmi6hc38B386K4JU68zke/91edrpkmwtflwnlNvWK6Cm8kEwINK X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13017025)(13015025)(5005006)(13023025)(13024025)(13018025)(8121501046)(3002001)(10201501046); SRVR:HE1PR05MB1689; BCL:0; PCL:0; RULEID:; SRVR:HE1PR05MB1689; X-Microsoft-Exchange-Diagnostics: 1; HE1PR05MB1689; 4:pS+lDscq0bV3pyvUIPRrhiAMhu197IKLZo1ozOsPJnMt23kajBaUKSLTMXPAzt5eM9X4XTFCydMSidn6sLMVPVb5IMUsxNX/WPZ+5ZXcadwGVYhOnGYEa6fwzH/J3lNLNF51dVxE3IT51hlLtpGys2/4hVx1aj86QQr9UU9arzoo/IFpfGijk0tkKk9VeKzTM1XZtEcEwojuGFES9hnIzomEn3RfT1s/3/yYuGyOZnxkVj7KafjRjQHBvYHX0lZlvVLnfdk9m9Sl1NNE+0VaeQC8RZDNMdJ0hOXJBsWWsL43/jQu87lXITYMCG1GEwKJhnVX7uf6pf1IX2TFSjdJPRS9H9j4lW/uK8OVsbjlY114qqaQD/Cp8ctfh+kIfvRt4iE+Te1WeCKtUjRLcMVx4w34Sh5vO8AK3/B2FKny9ym84WI8No+jYFBfufXNZsTrU7Mr7Y+bXyaILxs2poAOGQ== X-Forefront-PRVS: 08831F51DC X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR05MB1689; 23:iNh8ubxGtRX9fbRUGQT72jP+gva8j0qShqbxbKwq4?= =?us-ascii?Q?wbSSBnTzGf0eEPoeiYkqZezpk+pi7AhTh5Dj/3WAxel5powkxVjyoiQezh1O?= =?us-ascii?Q?pdhDgvQMrQOgiAqwu/jN3XyQROt025+yLyKPOhX5ElkKu2SFuoZ4WN1+A2o/?= =?us-ascii?Q?usqsVa9oye5V4zaftzXVSzwelCGTh1bg1IHQwU9+1euBTo7UFSwTnzq6KMpP?= =?us-ascii?Q?vNrRs4qAsFxKQ4dKWMsfsgug1ZB3cI+icAZlaGEnfE7Gplyu6w/HQT99twOZ?= =?us-ascii?Q?4BHxdFYe7S7BC2r1i3EkL7nvoabdGjDtcjpUa6Padb9uif0+Oruwl2EvrZKe?= =?us-ascii?Q?gP1FM/CPkfH9Xgrqk//RoLq5wHCkXuDn1ehbKqjAFUKvcgm2A/9Lytp4id77?= =?us-ascii?Q?zHym+WXHs9gmLyJsawM2TI7aMPq/DaDllGnbvGhtjTuby+bSn6ieRZtunvqo?= =?us-ascii?Q?m7t1ZMLSm/p/fLOQ5xA6/HxxMOH/HuJ5zcrbN8c+RlcoOGSSP8hs47GJA6zL?= =?us-ascii?Q?PACnWRhm2zKrlpb3YpIG4bI754FlnoEKiNKpvjEKII/+PAsP6ufIEg8yebB+?= =?us-ascii?Q?clMX5f5JNDic7qTvzsVzOeSXIpemJJWK1jD6rycIdzO7gEB7cczIcWNo97WC?= =?us-ascii?Q?lGfk3rCSeyWyCretllVHW27uzZ4DoLkdrvoasBZ1sxzLL+35v+MdnGS80Wl1?= =?us-ascii?Q?WhvY4OJ+2gbnX1Os0kQJYR4qWXMvdaJ0q75wm16G65R5ocuDwbKql+WtXs8A?= =?us-ascii?Q?KKy2J4mBpTfJsqpilKvJQfqTijisg4nfE/R1U6MF2D44JackLcAWNBHs/8i9?= =?us-ascii?Q?Ky7Zg08LFpYCtT/l1IZWXObDwblJatUmqnoscPUI6zDiaAqmgLGQFObJK9xm?= =?us-ascii?Q?PJu4cYSofhSL+I7y92DhSEn5NEIsH8AU7zGkbGHQDzkADQhegHCUbDUOnOW/?= =?us-ascii?Q?Gq866Y9p1gVfoxired8HNPpZeIJWzumlAl9f/IrGv6UoxEgIbuNf0fJjan4r?= =?us-ascii?Q?zT5Ct1/0Iawtj5Gz9LAmOIfrJdjXzUGtcqakRhbN5ow2zwxcHUstSe9Gc7ri?= =?us-ascii?Q?hjodNHERggr/+ZINq+amntVm8fz881Uky4AsgpCgEcXSydlwRoTnIN2Pelyj?= =?us-ascii?Q?Tp5s4bZwqUdF4g4RTnTuoffINL+nmrR3OsoE+2tvT6Z+Ps/w67QM9AzaaWM1?= =?us-ascii?Q?W0PUz+ePSb8ywSRHBeovRx7ebTw09MUmH1THgrI1aPVOPu5wTnVyWgMRQ=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR05MB1689; 5:e40Gi7s2/6TzYDMVjS4gagP89y4aeUeFpuAzZFlusxXnsk7ihPYxFjMvkjZJj1fgNEcEe7AHlOIeE2pZReLEBVSwLYzct2dGUM8kGQ1RVizdTTdfCFiRb6q70pQvSAECBNUtasJ9pZ9qb2iVvIsiJg==; 24:rSoMyisR/Awf3NwTOxW0/9uhVZ/a8kEcIS1HgZbVa9HrT8wWivmqUpeiuoWy6bDinrks+Z7uX6J07iOUCQ6o41kXGLuMy4hTlEN6HYp/890= X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Mar 2016 17:02:41.9378 (UTC) X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=a652971c-7d2e-4d9b-a6a4-d149256f461b; Ip=[12.216.194.146]; Helo=[ld-1.internal.tilera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR05MB1689 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160316_100312_201441_AF390EFE X-CRM114-Status: GOOD ( 11.99 ) X-Spam-Score: -2.0 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Chris Metcalf Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-3.3 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_MED, RDNS_NONE, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When doing an nmi backtrace of many cores, most of which are idle, the output is a little overwhelming and very uninformative. Suppress messages for cpus that are idling when they are interrupted and just emit one line, "NMI backtrace for N skipped: idling at pc 0xNNN". We do this by grouping all the cpuidle code together into a new .cpuidle.text section, and then checking the address of the interrupted PC to see if it lies within that section. Signed-off-by: Chris Metcalf Acked-by: Peter Zijlstra (Intel) Tested-by: Peter Zijlstra (Intel) --- arch/alpha/kernel/vmlinux.lds.S | 1 + arch/arc/kernel/vmlinux.lds.S | 1 + arch/arm/kernel/vmlinux.lds.S | 1 + arch/arm64/kernel/vmlinux.lds.S | 1 + arch/arm64/mm/proc.S | 2 ++ arch/avr32/kernel/vmlinux.lds.S | 1 + arch/blackfin/kernel/vmlinux.lds.S | 1 + arch/c6x/kernel/vmlinux.lds.S | 1 + arch/cris/kernel/vmlinux.lds.S | 1 + arch/frv/kernel/vmlinux.lds.S | 1 + arch/h8300/kernel/vmlinux.lds.S | 1 + arch/hexagon/kernel/vmlinux.lds.S | 1 + arch/ia64/kernel/vmlinux.lds.S | 1 + arch/m32r/kernel/vmlinux.lds.S | 1 + arch/m68k/kernel/vmlinux-nommu.lds | 1 + arch/m68k/kernel/vmlinux-std.lds | 1 + arch/m68k/kernel/vmlinux-sun3.lds | 1 + arch/metag/kernel/vmlinux.lds.S | 1 + arch/microblaze/kernel/vmlinux.lds.S | 1 + arch/mips/kernel/vmlinux.lds.S | 1 + arch/mn10300/kernel/vmlinux.lds.S | 1 + arch/nios2/kernel/vmlinux.lds.S | 1 + arch/openrisc/kernel/vmlinux.lds.S | 1 + arch/parisc/kernel/vmlinux.lds.S | 1 + arch/powerpc/kernel/vmlinux.lds.S | 1 + arch/s390/kernel/vmlinux.lds.S | 1 + arch/score/kernel/vmlinux.lds.S | 1 + arch/sh/kernel/vmlinux.lds.S | 1 + arch/sparc/kernel/vmlinux.lds.S | 1 + arch/tile/kernel/entry.S | 2 +- arch/tile/kernel/vmlinux.lds.S | 1 + arch/um/kernel/dyn.lds.S | 1 + arch/um/kernel/uml.lds.S | 1 + arch/unicore32/kernel/vmlinux.lds.S | 1 + arch/x86/kernel/process.c | 4 ++-- arch/x86/kernel/vmlinux.lds.S | 1 + include/asm-generic/vmlinux.lds.h | 6 ++++++ include/linux/cpu.h | 5 +++++ kernel/sched/idle.c | 13 +++++++++++-- lib/nmi_backtrace.c | 16 +++++++++++----- scripts/mod/modpost.c | 4 ++-- scripts/recordmcount.c | 1 + scripts/recordmcount.pl | 1 + 43 files changed, 75 insertions(+), 12 deletions(-) diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index 647b84c15382..cebecfb76fbf 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S @@ -22,6 +22,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) *(.gnu.warning) diff --git a/arch/arc/kernel/vmlinux.lds.S b/arch/arc/kernel/vmlinux.lds.S index 894e696bddaa..65652160cfda 100644 --- a/arch/arc/kernel/vmlinux.lds.S +++ b/arch/arc/kernel/vmlinux.lds.S @@ -97,6 +97,7 @@ SECTIONS _text = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT *(.fixup) diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 8b60fde5ce48..6c13d570e9c9 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -107,6 +107,7 @@ SECTIONS IRQENTRY_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT *(.gnu.warning) diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S index e3928f578891..a5cbecf8a74c 100644 --- a/arch/arm64/kernel/vmlinux.lds.S +++ b/arch/arm64/kernel/vmlinux.lds.S @@ -104,6 +104,7 @@ SECTIONS IRQENTRY_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT HYPERVISOR_TEXT IDMAP_TEXT diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index c164d2cb35c0..b1b60fc438f6 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S @@ -48,11 +48,13 @@ * * Idle the processor (wait for interrupt). */ + .pushsection ".cpuidle.text","ax" ENTRY(cpu_do_idle) dsb sy // WFI may enter a low-power mode wfi ret ENDPROC(cpu_do_idle) + .popsection #ifdef CONFIG_CPU_PM /** diff --git a/arch/avr32/kernel/vmlinux.lds.S b/arch/avr32/kernel/vmlinux.lds.S index a4589176bed5..17f2730eb497 100644 --- a/arch/avr32/kernel/vmlinux.lds.S +++ b/arch/avr32/kernel/vmlinux.lds.S @@ -52,6 +52,7 @@ SECTIONS KPROBES_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) *(.gnu.warning) diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index c9eec84aa258..63a02c342830 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S @@ -33,6 +33,7 @@ SECTIONS #ifndef CONFIG_SCHEDULE_L1 SCHED_TEXT #endif + CPUIDLE_TEXT LOCK_TEXT IRQENTRY_TEXT KPROBES_TEXT diff --git a/arch/c6x/kernel/vmlinux.lds.S b/arch/c6x/kernel/vmlinux.lds.S index 5a6e141d1641..9cabd962ab36 100644 --- a/arch/c6x/kernel/vmlinux.lds.S +++ b/arch/c6x/kernel/vmlinux.lds.S @@ -70,6 +70,7 @@ SECTIONS _stext = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT IRQENTRY_TEXT KPROBES_TEXT diff --git a/arch/cris/kernel/vmlinux.lds.S b/arch/cris/kernel/vmlinux.lds.S index 7552c2557506..979586261520 100644 --- a/arch/cris/kernel/vmlinux.lds.S +++ b/arch/cris/kernel/vmlinux.lds.S @@ -43,6 +43,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) *(.text.__*) diff --git a/arch/frv/kernel/vmlinux.lds.S b/arch/frv/kernel/vmlinux.lds.S index 7e958d829ec9..aa6e573d57da 100644 --- a/arch/frv/kernel/vmlinux.lds.S +++ b/arch/frv/kernel/vmlinux.lds.S @@ -63,6 +63,7 @@ SECTIONS *(.text..tlbmiss) TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT #ifdef CONFIG_DEBUG_INFO INIT_TEXT diff --git a/arch/h8300/kernel/vmlinux.lds.S b/arch/h8300/kernel/vmlinux.lds.S index cb5dfb02c88d..7f11da1b895e 100644 --- a/arch/h8300/kernel/vmlinux.lds.S +++ b/arch/h8300/kernel/vmlinux.lds.S @@ -29,6 +29,7 @@ SECTIONS _stext = . ; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT #if defined(CONFIG_ROMKERNEL) *(.int_redirect) diff --git a/arch/hexagon/kernel/vmlinux.lds.S b/arch/hexagon/kernel/vmlinux.lds.S index 5f268c1071b3..ec87e67feb19 100644 --- a/arch/hexagon/kernel/vmlinux.lds.S +++ b/arch/hexagon/kernel/vmlinux.lds.S @@ -50,6 +50,7 @@ SECTIONS _text = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT *(.fixup) diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index dc506b05ffbd..f89d20c97412 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S @@ -46,6 +46,7 @@ SECTIONS { __end_ivt_text = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT *(.gnu.linkonce.t*) diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index 018e4a711d79..ad1fe56455aa 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S @@ -31,6 +31,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) *(.gnu.warning) diff --git a/arch/m68k/kernel/vmlinux-nommu.lds b/arch/m68k/kernel/vmlinux-nommu.lds index 06a763f49fd3..d2c8abf1c8c4 100644 --- a/arch/m68k/kernel/vmlinux-nommu.lds +++ b/arch/m68k/kernel/vmlinux-nommu.lds @@ -45,6 +45,7 @@ SECTIONS { HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) . = ALIGN(16); diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds index d0993594f558..5b5ce1e4d1ed 100644 --- a/arch/m68k/kernel/vmlinux-std.lds +++ b/arch/m68k/kernel/vmlinux-std.lds @@ -16,6 +16,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) *(.gnu.warning) diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds index 8080469ee6c1..fe5ea1974b16 100644 --- a/arch/m68k/kernel/vmlinux-sun3.lds +++ b/arch/m68k/kernel/vmlinux-sun3.lds @@ -16,6 +16,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) *(.gnu.warning) diff --git a/arch/metag/kernel/vmlinux.lds.S b/arch/metag/kernel/vmlinux.lds.S index e12055e88bfe..9fc48354d519 100644 --- a/arch/metag/kernel/vmlinux.lds.S +++ b/arch/metag/kernel/vmlinux.lds.S @@ -21,6 +21,7 @@ SECTIONS .text : { TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/microblaze/kernel/vmlinux.lds.S b/arch/microblaze/kernel/vmlinux.lds.S index be9488d69734..5913c7863067 100644 --- a/arch/microblaze/kernel/vmlinux.lds.S +++ b/arch/microblaze/kernel/vmlinux.lds.S @@ -33,6 +33,7 @@ SECTIONS { EXIT_TEXT EXIT_CALL SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 0a93e83cd014..e0fc08cb0c89 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -55,6 +55,7 @@ SECTIONS .text : { TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/mn10300/kernel/vmlinux.lds.S b/arch/mn10300/kernel/vmlinux.lds.S index 13c4814c29f8..2d5f1c3f1afb 100644 --- a/arch/mn10300/kernel/vmlinux.lds.S +++ b/arch/mn10300/kernel/vmlinux.lds.S @@ -30,6 +30,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT *(.fixup) diff --git a/arch/nios2/kernel/vmlinux.lds.S b/arch/nios2/kernel/vmlinux.lds.S index 326fab40a9de..340c7ab1d8b0 100644 --- a/arch/nios2/kernel/vmlinux.lds.S +++ b/arch/nios2/kernel/vmlinux.lds.S @@ -37,6 +37,7 @@ SECTIONS .text : { TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT IRQENTRY_TEXT KPROBES_TEXT diff --git a/arch/openrisc/kernel/vmlinux.lds.S b/arch/openrisc/kernel/vmlinux.lds.S index 2d69a853b742..6c3cf834b5d8 100644 --- a/arch/openrisc/kernel/vmlinux.lds.S +++ b/arch/openrisc/kernel/vmlinux.lds.S @@ -47,6 +47,7 @@ SECTIONS _stext = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 308f29081d46..7e53bf44fdd2 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S @@ -69,6 +69,7 @@ SECTIONS .text ALIGN(PAGE_SIZE) : { TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index d41fd0af8980..bf423392b20a 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S @@ -52,6 +52,7 @@ SECTIONS /* careful! __ftr_alt_* sections need to be close to .text */ *(.text .fixup __ftr_alt_* .ref.text) SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 445657fe658c..cbc74fd4a6db 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S @@ -25,6 +25,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/score/kernel/vmlinux.lds.S b/arch/score/kernel/vmlinux.lds.S index 7274b5c4287e..4117890b1db1 100644 --- a/arch/score/kernel/vmlinux.lds.S +++ b/arch/score/kernel/vmlinux.lds.S @@ -40,6 +40,7 @@ SECTIONS _text = .; /* Text and read-only data */ TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT *(.text.*) diff --git a/arch/sh/kernel/vmlinux.lds.S b/arch/sh/kernel/vmlinux.lds.S index db88cbf9eafd..989500c17358 100644 --- a/arch/sh/kernel/vmlinux.lds.S +++ b/arch/sh/kernel/vmlinux.lds.S @@ -36,6 +36,7 @@ SECTIONS TEXT_TEXT EXTRA_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index f1a2f688b28a..93029a4b5299 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S @@ -45,6 +45,7 @@ SECTIONS HEAD_TEXT TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/tile/kernel/entry.S b/arch/tile/kernel/entry.S index 670a3569450f..101de132e363 100644 --- a/arch/tile/kernel/entry.S +++ b/arch/tile/kernel/entry.S @@ -50,7 +50,7 @@ STD_ENTRY(smp_nap) * When interrupted at _cpu_idle_nap, we bump the PC forward 8, and * as a result return to the function that called _cpu_idle(). */ -STD_ENTRY(_cpu_idle) +STD_ENTRY_SECTION(_cpu_idle, .cpuidle.text) movei r1, 1 IRQ_ENABLE_LOAD(r2, r3) mtspr INTERRUPT_CRITICAL_SECTION, r1 diff --git a/arch/tile/kernel/vmlinux.lds.S b/arch/tile/kernel/vmlinux.lds.S index 0e059a0101ea..a92931e8c4f9 100644 --- a/arch/tile/kernel/vmlinux.lds.S +++ b/arch/tile/kernel/vmlinux.lds.S @@ -42,6 +42,7 @@ SECTIONS .text : AT (ADDR(.text) - LOAD_OFFSET) { HEAD_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT IRQENTRY_TEXT diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S index adde088aeeff..4fdbcf958cd5 100644 --- a/arch/um/kernel/dyn.lds.S +++ b/arch/um/kernel/dyn.lds.S @@ -68,6 +68,7 @@ SECTIONS _stext = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) *(.stub .text.* .gnu.linkonce.t.*) diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index 6899195602b7..1840f55ed042 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S @@ -28,6 +28,7 @@ SECTIONS _stext = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) /* .gnu.warning sections are handled specially by elf32.em. */ diff --git a/arch/unicore32/kernel/vmlinux.lds.S b/arch/unicore32/kernel/vmlinux.lds.S index 77e407e49a63..56e788e8ee83 100644 --- a/arch/unicore32/kernel/vmlinux.lds.S +++ b/arch/unicore32/kernel/vmlinux.lds.S @@ -37,6 +37,7 @@ SECTIONS .text : { /* Real text segment */ TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT *(.fixup) diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 9f7c21c22477..d569ae7fde37 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -298,7 +298,7 @@ void arch_cpu_idle(void) /* * We use this if we don't have any better idle routine.. */ -void default_idle(void) +void __cpuidle default_idle(void) { trace_cpu_idle_rcuidle(1, smp_processor_id()); safe_halt(); @@ -413,7 +413,7 @@ static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c) * with interrupts enabled and no flags, which is backwards compatible with the * original MWAIT implementation. */ -static void mwait_idle(void) +static __cpuidle void mwait_idle(void) { if (!current_set_polling_and_test()) { trace_cpu_idle_rcuidle(1, smp_processor_id()); diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 74e4bf11f562..95f80be7632f 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -98,6 +98,7 @@ SECTIONS _stext = .; TEXT_TEXT SCHED_TEXT + CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT ENTRY_TEXT diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index c4bd0e2c173c..18af5199f97c 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -444,6 +444,12 @@ *(.spinlock.text) \ VMLINUX_SYMBOL(__lock_text_end) = .; +#define CPUIDLE_TEXT \ + ALIGN_FUNCTION(); \ + VMLINUX_SYMBOL(__cpuidle_text_start) = .; \ + *(.cpuidle.text) \ + VMLINUX_SYMBOL(__cpuidle_text_end) = .; + #define KPROBES_TEXT \ ALIGN_FUNCTION(); \ VMLINUX_SYMBOL(__kprobes_text_start) = .; \ diff --git a/include/linux/cpu.h b/include/linux/cpu.h index d2ca8c38f9c4..0cbe214e8f4b 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -274,6 +274,11 @@ void cpu_startup_entry(enum cpuhp_state state); void cpu_idle_poll_ctrl(bool enable); +/* Attach to any functions which should be considered cpuidle. */ +#define __cpuidle __attribute__((__section__(".cpuidle.text"))) + +bool cpu_in_idle(unsigned long pc); + void arch_cpu_idle(void); void arch_cpu_idle_prepare(void); void arch_cpu_idle_enter(void); diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index 544a7133cbd1..ffca482beab5 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -15,6 +15,9 @@ #include "sched.h" +/* Linker adds these: start and end of __cpuidle functions */ +extern char __cpuidle_text_start[], __cpuidle_text_end[]; + /** * sched_idle_set_state - Record idle state for the current CPU. * @idle_state: State to record. @@ -52,7 +55,7 @@ static int __init cpu_idle_nopoll_setup(char *__unused) __setup("hlt", cpu_idle_nopoll_setup); #endif -static inline int cpu_idle_poll(void) +static int noinline __cpuidle cpu_idle_poll(void) { rcu_idle_enter(); trace_cpu_idle_rcuidle(0, smp_processor_id()); @@ -83,7 +86,7 @@ void __weak arch_cpu_idle(void) * * To use when the cpuidle framework cannot be used. */ -void default_idle_call(void) +void __cpuidle default_idle_call(void) { if (current_clr_polling_and_test()) { local_irq_enable(); @@ -273,6 +276,12 @@ static void cpu_idle_loop(void) } } +bool cpu_in_idle(unsigned long pc) +{ + return pc >= (unsigned long)__cpuidle_text_start && + pc < (unsigned long)__cpuidle_text_end; +} + void cpu_startup_entry(enum cpuhp_state state) { /* diff --git a/lib/nmi_backtrace.c b/lib/nmi_backtrace.c index 9375c0279b73..ac41f3c84e8d 100644 --- a/lib/nmi_backtrace.c +++ b/lib/nmi_backtrace.c @@ -17,6 +17,7 @@ #include #include #include +#include #ifdef arch_trigger_cpumask_backtrace /* For reliability, we're prepared to waste bits here. */ @@ -160,11 +161,16 @@ bool nmi_cpu_backtrace(struct pt_regs *regs) /* Replace printk to write into the NMI seq */ this_cpu_write(printk_func, nmi_vprintk); - pr_warn("NMI backtrace for cpu %d\n", cpu); - if (regs) - show_regs(regs); - else - dump_stack(); + if (regs != NULL && cpu_in_idle(instruction_pointer(regs))) { + pr_warn("NMI backtrace for cpu %d skipped: idling at pc %#lx\n", + cpu, instruction_pointer(regs)); + } else { + pr_warn("NMI backtrace for cpu %d\n", cpu); + if (regs) + show_regs(regs); + else + dump_stack(); + } this_cpu_write(printk_func, printk_func_save); cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask)); diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 48958d3cec9e..37afd721ec99 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -887,8 +887,8 @@ static void check_section(const char *modname, struct elf_info *elf, #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS #define DATA_SECTIONS ".data", ".data.rel" -#define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \ - ".kprobes.text" +#define TEXT_SECTIONS ".text", ".text.unlikely", \ + ".kprobes.text", ".cpuidle.text" #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \ ".fixup", ".entry.text", ".exception.text", ".text.*", \ ".coldtext" diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c index e167592793a7..9a6ec6ce00b5 100644 --- a/scripts/recordmcount.c +++ b/scripts/recordmcount.c @@ -357,6 +357,7 @@ is_mcounted_section_name(char const *const txtname) strcmp(".spinlock.text", txtname) == 0 || strcmp(".irqentry.text", txtname) == 0 || strcmp(".kprobes.text", txtname) == 0 || + strcmp(".cpuidle.text", txtname) == 0 || strcmp(".text.unlikely", txtname) == 0; } diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index 96e2486a6fc4..29cecf9b504f 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl @@ -135,6 +135,7 @@ my %text_sections = ( ".spinlock.text" => 1, ".irqentry.text" => 1, ".kprobes.text" => 1, + ".cpuidle.text" => 1, ".text.unlikely" => 1, );