mirror of https://gitee.com/openkylin/linux.git
596fd46268
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> Cc: stable@vger.kernel.org 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> |
||
---|---|---|
.. | ||
gpmi-nand | ||
Kconfig | ||
Makefile | ||
alauda.c | ||
ams-delta.c | ||
atmel_nand.c | ||
atmel_nand_ecc.h | ||
au1550nd.c | ||
autcpu12.c | ||
bcm_umi_bch.c | ||
bcm_umi_nand.c | ||
bf5xx_nand.c | ||
cafe_nand.c | ||
cmx270_nand.c | ||
cs553x_nand.c | ||
davinci_nand.c | ||
denali.c | ||
denali.h | ||
diskonchip.c | ||
docg4.c | ||
fsl_elbc_nand.c | ||
fsl_ifc_nand.c | ||
fsl_upm.c | ||
fsmc_nand.c | ||
gpio.c | ||
h1910.c | ||
jz4740_nand.c | ||
mpc5121_nfc.c | ||
mxc_nand.c | ||
nand_base.c | ||
nand_bbt.c | ||
nand_bch.c | ||
nand_bcm_umi.c | ||
nand_bcm_umi.h | ||
nand_ecc.c | ||
nand_ids.c | ||
nandsim.c | ||
ndfc.c | ||
nomadik_nand.c | ||
nuc900_nand.c | ||
omap2.c | ||
orion_nand.c | ||
pasemi_nand.c | ||
plat_nand.c | ||
ppchameleonevb.c | ||
pxa3xx_nand.c | ||
r852.c | ||
r852.h | ||
rtc_from4.c | ||
s3c2410.c | ||
sh_flctl.c | ||
sharpsl.c | ||
sm_common.c | ||
sm_common.h | ||
socrates_nand.c | ||
spia.c | ||
tmio_nand.c | ||
txx9ndfmc.c |