Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755412AbcCPQpS (ORCPT ); Wed, 16 Mar 2016 12:45:18 -0400 Received: from mout.kundenserver.de ([212.227.17.10]:59430 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752236AbcCPQpO (ORCPT ); Wed, 16 Mar 2016 12:45:14 -0400 From: Arnd Bergmann To: "James E.J. Bottomley" , "Martin K. Petersen" Cc: Arnd Bergmann , James Bottomley , Hannes Reinecke , James Smart , "Ewan D. Milne" , linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] scsi: fc: use get/put_unaligned64 for wwn access Date: Wed, 16 Mar 2016 17:39:17 +0100 Message-Id: <1458146385-278589-1-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 2.7.0 X-Provags-ID: V03:K0:eaIRU/dK2GybBm0LXscmBF8JwYlEWBczdT/cu1uufIvoQngCmJp 0zUu4tPlADq29YM16YfZEu8yzRT83y4JoU1iQqoomftY5Nxt6EtF5fjxQFQrXaqQAF/cs6P 8PddrrijOyB5GbXv3gqVMB+QIFu8CIeIa/vUvBAiK9cnSbZlb1pVxsCiidZyMjCDgO4uu+q +0J2QmHP6CfxFzyajsNxQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:61Ev3pMrL58=:uLEJv3xoS/3glh0FxkZyFP 6peweUQbG5OTJS+R4w2PIGwAC1gl0sRcCDInn00PttMCJreWKFNlTInT45EoIaL57fBQv68rk 34xCxPFBjGITZbKH06zIth5B8xKN5F7nV087J+YsEyKQE24MZtnCZ5dGGWxuAfJNSUXOQ5ACM NzW50KzU+GEmd9FtAch3MyZNBqu7Oa/amoATJCxGYmj71tNCkt4U1+L++NLvgtPcknO4mI9y4 GKU27MPiKigCC4kgxQ4zUKQ5c3rYaoaabM1M3AVYWXR8A/zE7V5swr4iCZYXZ3t6ZS6cvwtQN wn4KxWJ47kKrwE71JB76LSMcclMauDybUuCioBQ4pkys+XwGLjn9Ofj8wmaBR0pc/92nGdiLZ ybsG4PhlUiPX6tav8EVJhw8TUt0f5dmFTsueYJEwHBp+/xynYsSx/OgXChTZfjea6Ml9/cXzI NqGU1KRDuafpv2xSLbDQ/EdU8lFbNDRi3E0xKyDMyuRd7z880f3qC6mJqD/cWOpk+W5O0y4w3 JcPTlQLtvvBfqNY0RK0nWKSriVvCvgkNv+h42WicKK/EKXa4d9Av6f/FvtQG1TOdpSpapECKb o0xB4EWK2te/kklq6RIaI/qcY4AEtC7Pt+bbHRGe8YX0Fmd2+D75kB6H1IMg0/32d/U2y9Wnj BrLRPyvMm6pZ6lkQgpe4cgp10+IZefDwCrKXfOoIfkSY1LLgnUCEz5kGUnKKvczK/auA= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2239 Lines: 69 A bug in the gcc-6.0 prerelease version caused at least one driver (lpfc) to have excessive stack usage when dealing with wwn data, on the ARM architecture. lpfc_scsi.c: In function 'lpfc_find_next_oas_lun': lpfc_scsi.c:117:1: warning: the frame size of 1152 bytes is larger than 1024 bytes [-Wframe-larger-than=] I have reported this as a gcc regression in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70232 However, using a better implementation of wwn_to_u64() not only helps with the particular gcc problem but also leads to better object code for any version or architecture. The kernel already provides get_unaligned_be64() and put_unaligned_be64() helper functions that provide an optimized implementation with the desired semantics. The lpfc_find_next_oas_lun() function in the example that grew from 1146 bytes to 5144 bytes when moving from gcc-5.3 to gcc-6.0 is now 804 bytes, as the optimized get_unaligned_be64() load can be done in three instructions. The stack usage is now down to 28 bytes from 128 bytes with gcc-5.3 before. Signed-off-by: Arnd Bergmann --- include/scsi/scsi_transport_fc.h | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index 784bc2c0929f..bf66ea6bed2b 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h @@ -28,6 +28,7 @@ #define SCSI_TRANSPORT_FC_H #include +#include #include #include @@ -797,22 +798,12 @@ fc_remote_port_chkready(struct fc_rport *rport) static inline u64 wwn_to_u64(u8 *wwn) { - return (u64)wwn[0] << 56 | (u64)wwn[1] << 48 | - (u64)wwn[2] << 40 | (u64)wwn[3] << 32 | - (u64)wwn[4] << 24 | (u64)wwn[5] << 16 | - (u64)wwn[6] << 8 | (u64)wwn[7]; + return get_unaligned_be64(wwn); } static inline void u64_to_wwn(u64 inm, u8 *wwn) { - wwn[0] = (inm >> 56) & 0xff; - wwn[1] = (inm >> 48) & 0xff; - wwn[2] = (inm >> 40) & 0xff; - wwn[3] = (inm >> 32) & 0xff; - wwn[4] = (inm >> 24) & 0xff; - wwn[5] = (inm >> 16) & 0xff; - wwn[6] = (inm >> 8) & 0xff; - wwn[7] = inm & 0xff; + put_unaligned_be64(inm, wwn); } /** -- 2.7.0