linux/drivers/mtd/nand
Artem Bityutskiy 98b830d260 [MTD] [NAND] nandsim: avoid deadlocking FS
Make nandsim use GFP_NOFS when allocating memory, because it might
be used by a file-system (e.g. UBIFS2) which means, if we are short
of memory, we may deadlock. Indee, UBIFS is holding a lock, writes
to the media, reaches this place in NANDsim, kmalloc does not find
the requested amount of RAM, calls memory shrinker, which decides
to writeback inodes, calls FS, and it deadlocks on the lock which
is already being held. Below is the UBIFS backtrace which
demonstrates that:

[<c03717dc>] __mutex_lock_slowpath+0xc8/0x2e6
[<c0371a16>] mutex_lock+0x1c/0x1f
[<f8b9d076>] reserve_space+0x3d/0xa9 [ubifs]
[<f8b9d1bd>] make_one_reservation+0x2b/0x86 [ubifs]
[<f8b9d3fc>] ubifs_jrn_write_block+0xda/0x12f [ubifs]
[<f8b9ff3a>] ubifs_writepage+0x11d/0x1ec [ubifs]
[<c015d6ab>] shrink_inactive_list+0x7fa/0x969
[<c015d8c8>] shrink_zone+0xae/0x10c
[<c015e3b4>] try_to_free_pages+0x159/0x251
[<c015980a>] __alloc_pages+0x125/0x2f0
[<c016ff6a>] cache_alloc_refill+0x380/0x6ba
[<c01703f3>] __kmalloc+0x14f/0x157
[<f885722a>] do_state_action+0xab7/0xc74 [nandsim]
[<f885760c>] switch_state+0x225/0x402 [nandsim]
[<f8857e7e>] ns_hwcontrol+0x3e2/0x620 [nandsim]
[<f8862f53>] nand_command+0x2e/0x1a5 [nand]
[<f8861ad8>] nand_write_page+0x4a/0x9a [nand]
[<f88617b4>] nand_do_write_ops+0x1cf/0x343 [nand]
[<f8861a70>] nand_write+0x88/0xa6 [nand]
[<f8850b0e>] part_write+0x72/0x8b [mtd]
[<f88e19c5>] ubi_io_write+0x189/0x29c [ubi]
[<f88dfb98>] ubi_eba_write_leb+0xb6/0x699 [ubi]
[<f88def93>] ubi_leb_write+0xe4/0xe9 [ubi]
[<f8ba3b82>] ubifs_wbuf_write_nolock+0x333/0x4c9 [ubifs]
[<f8b9d28c>] write_node+0x74/0x8e [ubifs]
[<f8b9d422>] ubifs_jrn_write_block+0x100/0x12f [ubifs]
[<f8b9ff3a>] ubifs_writepage+0x11d/0x1ec [ubifs]
[<c0159e5b>] __writepage+0xb/0x26
[<c015a318>] write_cache_pages+0x203/0x2d9
[<c015a411>] generic_writepages+0x23/0x2d
[<c015a452>] do_writepages+0x37/0x39
[<c018e24a>] __writeback_single_inode+0x96/0x399
[<c018e903>] sync_sb_inodes+0x1a3/0x274
[<c018ebf3>] writeback_inodes+0xa6/0xd8
[<c015a9dd>] background_writeout+0x86/0x9e
[<c015ae9c>] pdflush+0xfb/0x1b6
[<c01387d7>] kthread+0x37/0x59
[<c0104dc3>] kernel_thread_helper+0x7/0x14

The deadlock is funny because it starts in pdflush/writeback,
and comes back to writeback, then deadlocks. It seems we should look
carefully for other places in UBI and MTD and use GFP_NOFS instead
of GFP_KERNEL.

Caught-by: Adrian Hunter <ext-adrian.hunter@nokia.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
2007-09-06 10:16:22 +01:00
..
alauda.c [MTD] [NAND] Driver for Olympus MAUSB-10 and Fujifilm DPC-R1 card readers 2007-08-29 17:37:23 +01:00
ams-delta.c [PATCH] MTD NAND: Fix ams-delta after core conversion 2006-08-27 11:01:30 -07:00
at91_nand.c [MTD] [NAND] at91_nand rdy_pin fix 2007-08-02 21:46:48 +01:00
au1550nd.c [MTD NAND] Remove old code in au1550nd.c 2006-09-22 10:09:44 +01:00
autcpu12.c potential parse error in ifdef 2007-06-01 08:18:27 -07:00
cafe_nand.c [MTD] [NAND] Support multiple chips in CAFÉ driver 2007-05-02 12:26:37 +01:00
cmx270_nand.c [MTD] [NAND] CM-x270 MTD driver 2007-04-27 23:04:32 +01:00
cs553x_nand.c PCI: Cleanup the includes of <linux/pci.h> 2007-05-02 19:02:35 -07:00
diskonchip.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2007-08-01 11:23:57 +01:00
edb7312.c [MTD] [NAND] Fix refactoring of EDB7312 hwcontrol function. 2007-08-02 21:46:07 +01:00
excite_nandflash.c [MTD] Clean up duplicate includes in drivers/mtd/ 2007-07-23 11:56:27 +01:00
h1910.c [MTD] Refactor NAND hwcontrol to cmd_ctrl 2006-05-23 23:25:53 +02:00
Kconfig [MTD] [NAND] Driver for Olympus MAUSB-10 and Fujifilm DPC-R1 card readers 2007-08-29 17:37:23 +01:00
Makefile [MTD] [NAND] Driver for Olympus MAUSB-10 and Fujifilm DPC-R1 card readers 2007-08-29 17:37:23 +01:00
nand_base.c [MTD] [NAND] nand_base.c: fix type of eccpos pointer 2007-08-02 21:47:01 +01:00
nand_bbt.c [MTD] replace kmalloc+memset with kzalloc 2006-11-28 23:47:21 +00:00
nand_ecc.c [MTD] [NAND] fix ifdef option in nand_ecc.c 2006-11-29 00:11:39 +00:00
nand_ids.c [MTD] [NAND] Add NAND manufacturer AMD. 2007-07-23 11:51:53 +01:00
nandsim.c [MTD] [NAND] nandsim: avoid deadlocking FS 2007-09-06 10:16:22 +01:00
ndfc.c [MTD] [NAND] Change NDFC driver to support 405 platforms too 2007-06-28 20:33:04 +01:00
plat_nand.c [MTD] [NAND] platform NAND driver: add driver 2007-05-08 00:41:55 +01:00
ppchameleonevb.c parse errors in ifdefs 2007-06-01 08:18:28 -07:00
rtc_from4.c [MTD] [NAND] Compile fix in rfc_from4.c 2006-12-01 09:59:49 +00:00
s3c2410.c [ARM] 4233/1: nand/s3c2410.c: warning fix 2007-02-25 16:41:41 +00:00
sharpsl.c MTD: [NAND] Fix the sharpsl driver after breakage from a core conversion 2006-07-15 13:19:24 +01:00
spia.c [MTD] Refactor NAND hwcontrol to cmd_ctrl 2006-05-23 23:25:53 +02:00
toto.c [MTD] NAND modularize write function 2006-05-26 18:52:08 +02:00
ts7250.c [MTD] NAND: Fix typo in mtd/nand/ts7250.c 2006-06-27 23:20:48 +01:00