Received: by 10.223.164.202 with SMTP id h10csp5655604wrb; Tue, 21 Nov 2017 13:21:41 -0800 (PST) X-Google-Smtp-Source: AGs4zMbfY1K8uo+XMkmloPJHPZdkchnrHOJJWBKHwDyGZG6VEIfLrVOKNqSlXcFkMEVCch7IGH52 X-Received: by 10.84.242.131 with SMTP id d3mr18810194pll.269.1511299301383; Tue, 21 Nov 2017 13:21:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511299301; cv=none; d=google.com; s=arc-20160816; b=A7lfuMHQAdFsNeHVyXwFcQH3BoPN3r4EPAvazdKexksymmmgt6zulG6XdtvJAEhQY2 uwYa8NRwLgdqaQ7a0wwP1qyLjvSWQvBQfSUn39uSYL5dMMhVXZ2gUNj8BwFVAUMnbBw7 7xkeyNTI+UQdtqUKmxYEkpp6K0tThmo/2y+mLXlz2PtBXoC9pADtppeFgt0/DLM80kbQ DrSzWaNCgLS2+F36cSMdLyZMbIMWRGXQ4PPOfAr5AErAMfpyM2548xmWgjfctAhP7NvS HqP/F5lYkLmjD0sxYweuQYsYwBBwUMdB5W4az/5IZwgkvVmZ7ktPMkx8ZbkZ7ceYwTWL 860A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:spamdiagnosticmetadata :spamdiagnosticoutput:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature:arc-authentication-results; bh=NsTY3soQSLfPaCqPmSHF00OyHhSNEC9eaccR9+ylPOM=; b=TvCNZ40opRPxrRsIjMt2xwary+qwuih7WUliZsHXDpNUct/IEUJPfEC5g6BKM6hyTq kuOmWIAvG9JkKi9gNww4KN+aTiI76WGDisJGXZQ2Hdiuh6a2FyxvdZnqGKM6HISF0JPk HJGU5CkCPs5d+gnIqGpmXeZwJooO+haSxGoZOCIEElATJxLyujCP7+dNr/NhVf2IhEoA RnHmVZSjzVbqDAoSYrvk4Ljjn5V+sjJx9W2j7rK6hsDtstoKN05v8MxR9Kh3nOAUk+mi 8Q3cpG6CU6PnKAZCELkEs7sXok5LG/23ABbeSwMAiWL5H5iIzKttEqCRK1hgOYDdiDpj 9OoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@CAVIUMNETWORKS.onmicrosoft.com header.s=selector1-cavium-com header.b=oKBWbH5O; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h11si11625457plt.640.2017.11.21.13.21.30; Tue, 21 Nov 2017 13:21:41 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@CAVIUMNETWORKS.onmicrosoft.com header.s=selector1-cavium-com header.b=oKBWbH5O; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751518AbdKUVUb (ORCPT + 76 others); Tue, 21 Nov 2017 16:20:31 -0500 Received: from mail-sn1nam01on0061.outbound.protection.outlook.com ([104.47.32.61]:2706 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751263AbdKUVU3 (ORCPT ); Tue, 21 Nov 2017 16:20:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=NsTY3soQSLfPaCqPmSHF00OyHhSNEC9eaccR9+ylPOM=; b=oKBWbH5OhTAsTc1iPDQynrmHypsnNbtzItnrGVnOzO/KqpPYSlea72VTOPnBaKRwAK2Um7e43P2qfmTAIUaYheXYVpXtzOX1kUCzIQxfAF9BKpVvtqwnJQoSyCn8wPRymV/jqyMjQekE9hAAVXdE4Lo7NiAYwbGHVJXfGonPDoU= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@cavium.com; Received: from localhost (50.233.148.156) by DM5PR0701MB3829.namprd07.prod.outlook.com (2603:10b6:4:7f::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.239.5; Tue, 21 Nov 2017 21:20:25 +0000 Date: Wed, 22 Nov 2017 00:20:11 +0300 From: Yury Norov To: Matthew Wilcox Cc: "linux-kernel@vger.kernel.org" , Andrew Morton , Ben Hutchings , David Decotigny , "David S . Miller" , Rasmus Villemoes , Geert Uytterhoeven Subject: Re: [PATCH RFC] lib: simplify bitmap_from_u32array API Message-ID: <20171121212011.ddng22pxws2ut6ao@yury-thinkpad> References: <20171115174056.26537-1-ynorov@caviumnetworks.com> <20171121211548.xhnkdys567l6jdtr@yury-thinkpad> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20171121211548.xhnkdys567l6jdtr@yury-thinkpad> User-Agent: NeoMutt/20170113 (1.7.2) X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: HE1PR0102CA0016.eurprd01.prod.exchangelabs.com (2603:10a6:7:14::29) To DM5PR0701MB3829.namprd07.prod.outlook.com (2603:10b6:4:7f::27) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8d565193-4aa1-4822-61f5-08d53125af50 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603258);SRVR:DM5PR0701MB3829; X-Microsoft-Exchange-Diagnostics: 1;DM5PR0701MB3829;3:dc0IYWL6vBnwnaS6UPhshFn9ZTiRbDfJxvaFsCbndKPOu+4jyJ/YttSfztNiWaa04Nv7bqL5Sh02VJICnYE/yfPwoDli0IvJwa5AMPww6s2GGuY3wuhEHGclaJz+K0qi009C/X9GmfCx2/3NR5NWzD5Fzt9JWJXYcfeRHM9eWyCcgivGxq+5pMRcWHPZZTJYhyXTEdlq15Ukx6gC+s8/rQV69VequiniYOeqcsbaZ7SO8mKFod0tEmx0loWYCj+j;25:scnM7Kabc53l1S8cSZGMPdsTk5b7UhDlVOVzzEWtf3UiG+G5/WpHSSZNMbcWorTeqQM8DlEvXrxuHIR27s99ygY/W4sM9omgIK8JvYjDsoV03TMX59UpB6p7o8smGI0UXnopDr2gk/TFrFcK5l+Qv+oCA7CTsyUY1lgiJlyCkPE6Zr9KtKKE7jrR1N07F8+6sMAH8fjM9QDt8OBc5JBPtARKZ6KQBVyz2ryvEDEyoqCT/mCadoSP7DrlD7VU9AE0h2dsQU3d7NdNIo0Um1KlkJLza5B5pD2degHItg1X1lnoh3XOCLHZHp7ddQyxoJGXsaNlmw7sm8ecNnc9UTfJ/w==;31:AP6wj3YQmfwN9QbQaCbKNqRHbVFG6oewYbb0y938NYSF0T+t5e9rcwaV7HM5GourjRh1hUT1yZH1bGrMt7jGa7hhVoEiKNp24/62hJdFwzzwTKJ0DLSRN6y0+eGBJAdTKCovBbvTrO9o3PP+q/U31aVx1kXe+ilmQPjAKDuEK9vM4o3xpIBvTw4J01iGNwAx6xaJjFLEcRDtYwKXcA2CqIQ4BSjMK3eot++Rmlh0uRw= X-MS-TrafficTypeDiagnostic: DM5PR0701MB3829: X-Microsoft-Exchange-Diagnostics: 1;DM5PR0701MB3829;20:mmCDOTopcSoko8qcxCcrV10TWZL0nPBLHXCjgec35re85KDzqdcrjhD9NszEhfyP9YfvrpXrYXnpRPB9R3ZL3ygh30Qz9uqbjZRnvtJIWCt1tz+jIO4YSGKfq3/deFokb7S6soKhWgiKKdNaMLG6Sw1MlGag1FEcerGcDlvFVyJ69aasXEn3hCS4VxLm4SZXyf7rm+KuRui99HTqg9k7UcGa521kCFK40q17ItZs9t53y71GjTSLn3l2suIbddf9fp5uwnCaeLlyZxDAsG6/4Fi9LaZ5i4DiUkF9dbEBbqO5dukUfXrtNm0bumIf6GIPG1phMRmmiO/2xGpy7oiuky12T9d1AegVXICRkrHNXDZRaWOYkJ1comhyhWIWx2d8cQW6+Q7+M89LL4Yrdyp2GlwZWAnueeTagLaCMaA5nJ6bjvmwAHhAJIJhMrbzZhqqMTJtFJKY2MlEk0UD+II/eIQ58oBqKzAT/g21Tu+IJNgHvkJnUOLQqjweRoR6cWleno2EYsS4BrNSJaF+g0DaPDG4wkG3bF3iPWRiEYqROPmEyag56Trs2q6Air0XciWqNswVkcY0GFN+DpLZyxijr6B/rW3mXmScXHUJ34cYk2E=;4:YjvKUZubgrWvEVZtzoz/9YAg5TV4IZhCM2+QUa7HeQf2AGBvmAJ2YnJD5NAPwoOdYSOzmo+8zaIMdR6DqfDXTFi9XZ7n/+Fnyc43FpYTnVw7wmJWLWhj/wcGPGVGrNNRatxWDECLmIXXcxEmOWwREo//N8RbQ4TK/hGYyZQ/2ZtCsMKSzmf3l7uhg6s7dXoNXtJcLDQcntX/4I4TVvADJMGAajy6U/hM/qPj5dUGEMSDDf398a1CfsYe3RBcdQbXVoxVPsHrkgamq/eomUxhVjAZsGeDiSOjFWOa0ErC537kyr9C3D1eslrRs5Pi15Wm X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(93006095)(3231022)(10201501046)(3002001)(6041248)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123558100)(20161123562025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:DM5PR0701MB3829;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:DM5PR0701MB3829; X-Forefront-PRVS: 049897979A X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(6069001)(7916004)(346002)(376002)(199003)(189002)(83506002)(1511001)(47776003)(101416001)(2906002)(229853002)(50466002)(50986999)(42882006)(33716001)(16526018)(316002)(66066001)(2950100002)(6666003)(54906003)(16586007)(54356999)(6496006)(58126008)(15760500003)(6916009)(4326008)(76176999)(5660300001)(33646002)(81156014)(81166006)(68736007)(8676002)(2421001)(105586002)(8666007)(6486002)(6116002)(7736002)(106356001)(3846002)(23726003)(9686003)(6246003)(97736004)(53936002)(189998001)(575784001)(305945005)(8936002)(1076002)(72206003)(53546010)(25786009)(478600001)(2561002)(76506005);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR0701MB3829;H:localhost;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM5PR0701MB3829;23:fQgWFSMWQ0O0uFwoJRoHSkMXoMBb196dcMSa04O?= =?us-ascii?Q?rK8hzVdOBIioHAYkYTtruvkSg2QpzS3sN6v9acuARH3GDTpoawHUUkU270g4?= =?us-ascii?Q?vcxhEJ47fe0ENI6dejJUfJ8YXdYb0417XnX6frV4F6zTeNOBCIgeCE3phPET?= =?us-ascii?Q?nOrKeLFx9u0d054HR4pzSAu+cbrEwX4XcW1YGWSnS2Xy1VIaQqAvO/HJXkpc?= =?us-ascii?Q?I/0hGEd15ToE5z7UYE+oDXONV3hnbqv/hZLNKqOT9VrtpaouTf2xLxJLzEVO?= =?us-ascii?Q?VzH+YKQEvgNOmPuKXlM0CE2gIqSB5+3spWMDhFttg+NDnCqX/Lzp9JSFHDix?= =?us-ascii?Q?zd1wNebFnsJuuSrW+Oz4Q/nRUaGg6+T0eu0BIPyPMPT4tCu/2OnIBlu4dBKa?= =?us-ascii?Q?zfbV8k2Lsq6P1N5A2tJkBhvthLNI2IOki9fQpeVICMraEFxNYpG1goWhteqU?= =?us-ascii?Q?3YeJpklAS4R/ugAfRpD5bkIfs9D19NDW3jir70cn1Wa77/41dSSnL0MNFWM6?= =?us-ascii?Q?plFYyg5a3uX5474DMHSFhnmliaq9m3RAEYtGS9JmvDb3PiH5D6jpqvOQfzkk?= =?us-ascii?Q?v7muy6aweGD0Qsvia8lBTmeRvcIURrpBBvKxL8haKK2yUBqXTiUQsuWKn8Lb?= =?us-ascii?Q?u+w6UouYNfjPa5Q6ADLNM5MHjMmjh74qizS6tx9stDXN83+udi4Kiv/CdVRz?= =?us-ascii?Q?uIlUeqyfZqvNz4PylMTg3W+lg+3S0exOWWKv7UCSZmiH7C6ll0/hRUhjcI4K?= =?us-ascii?Q?LsC5Ctdw3QnWo+cjWbU8Lpo7AFjD4Hr/fyITLgXhSax5s4fktS0Fy6AeSCqe?= =?us-ascii?Q?dWYrB7l2ZcCJXMjSPf1dfghGXeBcbE94E3P1WgxmG2WtV4iVjEXSuolXYM0a?= =?us-ascii?Q?V9MYP9WnNf1CU2YGV25Zx0bS0p7niMShOentagNkFZUr9cWE9rxML5l9gcoG?= =?us-ascii?Q?/MvHdoyAnGrx4Jq9Bloqw+NPsDXdoHHu5HFrlHJ2wav4tkS9byKwqgEXaUnh?= =?us-ascii?Q?PNSy0rl0MVtKtqxVTkMPEngM87EIAGggHNXPv5x91v17XEysplz52/5evblL?= =?us-ascii?Q?7MQazJbRmDapkUdUO6e/kWQqI5Zm5A2JceKfmA99c4ioWNGvyANdJXVmg7nz?= =?us-ascii?Q?OHl3qO55UcsRQ31v1uaKx9Gu5badWDH7CIcaz5W5hin8o0XYV9VdwBbIoI+5?= =?us-ascii?Q?vo14tLFmYtx/eSmVwT3Dwkh6iUiyzC/vqLxYgI1POL8hNoQLvKM+9X3tLZKI?= =?us-ascii?Q?1nM+EAfkv+sXB1Jc0XT6Mybu+j3OmGlrsNJ7QABsvzg3wQW+ccL32RnLeHPs?= =?us-ascii?Q?PoEhXufEP4tKCwxIV1p0AbvLzmq4AuUj/ZfGzzQCIZCuQUQ6tWIua5SzbhAL?= =?us-ascii?Q?YYJNmDfcNCRfZLGgs1fk4k2frSsY=3D?= X-Microsoft-Exchange-Diagnostics: 1;DM5PR0701MB3829;6:Y11kI2Bin/J2zpn47zv49aMT8WtAu2aDgOi0q3dyLWt0p4n8E0N6aRBqV0PRgaQSbte0TI+amORVHs510EQOBcnTiKIFJU6FDxOygefXTcSw49ufHdrdOZGm9kfgNLDzgkwUfhR48qTTRxweYPFUNFP9x2KZN4gkMU7xhz0p8PGAlDqhBVH8Br4ApIp0I0gGJcXct3Sysr4vW3gRh0Hw7lPWZuy/tvWoRNifcNqvEKrRYVGUE4BkdjO/lNknR1ZandhsLy4ofJXZfGd7QVo82DOdyxtazoPCitlxtQZkDA1/TBVXFkfZqlzDIbQFqYz/ebmEgNzTVBtJrAZmIsg8AHG1Ay7Op1t2nTFtFWqNfvU=;5:Ky6XYsUF4YDIQ+TzvnYkGyUvpQdovX8ZCZsPikRBcxSUZ0FWW7kL9xV9l7QC9rmAIFFN/6CYJs4MSHVrXttkFzS/JMwbR+4UspWosqYprsiHeF+eeQgJYtqq+xpeb2vgDONeUH8Oe5Vg4AqNh0xRtO7HMChpD6ZUbwNINibM0cU=;24:3W4CkwhKP5k/9W9JLrjZxpcsGkcDKxJY+AkkkDFPQ5dKk3PJjEq+T6uxDJ87HuPfsovgzDe+cgjyHhXjGx+Ay7Z2D6FN9VXcKxrxgHXxxnw=;7:F+yNuw5fO3KchN5BByjmwODpFq/L+u2JbQ10CTdBEiMMyrQMsRePBYO882B1qmaecxkirnZN+Dn8gUbEcvCAhi/LZZtyC7EHZCQ6xUSIJQP4hZ34K39UJ/GTItYIvRygcCFyKAo4bxoklKNPXFljP0dBHNq2p5b4ULKIRCYZT2YSarRQvL7bEEHAln9yqvUkdhBCzgQu6hjHyb2rsk0EBzvPzhJOweD7a42bxTNeyDRw1/EQq3510mXeVKBxgt7e SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Nov 2017 21:20:25.2781 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8d565193-4aa1-4822-61f5-08d53125af50 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR0701MB3829 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org >From 1a922d271d2ad05265871bbbd68d0414fa5ae49e Mon Sep 17 00:00:00 2001 From: Yury Norov Date: Tue, 21 Nov 2017 23:22:15 +0300 Subject: [PATCH 2/2] bitmap: replace bitmap_{from,to}_u32array with bitmap_{from,to}_arr32 over the kernel. Additionally to it: * __check_eq_bitmap() now takes single nbits argument. Is it even possible to compare bitmaps with different length? * __check_eq_u32_array is not used in new test but may be used in future. So I don't remove it here, but annotate as __used. Signed-off-by: Yury Norov --- arch/arm64/kernel/perf_event.c | 5 +- include/linux/bitmap.h | 11 +-- lib/bitmap.c | 87 ----------------- lib/test_bitmap.c | 206 +++++++---------------------------------- net/core/ethtool.c | 53 +++++------ 5 files changed, 55 insertions(+), 307 deletions(-) diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 9eaef51f83ff..b39622b4d25f 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -931,9 +931,8 @@ static void __armv8pmu_probe_pmu(void *info) pmceid[0] = read_sysreg(pmceid0_el0); pmceid[1] = read_sysreg(pmceid1_el0); - bitmap_from_u32array(cpu_pmu->pmceid_bitmap, - ARMV8_PMUV3_MAX_COMMON_EVENTS, pmceid, - ARRAY_SIZE(pmceid)); + bitmap_from_arr32(cpu_pmu->pmceid_bitmap, + pmceid, ARMV8_PMUV3_MAX_COMMON_EVENTS); } static int armv8pmu_probe_pmu(struct arm_pmu *cpu_pmu) diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index 1fa0de16b0a7..8611c386b997 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -60,8 +60,6 @@ * bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region * bitmap_release_region(bitmap, pos, order) Free specified bit region * bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region - * bitmap_from_u32array(dst, nbits, buf, nwords) *dst = *buf (nwords 32b words) - * bitmap_to_u32array(buf, nwords, src, nbits) *buf = *dst (nwords 32b words) * bitmap_from_arr32(dst, buf, nbits) Copy 'nbits' from u32 buf to dst * bitmap_to_arr32(buf, src, nbits) Copy 'nbits' from buf to u32 dst */ @@ -167,14 +165,7 @@ extern void bitmap_fold(unsigned long *dst, const unsigned long *orig, extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order); extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order); extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order); -extern unsigned int bitmap_from_u32array(unsigned long *bitmap, - unsigned int nbits, - const u32 *buf, - unsigned int nwords); -extern unsigned int bitmap_to_u32array(u32 *buf, - unsigned int nwords, - const unsigned long *bitmap, - unsigned int nbits); + #ifdef __BIG_ENDIAN extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits); #else diff --git a/lib/bitmap.c b/lib/bitmap.c index b0f79074ae84..3b476b33f852 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -1104,93 +1104,6 @@ int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order) EXPORT_SYMBOL(bitmap_allocate_region); /** - * bitmap_from_u32array - copy the contents of a u32 array of bits to bitmap - * @bitmap: array of unsigned longs, the destination bitmap, non NULL - * @nbits: number of bits in @bitmap - * @buf: array of u32 (in host byte order), the source bitmap, non NULL - * @nwords: number of u32 words in @buf - * - * copy min(nbits, 32*nwords) bits from @buf to @bitmap, remaining - * bits between nword and nbits in @bitmap (if any) are cleared. In - * last word of @bitmap, the bits beyond nbits (if any) are kept - * unchanged. - * - * Return the number of bits effectively copied. - */ -unsigned int -bitmap_from_u32array(unsigned long *bitmap, unsigned int nbits, - const u32 *buf, unsigned int nwords) -{ - unsigned int dst_idx, src_idx; - - for (src_idx = dst_idx = 0; dst_idx < BITS_TO_LONGS(nbits); ++dst_idx) { - unsigned long part = 0; - - if (src_idx < nwords) - part = buf[src_idx++]; - -#if BITS_PER_LONG == 64 - if (src_idx < nwords) - part |= ((unsigned long) buf[src_idx++]) << 32; -#endif - - if (dst_idx < nbits/BITS_PER_LONG) - bitmap[dst_idx] = part; - else { - unsigned long mask = BITMAP_LAST_WORD_MASK(nbits); - - bitmap[dst_idx] = (bitmap[dst_idx] & ~mask) - | (part & mask); - } - } - - return min_t(unsigned int, nbits, 32*nwords); -} -EXPORT_SYMBOL(bitmap_from_u32array); - -/** - * bitmap_to_u32array - copy the contents of bitmap to a u32 array of bits - * @buf: array of u32 (in host byte order), the dest bitmap, non NULL - * @nwords: number of u32 words in @buf - * @bitmap: array of unsigned longs, the source bitmap, non NULL - * @nbits: number of bits in @bitmap - * - * copy min(nbits, 32*nwords) bits from @bitmap to @buf. Remaining - * bits after nbits in @buf (if any) are cleared. - * - * Return the number of bits effectively copied. - */ -unsigned int -bitmap_to_u32array(u32 *buf, unsigned int nwords, - const unsigned long *bitmap, unsigned int nbits) -{ - unsigned int dst_idx = 0, src_idx = 0; - - while (dst_idx < nwords) { - unsigned long part = 0; - - if (src_idx < BITS_TO_LONGS(nbits)) { - part = bitmap[src_idx]; - if (src_idx >= nbits/BITS_PER_LONG) - part &= BITMAP_LAST_WORD_MASK(nbits); - src_idx++; - } - - buf[dst_idx++] = part & 0xffffffffUL; - -#if BITS_PER_LONG == 64 - if (dst_idx < nwords) { - part >>= 32; - buf[dst_idx++] = part & 0xffffffffUL; - } -#endif - } - - return min_t(unsigned int, nbits, 32*nwords); -} -EXPORT_SYMBOL(bitmap_to_u32array); - -/** * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order. * @dst: destination buffer * @src: bitmap to copy diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c index aa1f2669bdd5..de7ef2996a07 100644 --- a/lib/test_bitmap.c +++ b/lib/test_bitmap.c @@ -23,7 +23,7 @@ __check_eq_uint(const char *srcfile, unsigned int line, const unsigned int exp_uint, unsigned int x) { if (exp_uint != x) { - pr_warn("[%s:%u] expected %u, got %u\n", + pr_err("[%s:%u] expected %u, got %u\n", srcfile, line, exp_uint, x); return false; } @@ -33,19 +33,13 @@ __check_eq_uint(const char *srcfile, unsigned int line, static bool __init __check_eq_bitmap(const char *srcfile, unsigned int line, - const unsigned long *exp_bmap, unsigned int exp_nbits, - const unsigned long *bmap, unsigned int nbits) + const unsigned long *exp_bmap, const unsigned long *bmap, + unsigned int nbits) { - if (exp_nbits != nbits) { - pr_warn("[%s:%u] bitmap length mismatch: expected %u, got %u\n", - srcfile, line, exp_nbits, nbits); - return false; - } - if (!bitmap_equal(exp_bmap, bmap, nbits)) { pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n", srcfile, line, - exp_nbits, exp_bmap, nbits, bmap); + nbits, exp_bmap, nbits, bmap); return false; } return true; @@ -69,6 +63,10 @@ __check_eq_pbl(const char *srcfile, unsigned int line, static bool __init __check_eq_u32_array(const char *srcfile, unsigned int line, const u32 *exp_arr, unsigned int exp_len, + const u32 *arr, unsigned int len) __used; +static bool __init +__check_eq_u32_array(const char *srcfile, unsigned int line, + const u32 *exp_arr, unsigned int exp_len, const u32 *arr, unsigned int len) { if (exp_len != len) { @@ -255,171 +253,29 @@ static void __init test_bitmap_parselist(void) } } -static void __init test_bitmap_u32_array_conversions(void) +static void __init test_bitmap_arr32(void) { - DECLARE_BITMAP(bmap1, 1024); - DECLARE_BITMAP(bmap2, 1024); - u32 exp_arr[32], arr[32]; - unsigned nbits; - - for (nbits = 0 ; nbits < 257 ; ++nbits) { - const unsigned int used_u32s = DIV_ROUND_UP(nbits, 32); - unsigned int i, rv; - - bitmap_zero(bmap1, nbits); - bitmap_set(bmap1, nbits, 1024 - nbits); /* garbage */ - - memset(arr, 0xff, sizeof(arr)); - rv = bitmap_to_u32array(arr, used_u32s, bmap1, nbits); - expect_eq_uint(nbits, rv); - - memset(exp_arr, 0xff, sizeof(exp_arr)); - memset(exp_arr, 0, used_u32s*sizeof(*exp_arr)); - expect_eq_u32_array(exp_arr, 32, arr, 32); - - bitmap_fill(bmap2, 1024); - rv = bitmap_from_u32array(bmap2, nbits, arr, used_u32s); - expect_eq_uint(nbits, rv); - expect_eq_bitmap(bmap1, 1024, bmap2, 1024); - - for (i = 0 ; i < nbits ; ++i) { - /* - * test conversion bitmap -> u32[] - */ - - bitmap_zero(bmap1, 1024); - __set_bit(i, bmap1); - bitmap_set(bmap1, nbits, 1024 - nbits); /* garbage */ - - memset(arr, 0xff, sizeof(arr)); - rv = bitmap_to_u32array(arr, used_u32s, bmap1, nbits); - expect_eq_uint(nbits, rv); - - /* 1st used u32 words contain expected bit set, the - * remaining words are left unchanged (0xff) - */ - memset(exp_arr, 0xff, sizeof(exp_arr)); - memset(exp_arr, 0, used_u32s*sizeof(*exp_arr)); - exp_arr[i/32] = (1U<<(i%32)); - expect_eq_u32_array(exp_arr, 32, arr, 32); - - - /* same, with longer array to fill - */ - memset(arr, 0xff, sizeof(arr)); - rv = bitmap_to_u32array(arr, 32, bmap1, nbits); - expect_eq_uint(nbits, rv); - - /* 1st used u32 words contain expected bit set, the - * remaining words are all 0s - */ - memset(exp_arr, 0, sizeof(exp_arr)); - exp_arr[i/32] = (1U<<(i%32)); - expect_eq_u32_array(exp_arr, 32, arr, 32); - - /* - * test conversion u32[] -> bitmap - */ - - /* the 1st nbits of bmap2 are identical to - * bmap1, the remaining bits of bmap2 are left - * unchanged (all 1s) - */ - bitmap_fill(bmap2, 1024); - rv = bitmap_from_u32array(bmap2, nbits, - exp_arr, used_u32s); - expect_eq_uint(nbits, rv); - - expect_eq_bitmap(bmap1, 1024, bmap2, 1024); - - /* same, with more bits to fill - */ - memset(arr, 0xff, sizeof(arr)); /* garbage */ - memset(arr, 0, used_u32s*sizeof(u32)); - arr[i/32] = (1U<<(i%32)); - - bitmap_fill(bmap2, 1024); - rv = bitmap_from_u32array(bmap2, 1024, arr, used_u32s); - expect_eq_uint(used_u32s*32, rv); - - /* the 1st nbits of bmap2 are identical to - * bmap1, the remaining bits of bmap2 are cleared - */ - bitmap_zero(bmap1, 1024); - __set_bit(i, bmap1); - expect_eq_bitmap(bmap1, 1024, bmap2, 1024); - - - /* - * test short conversion bitmap -> u32[] (1 - * word too short) - */ - if (used_u32s > 1) { - bitmap_zero(bmap1, 1024); - __set_bit(i, bmap1); - bitmap_set(bmap1, nbits, - 1024 - nbits); /* garbage */ - memset(arr, 0xff, sizeof(arr)); - - rv = bitmap_to_u32array(arr, used_u32s - 1, - bmap1, nbits); - expect_eq_uint((used_u32s - 1)*32, rv); - - /* 1st used u32 words contain expected - * bit set, the remaining words are - * left unchanged (0xff) - */ - memset(exp_arr, 0xff, sizeof(exp_arr)); - memset(exp_arr, 0, - (used_u32s-1)*sizeof(*exp_arr)); - if ((i/32) < (used_u32s - 1)) - exp_arr[i/32] = (1U<<(i%32)); - expect_eq_u32_array(exp_arr, 32, arr, 32); - } - - /* - * test short conversion u32[] -> bitmap (3 - * bits too short) - */ - if (nbits > 3) { - memset(arr, 0xff, sizeof(arr)); /* garbage */ - memset(arr, 0, used_u32s*sizeof(*arr)); - arr[i/32] = (1U<<(i%32)); - - bitmap_zero(bmap1, 1024); - rv = bitmap_from_u32array(bmap1, nbits - 3, - arr, used_u32s); - expect_eq_uint(nbits - 3, rv); - - /* we are expecting the bit < nbits - - * 3 (none otherwise), and the rest of - * bmap1 unchanged (0-filled) - */ - bitmap_zero(bmap2, 1024); - if (i < nbits - 3) - __set_bit(i, bmap2); - expect_eq_bitmap(bmap2, 1024, bmap1, 1024); - - /* do the same with bmap1 initially - * 1-filled - */ - - bitmap_fill(bmap1, 1024); - rv = bitmap_from_u32array(bmap1, nbits - 3, - arr, used_u32s); - expect_eq_uint(nbits - 3, rv); - - /* we are expecting the bit < nbits - - * 3 (none otherwise), and the rest of - * bmap1 unchanged (1-filled) - */ - bitmap_zero(bmap2, 1024); - if (i < nbits - 3) - __set_bit(i, bmap2); - bitmap_set(bmap2, nbits-3, 1024 - nbits + 3); - expect_eq_bitmap(bmap2, 1024, bmap1, 1024); - } - } + unsigned int nbits, next_bit, len = sizeof(exp) * 8; + u32 arr[sizeof(exp) / 4]; + DECLARE_BITMAP(bmap2, len); + + memset(arr, 0xa5, sizeof(arr)); + + for (nbits = 0; nbits < len; ++nbits) { + bitmap_to_arr32(arr, exp, nbits); + bitmap_from_arr32(bmap2, arr, nbits); + expect_eq_bitmap(bmap2, exp, nbits); + + next_bit = find_next_bit(bmap2, + round_up(nbits, BITS_PER_LONG), nbits); + if (next_bit < round_up(nbits, BITS_PER_LONG)) + pr_err("bitmap_copy_arr32(nbits == %d:" + " tail is not safely cleared: %d\n", + nbits, next_bit); + + if (nbits < len - 32) + expect_eq_uint(arr[DIV_ROUND_UP(nbits, 32)], + 0xa5a5a5a5); } } @@ -454,7 +310,7 @@ static void noinline __init test_mem_optimisations(void) static int __init test_bitmap_init(void) { test_zero_fill_copy(); - test_bitmap_u32_array_conversions(); + test_bitmap_arr32(); test_bitmap_parselist(); test_mem_optimisations(); diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 9a9a3d77e327..3ca88a561110 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -599,18 +599,15 @@ static int load_link_ksettings_from_user(struct ethtool_link_ksettings *to, return -EFAULT; memcpy(&to->base, &link_usettings.base, sizeof(to->base)); - bitmap_from_u32array(to->link_modes.supported, - __ETHTOOL_LINK_MODE_MASK_NBITS, - link_usettings.link_modes.supported, - __ETHTOOL_LINK_MODE_MASK_NU32); - bitmap_from_u32array(to->link_modes.advertising, - __ETHTOOL_LINK_MODE_MASK_NBITS, - link_usettings.link_modes.advertising, - __ETHTOOL_LINK_MODE_MASK_NU32); - bitmap_from_u32array(to->link_modes.lp_advertising, - __ETHTOOL_LINK_MODE_MASK_NBITS, - link_usettings.link_modes.lp_advertising, - __ETHTOOL_LINK_MODE_MASK_NU32); + bitmap_from_arr32(to->link_modes.supported, + link_usettings.link_modes.supported, + __ETHTOOL_LINK_MODE_MASK_NBITS); + bitmap_from_arr32(to->link_modes.advertising, + link_usettings.link_modes.advertising, + __ETHTOOL_LINK_MODE_MASK_NBITS); + bitmap_from_arr32(to->link_modes.lp_advertising, + link_usettings.link_modes.lp_advertising, + __ETHTOOL_LINK_MODE_MASK_NBITS); return 0; } @@ -626,18 +623,15 @@ store_link_ksettings_for_user(void __user *to, struct ethtool_link_usettings link_usettings; memcpy(&link_usettings.base, &from->base, sizeof(link_usettings)); - bitmap_to_u32array(link_usettings.link_modes.supported, - __ETHTOOL_LINK_MODE_MASK_NU32, - from->link_modes.supported, - __ETHTOOL_LINK_MODE_MASK_NBITS); - bitmap_to_u32array(link_usettings.link_modes.advertising, - __ETHTOOL_LINK_MODE_MASK_NU32, - from->link_modes.advertising, - __ETHTOOL_LINK_MODE_MASK_NBITS); - bitmap_to_u32array(link_usettings.link_modes.lp_advertising, - __ETHTOOL_LINK_MODE_MASK_NU32, - from->link_modes.lp_advertising, - __ETHTOOL_LINK_MODE_MASK_NBITS); + bitmap_to_arr32(link_usettings.link_modes.supported, + from->link_modes.supported, + __ETHTOOL_LINK_MODE_MASK_NU32); + bitmap_to_arr32(link_usettings.link_modes.advertising, + from->link_modes.advertising, + __ETHTOOL_LINK_MODE_MASK_NU32); + bitmap_to_arr32(link_usettings.link_modes.lp_advertising, + from->link_modes.lp_advertising, + __ETHTOOL_LINK_MODE_MASK_NU32); if (copy_to_user(to, &link_usettings, sizeof(link_usettings))) return -EFAULT; @@ -2343,10 +2337,8 @@ static int ethtool_get_per_queue_coalesce(struct net_device *dev, useraddr += sizeof(*per_queue_opt); - bitmap_from_u32array(queue_mask, - MAX_NUM_QUEUE, - per_queue_opt->queue_mask, - DIV_ROUND_UP(MAX_NUM_QUEUE, 32)); + bitmap_from_arr32(queue_mask, per_queue_opt->queue_mask, + MAX_NUM_QUEUE); for_each_set_bit(bit, queue_mask, MAX_NUM_QUEUE) { struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE }; @@ -2378,10 +2370,7 @@ static int ethtool_set_per_queue_coalesce(struct net_device *dev, useraddr += sizeof(*per_queue_opt); - bitmap_from_u32array(queue_mask, - MAX_NUM_QUEUE, - per_queue_opt->queue_mask, - DIV_ROUND_UP(MAX_NUM_QUEUE, 32)); + bitmap_from_arr32(queue_mask, per_queue_opt->queue_mask, MAX_NUM_QUEUE); n_queue = bitmap_weight(queue_mask, MAX_NUM_QUEUE); tmp = backup = kmalloc_array(n_queue, sizeof(*backup), GFP_KERNEL); if (!backup) -- 2.11.0 From 1584711960217746791@xxx Tue Nov 21 21:18:15 +0000 2017 X-GM-THRID: 1584156130360803324 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread