linux-uconsole/drivers/mtd
Herton Ronaldo Krzesinski 29224d0b69 mtd: nandsim: don't open code a do_div helper
commit 596fd46268 upstream.

We don't need to open code the divide function, just use div_u64 that
already exists and do the same job. While this is a straightforward
clean up, there is more to that, the real motivation for this.

While building on a cross compiling environment in armel, using gcc
4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5), I was getting the following build
error:

ERROR: "__aeabi_uldivmod" [drivers/mtd/nand/nandsim.ko] undefined!

After investigating with objdump and hand built assembly version
generated with the compiler, I narrowed __aeabi_uldivmod as being
generated from the divide function. When nandsim.c is built with
-fno-inline-functions-called-once, that happens when
CONFIG_DEBUG_SECTION_MISMATCH is enabled, the do_div optimization in
arch/arm/include/asm/div64.h doesn't work as expected with the open
coded divide function: even if the do_div we are using doesn't have a
constant divisor, the compiler still includes the else parts of the
optimized do_div macro, and translates the divisions there to use
__aeabi_uldivmod, instead of only calling __do_div_asm -> __do_div64 and
optimizing/removing everything else out.

So to reproduce, gcc 4.6 plus CONFIG_DEBUG_SECTION_MISMATCH=y and
CONFIG_MTD_NAND_NANDSIM=m should do it, building on armel.

After this change, the compiler does the intended thing even with
-fno-inline-functions-called-once, and optimizes out as expected the
constant handling in the optimized do_div on arm. As this also avoids a
build issue, I'm marking for Stable, as I think is applicable for this
case.

Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-07-19 08:58:20 -07:00
..
chips mtd: remove duplicate assignment of chip->state 2011-05-25 02:11:13 +01:00
devices mtd: m25p80: set writebufsize 2012-04-13 08:14:05 -07:00
lpddr mtd: remove duplicate assignment of chip->state 2011-05-25 02:11:13 +01:00
maps Merge git://git.infradead.org/mtd-2.6 2011-05-27 20:06:53 -07:00
nand mtd: nandsim: don't open code a do_div helper 2012-07-19 08:58:20 -07:00
onenand mtd: convert remaining users to mtd_device_register() 2011-05-25 02:25:00 +01:00
tests mtd: tests: stresstest: bail out if device has not enough eraseblocks 2012-01-25 17:24:32 -08:00
ubi UBI: fix eraseblock picking criteria 2012-04-02 09:27:17 -07:00
afs.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00
ar7part.c
cmdlinepart.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00
ftl.c Update broken web addresses in the kernel. 2010-10-18 11:03:14 +02:00
inftlcore.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00
inftlmount.c mtd: Remove obsolete <mtd/compatmac.h> include 2010-08-08 21:19:42 +01:00
Kconfig Merge git://git.infradead.org/mtd-2.6 2011-05-27 20:06:53 -07:00
Makefile mtd: kill CONFIG_MTD_PARTITIONS 2011-05-25 02:25:35 +01:00
mtd_blkdevs.c mtd: mtd_blkdevs: don't increase 'open' count on error path 2012-01-25 17:24:32 -08:00
mtdblock.c Fix common misspellings 2011-03-31 11:26:23 -03:00
mtdblock_ro.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00
mtdchar.c mtd: mtdchar: add missing initializer on raw write 2011-11-11 09:37:13 -08:00
mtdconcat.c mtd: mtdconcat: fix NAND OOB write 2011-05-25 01:54:50 +01:00
mtdcore.c mtd: remove add_mtd_partitions, add_mtd_device and friends 2011-05-25 02:25:16 +01:00
mtdcore.h mtd: remove add_mtd_partitions, add_mtd_device and friends 2011-05-25 02:25:16 +01:00
mtdoops.c mtd: mtdoops: skip reading initially bad blocks 2012-01-25 17:24:32 -08:00
mtdpart.c mtd: remove add_mtd_partitions, add_mtd_device and friends 2011-05-25 02:25:16 +01:00
mtdsuper.c convert get_sb_mtd() users to ->mount() 2010-10-29 04:16:26 -04:00
mtdswap.c mtd: mtdswap: fix possible null dereference 2011-05-25 02:11:44 +01:00
nftlcore.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00
nftlmount.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00
ofpart.c mtd: Fix endianness issues from device tree 2010-10-25 00:55:56 +01:00
redboot.c mtd: provide an alias for the redboot module name 2011-11-11 09:37:15 -08:00
rfd_ftl.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00
sm_ftl.c mtd: sm_ftl: fix typo in major number. 2012-06-01 15:12:55 +08:00
sm_ftl.h mtd: sm_ftl: cosmetic, use bool when possible 2010-10-25 01:33:08 +01:00
ssfdc.c mtd: Update copyright notices 2010-08-08 20:58:20 +01:00