Message ID | Pine.LNX.4.64.1107270946030.7435@axis700.grange (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Thank you for your reply. > Thanks for the report! It is interesting. From your backtrace it looks > like the spin_lock_bh() in sh_dmae_alloc_chan_resources() gets interrupted > by an interrupt on the same channel! I do not understand this, because, > normally no interrupts on DMAC channels occur until data transfers begin > over them. Right. The message/trace looks as if things happen in unexpected order. But after tracing, I found the order is not really bad. 1. sh_dmae_alloc_chan_resources() called and returned 2. sh_dmae_memcpy_issue_pending() -> sh_chan_xfer_ld_queue() -> dma_start() 3. sh_dmae_interrupt() invoked 4. the INFO message printed. Perhaps lockdep issue, or more possibly I've miss-understood the meaning of the checking system and the message? > So, a simple fix would be to replace calls to spin_(un)lock_bh() with > spin_(un)lock_irq() in sh_dmae_alloc_chan_resources(), Yeah! Now it moved to sh_dmae_prep_sg() [<c06b6b50>] __lock_acquire+0x5c4/0xbb4 [<c06b7718>] lock_acquire+0x60/0x74 [<c08bce9c>] _raw_spin_lock_bh+0x3c/0x4c [<c07c3a5c>] sh_dmae_prep_sg+0x110/0x29c [<c07c3c34>] sh_dmae_prep_slave_sg+0x4c/0x88 [<c0815184>] tmio_mmc_start_dma+0x30c/0x3bc [<c0813fd4>] tmio_mmc_request+0xe0/0x2d8 [<c0807bbc>] mmc_wait_for_req+0x12c/0x184 [<c080ca0c>] mmc_app_send_scr+0x15c/0x1e0 [<c080b284>] mmc_sd_setup_card+0x80/0x4a8 [<c080bb20>] mmc_sd_init_card+0xcc/0x664 [<c080c190>] mmc_attach_sd+0xd8/0x228 [<c08078f8>] mmc_rescan+0x24c/0x3e4 [<c06992ec>] process_one_work+0x170/0x4c4 [<c06999d4>] worker_thread+0x19c/0x470 [<c06a041c>] kthread+0x8c/0x90 [<c06675a8>] kernel_thread_exit+0x0/0x8 And then s/_bh/_irq/ in sh_dmae_prep_sg(), it moved to sh_dmae_tx_submit()... [<c06b6b50>] __lock_acquire+0x5c4/0xbb4 [<c06b7718>] lock_acquire+0x60/0x74 [<c08bce9c>] _raw_spin_lock_bh+0x3c/0x4c [<c07c318c>] sh_dmae_tx_submit+0x30/0x138 [<c0815194>] tmio_mmc_start_dma+0x31c/0x3bc ... > .. but I would like to > understand, what kind of interrupts are occurring at that time and why. > Could you please apply the attached below debugging patch and send me the > resulting complete dmesg output? Sure. Attached. Nothing seems to have happened, though. > .. Alternatively, you can choose to wait > until a detailed SMP testing of the SDHI driver takes place, hopefully, in > approximately a week or a bit more. That sounds promising! I would be happy if you spend more time on it than this issue. I think I will study this some more on dma side. Thank you. And sorry for bothering. /yoshii Linux version 3.0.0-00004-g65ae30f-dirty (yoshii@genny) (gcc version 4.4.1 (SG++Re-Built 4.4-93) ) #3701 SMP Wed Jul 27 21:56:24 JST 2011 CPU: ARMv7 Processor [412fc098] revision 8 (ARMv7), cr=10c5347f CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache Machine: ag5evm Memory policy: ECC disabled, Data cache writealloc bootconsole [early_ttySC2] enabled On node 0 totalpages: 131072 free_area_init_node: node 0, pgdat c09a7cc0, node_mem_map c0ec7000 Normal zone: 960 pages used for memmap Normal zone: 0 pages reserved Normal zone: 121920 pages, LIFO batch:31 HighMem zone: 64 pages used for memmap HighMem zone: 8128 pages, LIFO batch:0 PERCPU: Embedded 7 pages/cpu @c12cf000 s4608 r8192 d15872 u32768 pcpu-alloc: s4608 r8192 d15872 u32768 alloc=8*4096 pcpu-alloc: [0] 0 [0] 1 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 130048 Kernel command line: console=ttySC2,115200 earlyprintk=sh-sci.2 memchunk.ceu0=4M debug PID hash table entries: 2048 (order: 1, 8192 bytes) Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) Memory: 512MB = 512MB total Memory: 504572k/504572k available, 19716k reserved, 32768K highmem Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) DMA : 0xf6000000 - 0xffe00000 ( 158 MB) vmalloc : 0xde800000 - 0xe6000000 ( 120 MB) lowmem : 0xc0000000 - 0xde000000 ( 480 MB) pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB) modules : 0xbf000000 - 0xbfe00000 ( 14 MB) .init : 0xc0008000 - 0xc0660000 (6496 kB) .text : 0xc0660000 - 0xc097e99c (3195 kB) .data : 0xc0980000 - 0xc09a8860 ( 163 kB) .bss : 0xc09a8884 - 0xc0ec6490 (5240 kB) Hierarchical RCU implementation. NR_IRQS:1024 nr_irqs:1024 1024 intc: Registered controller 'sh73a0-intcs' with 77 IRQs Console: colour dummy device 80x30 Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar ... MAX_LOCKDEP_SUBCLASSES: 8 ... MAX_LOCK_DEPTH: 48 ... MAX_LOCKDEP_KEYS: 8191 ... CLASSHASH_SIZE: 4096 ... MAX_LOCKDEP_ENTRIES: 16384 ... MAX_LOCKDEP_CHAINS: 32768 ... CHAINHASH_SIZE: 16384 memory used by lock dependency info: 3695 kB per task-struct memory footprint: 1152 bytes sh_tmu.0: used for clock events sh_tmu.0: used for periodic clock events sh_tmu.1: used as clock source Calibrating delay loop... 72.46 BogoMIPS (lpj=282624) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok Calibrating local timer... 98.28MHz. CPU1: failed to come online Brought up 1 CPUs SMP: Total of 1 processors activated (72.46 BogoMIPS). NET: Registered protocol family 16 pfc: sh73a0_pfc handling gpio 0 -> 908 L310 cache controller enabled l2x0: 8 ways, CACHE_ID 0x410000c7, AUX_CTRL 0x02460000, Cache size: 524288 B bio: create slab <bio-0> at 0 i2c-sh_mobile i2c-sh_mobile.0: I2C adapter 0 with bus speed 100000 Hz i2c-sh_mobile i2c-sh_mobile.1: I2C adapter 1 with bus speed 100000 Hz i2c-sh_mobile i2c-sh_mobile.2: I2C adapter 2 with bus speed 100000 Hz i2c-sh_mobile i2c-sh_mobile.3: I2C adapter 3 with bus speed 100000 Hz i2c-sh_mobile i2c-sh_mobile.4: I2C adapter 4 with bus speed 100000 Hz Switching to clocksource sh_tmu.1 platform sh_tmu.0: used for oneshot clock events Switched to NOHz mode on CPU #0 NET: Registered protocol family 2 IP route cache hash table entries: 4096 (order: 2, 16384 bytes) TCP established hash table entries: 16384 (order: 5, 131072 bytes) TCP bind hash table entries: 16384 (order: 7, 589824 bytes) TCP: Hash tables configured (established 16384 bind 16384) TCP reno registered UDP hash table entries: 256 (order: 2, 20480 bytes) UDP-Lite hash table entries: 256 (order: 2, 20480 bytes) NET: Registered protocol family 1 RPC: Registered named UNIX socket transport module. RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. highmem bounce pool size: 64 pages msgmni has been set to 921 io scheduler noop registered (default) start plist test end plist test Console: switching to colour frame buffer device 68x60 graphics fb0: registered sh_mobile_lcdc_fb/mainlcd as 544x961 16bpp. SuperH SCI(F) driver initialized sh-sci.0: ttySC0 at MMIO 0xe6c40000 (irq = 104) is a scifa console [ttySC2] enabled, bootconsole disabled sh-sci.1: ttySC1 at MMIO 0xe6c50000 (irq = 105) is a scifa sh-sci.2: ttySC2 at MMIO 0xe6c60000 (irq = 106) is a scifa sh-sci.3: ttySC3 at MMIO 0xe6c70000 (irq = 107) is a scifa sh-sci.4: ttySC4 at MMIO 0xe6c80000 (irq = 110) is a scifa sh-sci.5: ttySC5 at MMIO 0xe6cb0000 (irq = 111) is a scifa sh-sci.6: ttySC6 at MMIO 0xe6cc0000 (irq = 188) is a scifa sh-sci.7: ttySC7 at MMIO 0xe6cd0000 (irq = 175) is a scifa sh-sci.8: ttySC8 at MMIO 0xe6c30000 (irq = 112) is a scifb smsc911x: Driver version 2008-10-21 smsc911x-mdio: probed smsc911x smsc911x.0: eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0:01, irq=-1) smsc911x smsc911x.0: eth0: MAC Address: 02:00:00:73:a0:02 mousedev: PS/2 mouse device common for all mice sh_mobile_sdhi sh_mobile_sdhi.0: mmc0 base at 0xee100000 clock rate 69 MHz sh_mobile_sdhi sh_mobile_sdhi.1: mmc1 base at 0xee120000 clock rate 69 MHz sh_cmt sh_cmt.10: used for clock events sh_cmt sh_cmt.10: used as clock source sh_tmu sh_tmu.0: kept as earlytimer sh_tmu sh_tmu.1: kept as earlytimer TCP cubic registered NET: Registered protocol family 17 VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 2 Freeing init memory: 6496K ================================= [ INFO: inconsistent lock state ] 3.0.0-00004-g65ae30f-dirty #3701 --------------------------------- inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage. mdev/284 [HC1[1]:SC0[0]:HE0:SE1] takes: (&(&new_sh_chan->desc_lock)->rlock){?.-...}, at: [<c07c3014>] sh_dmae_interrupt+0x14/0xb0 {HARDIRQ-ON-W} state was registered at: [<c06b6b50>] __lock_acquire+0x5c4/0xbb4 [<c06b7718>] lock_acquire+0x60/0x74 [<c08bce9c>] _raw_spin_lock_bh+0x3c/0x4c [<c07c4014>] sh_dmae_alloc_chan_resources+0x1d0/0x2bc [<c07c1d20>] dma_chan_get+0xd8/0x17c [<c07c25d8>] __dma_request_channel+0x140/0x1e4 [<c0814d00>] tmio_mmc_request_dma+0x74/0x10c [<c08b5f98>] tmio_mmc_host_probe+0x228/0x2cc [<c08b618c>] sh_mobile_sdhi_probe+0x150/0x274 [<c07eaa24>] platform_drv_probe+0x18/0x1c [<c07e957c>] driver_probe_device+0x9c/0x1a4 [<c07e9718>] __driver_attach+0x94/0x98 [<c07e8d48>] bus_for_each_dev+0x60/0x8c [<c07e8530>] bus_add_driver+0xa8/0x2a4 [<c07e9d14>] driver_register+0x78/0x18c [<c0660530>] do_one_initcall+0x34/0x184 [<c00083d8>] kernel_init+0xa8/0x134 [<c06675a8>] kernel_thread_exit+0x0/0x8 irq event stamp: 11477 hardirqs last enabled at (11476): [<c08bbecc>] mutex_lock_nested+0x298/0x350 hardirqs last disabled at (11477): [<c0666674>] __irq_svc+0x34/0xa0 softirqs last enabled at (11395): [<c06897a4>] irq_exit+0xa0/0xa4 softirqs last disabled at (11380): [<c06897a4>] irq_exit+0xa0/0xa4 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&(&new_sh_chan->desc_lock)->rlock); <Interrupt> lock(&(&new_sh_chan->desc_lock)->rlock); *** DEADLOCK *** 1 lock held by mdev/284: #0: (sysfs_mutex){+.+.+.}, at: [<c075175c>] sysfs_permission+0x34/0x64 stack backtrace: [<c066c730>] (unwind_backtrace+0x0/0xfc) from [<c06b3378>] (print_usage_bug+0x21c/0x2bc) [<c06b3378>] (print_usage_bug+0x21c/0x2bc) from [<c06b3928>] (mark_lock+0x510/0x740) [<c06b3928>] (mark_lock+0x510/0x740) from [<c06b6bc4>] (__lock_acquire+0x638/0xbb4) [<c06b6bc4>] (__lock_acquire+0x638/0xbb4) from [<c06b7718>] (lock_acquire+0x60/0x74) [<c06b7718>] (lock_acquire+0x60/0x74) from [<c08bcc88>] (_raw_spin_lock+0x34/0x44) [<c08bcc88>] (_raw_spin_lock+0x34/0x44) from [<c07c3014>] (sh_dmae_interrupt+0x14/0xb0) [<c07c3014>] (sh_dmae_interrupt+0x14/0xb0) from [<c06c5f70>] (handle_irq_event_percpu+0x54/0x184) [<c06c5f70>] (handle_irq_event_percpu+0x54/0x184) from [<c06c60dc>] (handle_irq_event+0x3c/0x5c) [<c06c60dc>] (handle_irq_event+0x3c/0x5c) from [<c06c8708>] (handle_fasteoi_irq+0x9c/0x104) [<c06c8708>] (handle_fasteoi_irq+0x9c/0x104) from [<c06c5f0c>] (generic_handle_irq+0x28/0x30) [<c06c5f0c>] (generic_handle_irq+0x28/0x30) from [<c0660058>] (asm_do_IRQ+0x58/0xb8) [<c0660058>] (asm_do_IRQ+0x58/0xb8) from [<c0671aec>] (shmobile_handle_irq_gic+0xc/0x80) Exception stack(0xddb21d78 to 0xddb21dc0) 1d60: 00000000 00000001 1d80: dd98d108 dd4b46e8 00000000 00000000 dd4b46e8 00000001 dd85c808 ddb20000 1da0: 00000015 ddb21e14 00000008 ddb21dc0 c0751768 c0751704 a0000013 ffffffff [<c0671aec>] (shmobile_handle_irq_gic+0xc/0x80) from [<00000001>] (0x1) mmc0: new high speed SD card at address b368 mmcblk0: mmc0:b368 SDC 489 MiB mmcblk0: p1 smsc911x smsc911x.0: eth0: SMSC911x/921x identified at 0xde860000, IRQ: 65 sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD5) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD5) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD1) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD5) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD55) sh_mobile_sdhi sh_mobile_sdhi.1: timeout waiting for hardware interrupt (CMD1)
diff --git a/drivers/dma/shdma.c b/drivers/dma/shdma.c index 0283300..2c6dde6 100644 --- a/drivers/dma/shdma.c +++ b/drivers/dma/shdma.c @@ -848,6 +848,10 @@ static irqreturn_t sh_dmae_interrupt(int irq, void *data) chcr = sh_dmae_readl(sh_chan, CHCR); + if (list_empty(&sh_chan->ld_queue)) + dev_warn(sh_chan->dev, "Spurious interrupt 0x%x on %s\n", + chcr, dma_chan_name(&sh_chan->common)); + if (chcr & CHCR_TE) { /* DMA stop */ dmae_halt(sh_chan);