From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753045AbcGDHez (ORCPT ); Mon, 4 Jul 2016 03:34:55 -0400 Received: from mail-sn1nam01on0055.outbound.protection.outlook.com ([104.47.32.55]:23136 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750946AbcGDHex (ORCPT ); Mon, 4 Jul 2016 03:34:53 -0400 X-Greylist: delayed 921 seconds by postgrey-1.27 at vger.kernel.org; Mon, 04 Jul 2016 03:34:53 EDT Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; Date: Mon, 4 Jul 2016 10:19:06 +0300 From: Yury Norov To: Madhavan Srinivasan CC: , , "Peter Zijlstra" , Ingo Molnar , "Arnaldo Carvalho de Melo" , Alexander Shishkin , Jiri Olsa , "Michael Ellerman" Subject: Re: [PATCH] perf/core: Fix the mask in perf_output_sample_regs Message-ID: <20160704071906.GA9901@yury-N73SV> References: <1467568918-24377-1-git-send-email-maddy@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1467568918-24377-1-git-send-email-maddy@linux.vnet.ibm.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Originating-IP: [95.143.213.121] X-ClientProxiedBy: VI1PR0901CA0075.eurprd09.prod.outlook.com (10.167.203.171) To SN1PR07MB2254.namprd07.prod.outlook.com (10.164.47.148) X-MS-Office365-Filtering-Correlation-Id: c4333747-278e-4a01-295d-08d3a3db825f X-Microsoft-Exchange-Diagnostics: 1;SN1PR07MB2254;2:xOtQYL2iNjLZcq4bi1dZmbvW+UqkyJHYroEEHCoxjnmsfE/MMZU/K4I2zVNLxeh9DgT5+vo4wsruBTjtZsuNrkF5z8N6tApZaZFx/C+m+Qcqmu1+bv4i0x6eQ5vR4ijJ2Z2gTlnN9RdKqYLb2tk01yWNCYRrI74M4dOpx+skGSxV/vbqgeRtQlVtiwXXwKqI;3:A4D3M4fs407SZVhV/zsmhiGaWLHNxZVSG0ZWtOw3Z4MgklCB1iCeZPYV29cGUt4a8zXIheRuQcfP7X38KYOz19c/E4rkd3txTvIIhzKgEglm45b1gA+VclJqGzqKCrOS X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR07MB2254; X-Microsoft-Exchange-Diagnostics: 1;SN1PR07MB2254;25:roQWi8uOs1D2GqZXXig5MyXph7H63jj8ewwcH5R5fBxrjePULUJnQ/rpfgvk2LgSDUKhd1knKgquA8ErMs8dvuZZZsREL6gB7Ybdj4bftfob2fLs7FCTRgtXYf999L7QFv+H6rWJJTUYNG34e+zWPRd/gXBPvG19uLfas2/P9e+hQ1cV/aHYjBtRjMl/Pss5BPQp4cHPGh1ciL34ohk2zukmWgekSC3+aCbWjpIoJHkPxzaE0bAa60FAq4LZSfXo6tX45V+1LPXLzRwVFbtlNmHxWEYE8D8VnjV111mHo77p+SrVCyr2x795tZIHVVWnyA0CCOhqagR9qTTTryveAM/TD+0VAVVkF4GfGecI8OLW52SHiJObhwIT/qFU2nS5SjpT/9hctkBJF0bFtQK2Cz4iTKHkfVtbT+S8qntAQvZ3Vla4fJEYzU/Lr1ry9tdtavSJ5CdExMhELGLRatlDrXaVxt5QVTqBvfwM2Sx8J+ySp1pVv2svrEwg+cDL2AN2VpDOEklzg2w2/YNF7II7JZO2roQ3DUykKL4sUHExLVjv386gytgLNzVGuRyCaihvTAj+v1KHG0VePgkV5F4ADQlPB+Ivk+HkyWN+So5tJGsvtTeQ42xbAKxv5bp1Q+rcqQiZpSNlyqzosDUi2sHOVFBsqs0+ALDH2158x/KodyEGqG0tbq/TSIBuPF/gH8yqR0zFWU5fvaQlImRsaK8cfAC/mI3JyPUMD4VY6kGhWNc=;31:mvS8eyd6eYMi7REyulYnzu0eDv1rhUcHy06X3y2kuNq6ZqOEKKoeIszu0s1BPcEgF/1oWcDWyjogFZJMD4HLk84iA1xWnX4bXDcuopg3o/+iVRTnVuvuhkYxBgmeFdnqeJTKOg/hikW8tJUSG9mZ5bzVurfC4ndBp6YqcQY8F3PCV37+RRHG2uqQ5mtKSMUMwxaeSx1BQDTSoXkJzhuUWw== X-Microsoft-Exchange-Diagnostics: 1;SN1PR07MB2254;20:7ZxKd1J2gxxIzjwTRxo7c7knP1xFLWolwa82VRaOlS0n00TKetiZWGF1yTCRN3tR02yT5xAoouua7YX06Oxe1134Tqjvs/6mUjJ1H2xP9hZCeZzT9Itt/E44BZbTZ+UKYRcr8WyyijLSxYXZWkY+NJ8IfedXkbNsP2HfjUXDTe2GCgTtuEAz5apQwky2/A5VIVyiNM6+NsoRFaF1qWLP/Q2LjS3WXVolKMmvzMX2k1tNY+E76xIqrblS08tMJSkMJcPrG1jfwLZzCI/rmZcASfWmF5IGaH93h4bEt8jQmL9eN98s0Sy+vi+X+0obxDLsMcB82p+CO3euqvVI/l/95n3P3LguvYl3ZtXRdPJpbHNqbv9lbMS3TBKHISE1CyurCa2xz0QQVYGPJOt33SKp/Gcy72a3KvnrrO2HoqxO1AoVdIO+vCa4x2TUIj9ClIivHg+ea+r7nI9myYvc/y84Pn73aN5/lmMqxG7bMrDpIFY7payCe6ElM1c+hqWAywzEuk6bfOepDgb6pkyU6bmCvfpJ9i9mAtlNu6KOJPH+iWK3oe98r5+MAMi89JYCn9jEludFgxLn/Zo6+0RSH3u6/IYUbmv9FvE6av+OTAOK+6w= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(104084551191319)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001);SRVR:SN1PR07MB2254;BCL:0;PCL:0;RULEID:;SRVR:SN1PR07MB2254; X-Microsoft-Exchange-Diagnostics: 1;SN1PR07MB2254;4:LkfsqwMq9JuviQVDfFjHRkN4IjNRtN9YmCC7ntHy5LW3hs+AWbY/Ddyo5KNCPxK8TwUSjPd/jA5WxIploe/21tNCMlQsTgmIJ4o0oPLZJuLGZkkrTNkoFnBZ6V46wDHAZREWdyK9/gXnaaNEAKFwmjhKpirMpzQ+KTzOHD6LCwr+uqXghwAxJhlZnOaxi2rHgjK3nq0WdQEjWQI5CPfP6+mZjAcYwF3l/veJEzZeEmplvJ85w8q2gZYX1Ct45vwzlOGFZpJIeQ2DOyIukNVixmB3yOjNxcP5aA09TWGSyj3iXNKXgCJw4xBZUPLwQESWFASwJKeMz32i5gCkPw2DgNw67iTy6QHKy7mJ1h3AfiBeFQrCVxCha3RAKTWyYWrWcWHwIolqCjNH3r5fgrrb+f21hfeaB7z/OzPNs3VYVvtyBD5VVQTGCjH+vSsTFzVj X-Forefront-PRVS: 0993689CD1 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(24454002)(189002)(199003)(47776003)(9686002)(68736007)(2950100001)(586003)(33656002)(105586002)(2906002)(92566002)(575784001)(66066001)(6116002)(46406003)(23726003)(1076002)(3846002)(50986999)(106356001)(97756001)(76176999)(42186005)(76506005)(54356999)(81156014)(81166006)(4326007)(77096005)(19580395003)(19580405001)(7736002)(83506001)(8676002)(33716001)(110136002)(305945005)(50466002)(4001350100001)(189998001)(101416001)(97736004)(7846002)(18370500001);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR07MB2254;H:localhost;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR07MB2254;23:ftV3RlWEdbbmgyfqeoBwUtLixIUcKP62ed4CzY2KQ?= =?us-ascii?Q?2RPiHQZ0/rC2pt2t4E5xZIEawRTx068ySlOng0Ts6kU808+JmFCVTMwOhFkU?= =?us-ascii?Q?vgTZrBWxY++ziQhm3/zbQt0zaFMFlBDneEV3oELj9U2jVL2tCeUDDCh4ZDEJ?= =?us-ascii?Q?2FFllRT4uLS2nv3JRFbrJZrnB65PsyDY6+ZOGDNcRDgn9ZwaMfVTsANbMbS0?= =?us-ascii?Q?0sMTT2LWzbgBs3w0MD/THF/uUoLw9NlNZ/Of6Z7+aRB1OB7lls1/Zjqfy0Tt?= =?us-ascii?Q?Pyn1Ng45l7MRDR2G/vJYCuVB2VGQWo5e5NJjRh8E9d2regz+IF2RFy7L3fZV?= =?us-ascii?Q?SnjKHyVXkJqqcg07vdRcp/oZfh5XuqdVw6rLNqcegRG5gOSGYCtoiYfm0yGa?= =?us-ascii?Q?xsaB8OeLOzrgzkguCOAXSNboRLsRQKrpj4dmRLMd5TdmtIA8EAUYyidVSaJB?= =?us-ascii?Q?abAg1NDU/u2sftzwGK7RQyyn8ebLmm2+S14ZOM+Tkf6zR5chTlJKW4RWDCdI?= =?us-ascii?Q?dHXTYuTKp2yKvHNYfOBJTdHmqewPjaqaVuw6mkOQZYni8+1Xd+nd2XYFPfHB?= =?us-ascii?Q?ILw2gd9wxLtQiX3xtjnxDZt285IUiyoxd7s0Vf4ENhg7tPPmSraktmGx7GkD?= =?us-ascii?Q?r3O95as0Xb5ucVrVBFLZE4qa8t5DWFzoIn7P5/aN1rAM6oeM14VtiB5QcS4l?= =?us-ascii?Q?wZS3T+YaVgLAVwEUuLh1ttrXkw8Mx2xBWliWJ7K1hiyVJKRef3x4Pz8NjOPf?= =?us-ascii?Q?yWJK3FduoAu90xCpEmN8Yfyuh0U0sjXXuWjIR/5gXljpALuWoABwKkwgQ+fm?= =?us-ascii?Q?0N296LGefyQ9HC1fDO1YKnxEmIHv0wgsgLKBaqBodoEhHbknw1FxtS2WNb03?= =?us-ascii?Q?uxuM1DblFEHOdQiZSlGEPswVQH2grNX9eT222960c+DPHQQhFzQ1EXN6TF1A?= =?us-ascii?Q?wqBmrGAHbEtJnmJ4esVHoJeIplMiYT0CydoGX//N1M+OrWKqhNPKyTh+37U2?= =?us-ascii?Q?8T530zU4q0rD8c4BItJxXwgeYqkvzyfrtjT6YqnKLcy5REuFCXb493nFuUwb?= =?us-ascii?Q?lTjB4D8bedfBEzIkYDLHlAztqq+P7ZZNDbQDZVjCBLWFBHd2KgHjmPzcILOo?= =?us-ascii?Q?C2/XcyboUlATAhLPqlhfZtIR8Mc0FZyhC9jnUgb9EDEm/zM6n9mdmnSNn/Gz?= =?us-ascii?Q?yBsA/3aMELyhqGTV+dL/zKyinokMLI2JJsj62j/Yw7Pq+Ho3ljulzoaAg=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR07MB2254;6:sYg2NaO4+fermaz9TyyXknyfjW8zyS4RDUyiVwyaiCrU+QkmdeNaUeQSb2wH9H4DUJQEty/I7oHPjgzBD3Ykpv7thVUjG76HnIcwJgKU0EzIzjMxjPT2mmXBOfgUqORMBK/cS3dYUNZwHdTpRumE5qxsoE4PWA1yf0Vlk3SEeRc591OSk0Zn1xu9RVOpT59c1/SeWlz5n31QYaJRrNTP3TcZIbJyBUA8p2x2JjBsY3NlwW6MGx4pmG2mXHJgRty+Px3dNu3i78mgWEuEwjXPn7RHF+8YJ8CGnTh62gpVr0Y=;5:5OQAzzjU7xGE36yWcPD9qSLP6KZZTI+6eiDkcrxc8OBaC/6FTDjoWewLGT7tDUyl8zgdiURFFjuGA9H7yQx8oq2wMwYsHoGHp0c+GqfDPb+UaJwx52OWouy+kkNozpRDub0Cymzx2oDebDQWAGmWcA==;24:BNdERvk0HCXrqnMtBtg2lCcPKNoqFDuI0CJHdqSqrp44f6CYUutlupLPK+LBI2DYHOkSg/m76qI8hZBrLQ2TOX28oknkjcnuoY8h+1RgUUg=;7:pYA0u5c09YHjtgZdLb0zyIQzFyRB8mCnGgOVFvZlSJmc5oNjSkeQxRjelMipuSAFUwgfJrbZQr5oBnDBA0GQLxTlTVSAvW3wqKanid5Ys9/BiXkv0gGZqU02Yn5mYKsa4M34Sifz9Ap3i+zJgXF8uDszWgddE/dZyXwF503dDojptbSqdy2XpLnmmpJegcyvNZaeLEGAiFm3tinpRHlMfgSfgqv86C94nb4wgqfJIn1742wc5seeRUp5u6N2AUpx SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jul 2016 07:19:16.5578 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR07MB2254 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Jul 03, 2016 at 11:31:58PM +0530, Madhavan Srinivasan wrote: > When decoding the perf_regs mask in perf_output_sample_regs(), > we loop through the mask using find_first_bit and find_next_bit functions. > While the exisitng code works fine in most of the case, > the logic is broken for 32bit kernel (Big Endian). > When reading u64 mask using (u32 *)(&val)[0], find_*_bit() assumes it gets > lower 32bits of u64 but instead gets upper 32bits which is wrong. > Proposed fix is to swap the words of the u64 to handle this case. > This is _not_ endianness swap. In fact, it's broken for 32-bit LE as well if mask is zero and next word on stack is not zero. The rest is OK. Reviewed-by: Yury Norov > > Suggested-by: Yury Norov > Cc: Yury Norov > Cc: Peter Zijlstra > Cc: Ingo Molnar > Cc: Arnaldo Carvalho de Melo > Cc: Alexander Shishkin > Cc: Jiri Olsa > Cc: Michael Ellerman > Signed-off-by: Madhavan Srinivasan > --- > include/linux/bitmap.h | 2 ++ > kernel/events/core.c | 4 +++- > lib/bitmap.c | 19 +++++++++++++++++++ > 3 files changed, 24 insertions(+), 1 deletion(-) > > diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h > index e9b0b9ab07e5..d95b422db183 100644 > --- a/include/linux/bitmap.h > +++ b/include/linux/bitmap.h > @@ -188,6 +188,8 @@ extern int bitmap_print_to_pagebuf(bool list, char *buf, > #define small_const_nbits(nbits) \ > (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG) > > +extern void bitmap_from_u64(unsigned long *dst, u64 mask); > + > static inline void bitmap_zero(unsigned long *dst, unsigned int nbits) > { > if (small_const_nbits(nbits)) > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 9c51ec3f0f44..613fec95ea4c 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -5205,8 +5205,10 @@ perf_output_sample_regs(struct perf_output_handle *handle, > struct pt_regs *regs, u64 mask) > { > int bit; > + DECLARE_BITMAP(_mask, 64); > > - for_each_set_bit(bit, (const unsigned long *) &mask, > + bitmap_from_u64(_mask, mask); > + for_each_set_bit(bit, _mask, > sizeof(mask) * BITS_PER_BYTE) { > u64 val; > > diff --git a/lib/bitmap.c b/lib/bitmap.c > index c66da508cbf7..522f1b4c6078 100644 > --- a/lib/bitmap.c > +++ b/lib/bitmap.c > @@ -1170,3 +1170,22 @@ void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int n > } > EXPORT_SYMBOL(bitmap_copy_le); > #endif > + > +/* > + * bitmap_from_u64 - Check and swap words within u64. > + * @mask: source bitmap > + * @dst: destination bitmap > + * > + * In 32bit Big Endian kernel, when using (u32 *)(&val)[*] > + * to read u64 mask, we will get wrong word. > + * That is "(u32 *)(&val)[0]" gets upper 32 bits, > + * but expected could be lower 32bits of u64. > + */ > +void bitmap_from_u64(unsigned long *dst, u64 mask) > +{ > + dst[0] = mask & ULONG_MAX; > + > + if (sizeof(mask) > sizeof(unsigned long)) > + dst[1] = mask >> 32; > +} > +EXPORT_SYMBOL(bitmap_from_u64); > -- > 1.9.1