From patchwork Wed Jun 22 12:55:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102117 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp2532921qgy; Wed, 22 Jun 2016 05:53:43 -0700 (PDT) X-Received: by 10.107.166.137 with SMTP id p131mr39339659ioe.121.1466600023458; Wed, 22 Jun 2016 05:53:43 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 3si46906430pfw.92.2016.06.22.05.53.43; Wed, 22 Jun 2016 05:53:43 -0700 (PDT) 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; 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 S1752664AbcFVMxl (ORCPT + 30 others); Wed, 22 Jun 2016 08:53:41 -0400 Received: from mout.kundenserver.de ([212.227.126.134]:52722 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751741AbcFVMxj (ORCPT ); Wed, 22 Jun 2016 08:53:39 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue002) with ESMTPA (Nemesis) id 0LuY5I-1bOT7H0dsm-00zlGw; Wed, 22 Jun 2016 14:53:27 +0200 From: Arnd Bergmann To: "Nicholas A. Bellinger" Cc: Arnd Bergmann , Jens Axboe , Mike Christie , Andy Grover , Hannes Reinecke , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] target/iblock: use ilog2 to compute block size Date: Wed, 22 Jun 2016 14:55:12 +0200 Message-Id: <20160622125534.1267407-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:y+ZHUZu5c7WbiUDoBlSxVkbXHtJ+X0F8X2cg2eEGnE4nzwaOqiS 2t5NPmY8c8PdMN89s5fuEmQ2Y6Eur/yj0N4n9yrfGtdubwrpa6osXp+waolymtYhmZjeneW scW214G785zskKVo3QsfmKFWKG8iXnjR5U9X3PZm9WFiH+0lxanUBD7llQrpXWhoer2YZpD JBW9uaVVHR6ymjs30GhxQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:UbtY5D958HQ=:b9BHgRccWV7pNzjCMBjn/G NxqWgW4dhPN8CNLcSNgYF3zowyBar5fpXPVnVCBXCanq39FKun9q2p5VhMIwdW7jkg8yoS6ds Y/pA8ZKa0urgkLd8rt46YKA4cK+1cmqCehvM3zoxV8wOJZcinpVNhjz9ksLzc9r3OzK1CjnK7 LjLNCGJr1ucTTZkN8lO7rG7Nymgrd+EE2Y9cr0VO8VbE7BFiJgzzeSYsSJdwFFJ+UPYPsESL+ o03AOcN/u7KByBebS9fQ2v68Csf5G2mZl07ByktmuIDPSCPQP2L7yAiE83TcGDS+pZ5hzZ9ue 3VoHQsFNDI9AWAhITfMKIAlkrCgRlvGLA1PZpjdiibDm0SM8zU5r6WEOphZ3Jbu2YXiI5aD10 C3kenl2n+87/MBKZRiEDHqtbykdICT93OVKk1HVLyLhfz/HxXhXDvoClhX8TpecIO+K2EMnyY Lp1Nx1NJJvSA7nEd0QUWmfbwGuPhVNXy8xEu25IwIVUDODGAtTcA6NyvXC6tXDGTJ8dPRS4yk tarrKHyb/cIhmTqqlmCRyvn8gyNZtNv6GrbWJnC2muDcrGM8vZzHz9kdF+Iun6DCtDHlR3e4K SPdpaUT1HLZBgfz/vzDm186CpmBUzkNUoUidTI7gy+4/O3BwDr5joK5orI8qpSuyP37lszo7F RvKoLWfAPQF46CAbVFlNhKo6G9f58BsOZlhrDmOQ3v+tNU18aWVGVxU+ch0efVYwYoLw= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Enabling CONFIG_UBSAN_SANITIZE_ALL on ARM caused a link error: drivers/target/built-in.o: In function `iblock_emulate_read_cap_with_block_size.constprop.1': target_core_iblock.c:(.text+0xc2774): undefined reference to `____ilog2_NaN' target_core_iblock.c:(.text+0xc27f8): undefined reference to `__aeabi_uldivmod' target_core_iblock.c:(.text+0xc299c): undefined reference to `__aeabi_uldivmod' This is caused by gcc not behaving in the expected ways with __builtin_constant_p(), but it also points to somewhat inefficient code: As we know that the block size is a power-of-two value, we can turn the expensive 64-bit division into a simpler variable bit shift. Signed-off-by: Arnd Bergmann --- drivers/target/target_core_iblock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -- 2.9.0 diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 22af12f8b8eb..3ab4e2d1202c 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -201,9 +201,9 @@ static unsigned long long iblock_emulate_read_cap_with_block_size( struct block_device *bd, struct request_queue *q) { - unsigned long long blocks_long = (div_u64(i_size_read(bd->bd_inode), - bdev_logical_block_size(bd)) - 1); u32 block_size = bdev_logical_block_size(bd); + unsigned int block_shift = ilog2(block_size); + unsigned long long blocks_long = (i_size_read(bd->bd_inode) >> block_shift) - 1; if (block_size == dev->dev_attrib.block_size) return blocks_long;