OrangePi_CM5/include/linux/mtd
Arnd Bergmann 9e343e87d2 mtd: cfi: convert inline functions to macros
The map_word_() functions, dating back to linux-2.6.8, try to perform
bitwise operations on a 'map_word' structure. This may have worked
with compilers that were current then (gcc-3.4 or earlier), but end
up being rather inefficient on any version I could try now (gcc-4.4 or
higher). Specifically we hit a problem analyzed in gcc PR81715 where we
fail to reuse the stack space for local variables.

This can be seen immediately in the stack consumption for
cfi_staa_erase_varsize() and other functions that (with CONFIG_KASAN)
can be up to 2200 bytes. Changing the inline functions into macros brings
this down to 1280 bytes.  Without KASAN, the same problem exists, but
the stack consumption is lower to start with, my patch shrinks it from
920 to 496 bytes on with arm-linux-gnueabi-gcc-5.4, and saves around
1KB in .text size for cfi_cmdset_0020.c, as it avoids copying map_word
structures for each call to one of these helpers.

With the latest gcc-8 snapshot, the problem is fixed in upstream gcc,
but nobody uses that yet, so we should still work around it in mainline
kernels and probably backport the workaround to stable kernels as well.
We had a couple of other functions that suffered from the same gcc bug,
and all of those had a simpler workaround involving dummy variables
in the inline function. Unfortunately that did not work here, the
macro hack was the best I could come up with.

It would also be helpful to have someone to a little performance testing
on the patch, to see how much it helps in terms of CPU utilitzation.

Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715
Cc: stable@vger.kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
2017-12-18 09:52:59 +01:00
..
bbm.h mtd: onenand: make onenand_scan_bbt() static 2016-01-23 14:00:16 -08:00
blktrans.h
…
cfi.h mtd: cfi: deinline large functions 2015-05-27 12:42:16 -07:00
cfi_endian.h
…
concat.h
…
doc2000.h
…
flashchip.h
…
ftl.h
…
gen_probe.h
…
inftl.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
latch-addr-flash.h
…
lpc32xx_mlc.h
…
lpc32xx_slc.h
…
map.h mtd: cfi: convert inline functions to macros 2017-12-18 09:52:59 +01:00
mtd.h mtd: remove the get_unmapped_area method 2017-11-13 21:39:18 +01:00
mtdram.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
nand-gpio.h This pull request contains the following core changes: 2017-11-22 20:46:06 -10:00
nand_bch.h mtd: nand: simplify nand_bch_init() usage 2016-03-07 16:23:09 -08:00
nand_ecc.h
…
ndfc.h
…
nftl.h mtd: nftl: kill unused oobinfo field 2016-01-26 10:27:34 -08:00
onenand.h mtd: onenand: switch to mtd_ooblayout_ops 2016-05-05 23:51:49 +02:00
onenand_regs.h
…
partitions.h mtd: partitions: add support for partition parsers 2017-06-22 13:13:09 -07:00
pfow.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
physmap.h
…
pismo.h
…
plat-ram.h
…
qinfo.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
rawnand.h mtd: nand: introduce NAND_ROW_ADDR_3 flag 2017-09-18 14:55:52 +02:00
sh_flctl.h mtd: nand: Rename nand.h into rawnand.h 2017-08-13 10:11:49 +02:00
sharpsl.h Merge branch 'nand/rename-header-file' of git://git.infradead.org/l2-mtd into nand/next 2017-08-23 17:00:12 +02:00
spear_smi.h Shiraz has moved 2014-04-18 16:40:08 -07:00
spi-nor.h mtd: spi-nor: add spi_nor_init() function 2017-10-10 18:19:42 +02:00
super.h
…
ubi.h UBI: Add initial support for scatter gather 2015-01-28 16:04:26 +01:00
xip.h mtd: only use __xipram annotation when XIP_KERNEL is set 2017-08-15 14:00:44 +02:00