Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964818AbcDNSMB (ORCPT ); Thu, 14 Apr 2016 14:12:01 -0400 Received: from mail-db3on0124.outbound.protection.outlook.com ([157.55.234.124]:51934 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756749AbcDNSLg (ORCPT ); Thu, 14 Apr 2016 14:11:36 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=virtuozzo.com; From: Dmitry Safonov To: CC: , , , , , , , <0x7f454c46@gmail.com>, Dmitry Safonov Subject: [PATCH 3/4] x86/intel lbr: down with test_thread_flag(TIF_IA32) Date: Thu, 14 Apr 2016 21:10:13 +0300 Message-ID: <1460657414-12530-4-git-send-email-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.8.0 In-Reply-To: <1460657414-12530-1-git-send-email-dsafonov@virtuozzo.com> References: <1460657414-12530-1-git-send-email-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: HE1PR01CA0003.eurprd01.prod.exchangelabs.com (10.163.2.141) To HE1PR0801MB1308.eurprd08.prod.outlook.com (10.167.247.150) X-MS-Office365-Filtering-Correlation-Id: 2afc3041-33eb-4cd5-91cc-08d364903410 X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1308;2:gFs7h8281pbgIcC0jmqwO0QJVkgs4eIwunS7CgnAGHMVUweg+oq8AXJKJXGBivpF78qRyECt2lHt58juj6K15zRvQmHBD5GCqRxsF4DvHWQjCEUvO9WyN0s9v1hWUOnpYuxaFzDiS2bqCZ/hfK0JRJwQ8Ndx23J7bnzsUU4sujP9fshRWoQt1IGTQZnLAB+O;3:mKSVQ+ub0SqfQHgvamlncEJcH+BHcCTYRg3ojZcJL3f6kKJ/PPU5Ruf979RPEH1vTVDlyQfoY9oucvM4CBzh2t7Qj15fzETupAY7xEVIGiFOasopaUvqvCX5Sw9rmXoN X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1308; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1308;25:D/lMGRCRil5uTsRi01tZ8SO4dYMZoCMKOjKW3oePALgP2TrCDBaVAzER1e3t/utoxOqKBXrPspOp34zbaUG6KO589PHn+y0yrhXMLcMzXAvdVtXAS9ZrC91zItHsGp67FOu6SHPSxvhZtbVYH37lrVnZSS+w2oZlQBd1wUSGcw5s40RCcQ0ISyVqYJbkFn9lKflKftmZX4HKqPA1iiOgpOLMKnHm7S9SF/6EymMt4xXoGKv1BbXCfKyJi7Yu45cT6v/8jgEsPjIbUqJPXqtGfXdAmq5nGIJ36scfzzuOnP3cLA5GXG8mSIM3JfVOLOsonEfQT36toGICrfppuaPDVq3DI7iVLCmEENz9gvcd+Bgxr5HigxYhC2XzqP2YBZn3Mcwvz/1eNihBzibsnhFjzhKmELBVJVz//UWQsUAcdJEFFPO4115k0bEOptpLs5dAPBameYUOStnl/XJbVWBF/0g5FbwconLTui+ZaJHDPI3Chagkk9d6FejrTvtJNKAfJhuFH95B6e54pm2/EBhuELOVwnm6MsGT24yaFBKaNwimqCLXWocyltGCJskq6PYnuWQO1vN79CRS5fTRiKGDlybn5d7SjU2yyRdEPNRxbldFbl8h5MgkjxqcbugkBXb15AkSooCfitxDEV/witZD6Q== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040102)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041046)(6043046);SRVR:HE1PR0801MB1308;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1308; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1308;4:k/ZTin9VRjqT+lKBrHhTlzdBY5dsU88jYD9BkLOMEMmMlbyZZQOIJNkAOXEQ3L8xMY7rP6/4MOHbAeGUXHxMjAZKnhdnIBezBzFbYa4YBR/FwPX7PeCmJo0Bcvjv97GbzxLPMJwAZedefgfsachLfXSFRVgcN8vuVlJCJRr/cjgppmeLe+HLM0fpKQ6RPivr6XUeV9itbjkWfyv5clCbN6MS1fD4B7Qo0CatN90VqSxLapZCPa757vp+ZJC8C+80CZ13sfsyugMp3EacRBv2slM6bRzd1IftOGdyTk0MMAA+05vqVv1xMRdJT0WDVH4Sf92vB0+m3N5Oz2+NFmZZSSqCcNMS8xAOKTcU3zWmbG6wfk8e053CactAdNe5ogCGUzzTjuNF6LVfeg+8FuVFoEeyUVyvngZhs2dqlbUyzLc= X-Forefront-PRVS: 0912297777 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(53416004)(3846002)(586003)(1096002)(50226001)(6116002)(47776003)(66066001)(77096005)(42186005)(4326007)(2950100001)(19580395003)(5004730100002)(81166005)(107886002)(189998001)(110136002)(33646002)(4001430100002)(92566002)(76176999)(5008740100001)(5003940100001)(50466002)(36756003)(86362001)(50986999)(19580405001)(2351001)(48376002)(229853001)(2906002);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1308;H:dsafonov.sw.ru;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR0801MB1308;23:r5AoVcHUw21MS6uBsmwHtF7EVAEZ+s6D1qZhkys?= =?us-ascii?Q?x58RNlJPlvYmaKvFrXY9u/84w1D6K/8erR2yBUzhOIdN5VutcxDho2bgAgLz?= =?us-ascii?Q?EUcHUP2S1ZcSbv4GdDK2ghFOSfi/GlxPyK95d92ibC/1kV7Ic7CywwQIJ/6m?= =?us-ascii?Q?+eu+Bium8T0h+DaAm/ZgPjLu1g58OAQ/n9FjzmK/dneInH9jC0Gmb2fmu75t?= =?us-ascii?Q?xdfKa02pB4SmZGpmKt21R7T+DnAiQSXXZSAPrO2oGblOpbPKw0mUu0elFns3?= =?us-ascii?Q?AB9loxSiSufwxPLI5kkfXipKzWoX+RnS6l1NB4ZExJpi3irTRNOHFzHCGx96?= =?us-ascii?Q?8dLdjj9kqH23v/f9ogbgNnmI/n72pnb04giwHxe74wS0TbAub9HXAJBti7xI?= =?us-ascii?Q?4EwaD5dIC/lpNcqbSPBUBM/L0QYnb9WllZqpzHf/3ZPG5fva86Q45/ar/ClO?= =?us-ascii?Q?Ev0zaGsHzlJ3O5jiaboVHPPQT20OUaOI5B3/9Ch8PM7kF/ONhfxYc+3ScvgU?= =?us-ascii?Q?0rf+B4HwOZoIJI8lDkpkt6uoikPMVx9IVS81n/aBqA/P0ZvLfQjqcnDJgir+?= =?us-ascii?Q?HMB9vVJ6Q/rhwLD8Jn+dqUGwkzFP1CK6qOt5WLhQYxNOZ++h9C2k5AVPiQEN?= =?us-ascii?Q?UoNn+SWRcpiV9d0o8KEVvvDZdPvriqL2PAS0VB+OHmNdiywzY9ZDcwxFdfHV?= =?us-ascii?Q?q3Noke02biHvazR+u6QOnN7YzumCJ1B7UlmOg24mj2XeqeJwZaO96v+93Q7r?= =?us-ascii?Q?uww77Jqiv/BmDHu5cq/sNSWVOfcDKpKbQdFKBfz3c5jia/5Y9SCIxZFjdKRx?= =?us-ascii?Q?k5fIQBtQM/MixYpnTq7PuTdwD1SDKNBS+dz9Wxq5Sg7GQSeJdiBifcFaL3z8?= =?us-ascii?Q?78gSVDxBPUgVlN+/EdqcZzSFg/4BTCaiYjQ3Z3WQRzXhU2rGAa6Rn2BO+y3t?= =?us-ascii?Q?Er12K5jsqq4FbFycDirfD4BlWIL4U50toQkPkgow5fw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1308;5:fyMn9PapcxqHh20nuRVAktaohKlBBQ4G0bRupP9FGtYmtrgxHtnKcdZM0tgt4YdvUqONz7TMwICS6rTBegtQ9Y0SLlrBCF0ePc/4pdptwfd6IwJy9dI+xBMu5pFTaMQ+zJUDcJX1WhZQIMYjF2DfmA==;24:O8/Rqmc0ntt+R7RkmtVvBROOVf8DMun1H2yvoxYxsZ4+8/sYUGyguAOSMZEvVJdk7oGVps+GAaSY/n13M0qHVDLw6WIp29gOU3uePx9Aixw=;20:bzJrn0YMDyJwpLTEHmyNAx2F0SVlcRJ4kLWA5P9W6SmcCVWwEipU/lv4mPdKopHxxM1d5pDalT6CxqYLSWlrcrcY5jWNXps3GBPt1E561yON+7dkbninwFzkGNFml9R0qZwP6PlQNLAez4uvFWBXVaehLVCyotkJxSet5yXNJy0= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Apr 2016 18:11:29.1565 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1308 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3628 Lines: 110 Use user_mode64_bit to check process state. For that pass interrupt register set from irq handler. This should fix opcode decoder misinterpreting ABI for tasks that change their code selector. Signed-off-by: Dmitry Safonov --- arch/x86/events/intel/core.c | 2 +- arch/x86/events/intel/lbr.c | 17 ++++++++++------- arch/x86/events/perf_event.h | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 68fa55b4d42e..df13d1d6dbf6 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -1860,7 +1860,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) loops = 0; again: - intel_pmu_lbr_read(); + intel_pmu_lbr_read(regs); intel_pmu_ack_status(status); if (++loops > 100) { static bool warned = false; diff --git a/arch/x86/events/intel/lbr.c b/arch/x86/events/intel/lbr.c index 6c3b7c1780c9..f1a1dbc77dea 100644 --- a/arch/x86/events/intel/lbr.c +++ b/arch/x86/events/intel/lbr.c @@ -136,7 +136,9 @@ enum { X86_BR_IRQ |\ X86_BR_INT) -static void intel_pmu_lbr_filter(struct cpu_hw_events *cpuc); + +static void +intel_pmu_lbr_filter(struct pt_regs *regs, struct cpu_hw_events *cpuc); /* * We only support LBR implementations that have FREEZE_LBRS_ON_PMI @@ -500,7 +502,7 @@ static void intel_pmu_lbr_read_64(struct cpu_hw_events *cpuc) cpuc->lbr_stack.nr = out; } -void intel_pmu_lbr_read(void) +void intel_pmu_lbr_read(struct pt_regs *regs) { struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); @@ -512,7 +514,7 @@ void intel_pmu_lbr_read(void) else intel_pmu_lbr_read_64(cpuc); - intel_pmu_lbr_filter(cpuc); + intel_pmu_lbr_filter(regs, cpuc); } /* @@ -658,7 +660,8 @@ int intel_pmu_setup_lbr_filter(struct perf_event *event) * decoded (e.g., text page not present), then X86_BR_NONE is * returned. */ -static int branch_type(unsigned long from, unsigned long to, int abort) +static int branch_type(unsigned long from, unsigned long to, int abort, + struct pt_regs *regs) { struct insn insn; void *addr; @@ -724,7 +727,7 @@ static int branch_type(unsigned long from, unsigned long to, int abort) * on 64-bit systems running 32-bit apps */ #ifdef CONFIG_X86_64 - is64 = kernel_ip((unsigned long)addr) || !test_thread_flag(TIF_IA32); + is64 = kernel_ip((unsigned long)addr) || user_64bit_mode(regs); #endif insn_init(&insn, addr, bytes_read, is64); insn_get_opcode(&insn); @@ -830,7 +833,7 @@ static int branch_type(unsigned long from, unsigned long to, int abort) * in PERF_SAMPLE_BRANCH_STACK sample may vary. */ static void -intel_pmu_lbr_filter(struct cpu_hw_events *cpuc) +intel_pmu_lbr_filter(struct pt_regs *regs, struct cpu_hw_events *cpuc) { u64 from, to; int br_sel = cpuc->br_sel; @@ -846,7 +849,7 @@ intel_pmu_lbr_filter(struct cpu_hw_events *cpuc) from = cpuc->lbr_entries[i].from; to = cpuc->lbr_entries[i].to; - type = branch_type(from, to, cpuc->lbr_entries[i].abort); + type = branch_type(from, to, cpuc->lbr_entries[i].abort, regs); if (type != X86_BR_NONE && (br_sel & X86_BR_ANYTX)) { if (cpuc->lbr_entries[i].in_tx) type |= X86_BR_IN_TX; diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index ad4dc7ffffb5..da1ec8240097 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h @@ -899,7 +899,7 @@ void intel_pmu_lbr_enable_all(bool pmi); void intel_pmu_lbr_disable_all(void); -void intel_pmu_lbr_read(void); +void intel_pmu_lbr_read(struct pt_regs *regs); void intel_pmu_lbr_init_core(void); -- 2.8.0