Julian Margetson <runaway@xxxxxxxx> writes: > On 12/19/2015 11:40 AM, Måns Rullgård wrote: >> OK, I've found something. The dma setup errors are benign, caused by >> the driver calling dmaengine_prep_slave_sg() even for non-dma >> operations. The real error is the lock recursion that's reported >> later. I wasn't seeing it since I was running a UP non-preempt kernel. >> With lock debugging enabled, I get the same error. This patch should >> fix it. >> >> ---8<--- >> >From 94c4769d2171ce66079fd486a45e09dd64db62c0 Mon Sep 17 00:00:00 2001 >> From: Mans Rullgard<mans@xxxxxxxxx> >> Date: Sat, 19 Dec 2015 15:26:23 +0000 >> Subject: [PATCH] ata: sata_dwc_460ex: remove incorrect locking >> >> This lock is already taken in ata_scsi_queuecmd() a few levels up the >> call stack so attempting to take it here is an error. Moreover, it is >> pointless in the first place since it only protects a single, atomic >> assignment. >> >> Signed-off-by: Mans Rullgard<mans@xxxxxxxxx> >> --- >> drivers/ata/sata_dwc_460ex.c | 4 +--- >> 1 file changed, 1 insertion(+), 3 deletions(-) >> >> diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c >> index 799df86..5696f39 100644 >> --- a/drivers/ata/sata_dwc_460ex.c >> +++ b/drivers/ata/sata_dwc_460ex.c >> @@ -1001,16 +1001,14 @@ static void sata_dwc_exec_command_by_tag(struct ata_port *ap, >> struct ata_taskfile *tf, >> u8 tag, u32 cmd_issued) >> { >> - unsigned long flags; >> struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap); >> struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap); >> dev_dbg(ap->dev, "%s cmd(0x%02x): %s tag=%d\n", __func__, >> tf->command, >> ata_get_cmd_descript(tf->command), tag); >> - spin_lock_irqsave(&ap->host->lock, flags); >> hsdevp->cmd_issued[tag] = cmd_issued; >> - spin_unlock_irqrestore(&ap->host->lock, flags); >> + >> /* >> * Clear SError before executing a new command. >> * sata_dwc_scr_write and read can not be used here. Clearing the PM > having a problem applying the patch . > > patching file drivers/ata/sata_dwc_460ex.c > Hunk #1 FAILED at 1001 (different line endings). OK, attaching it instead. -- Måns Rullgård
>From 94c4769d2171ce66079fd486a45e09dd64db62c0 Mon Sep 17 00:00:00 2001 From: Mans Rullgard <mans@xxxxxxxxx> Date: Sat, 19 Dec 2015 15:26:23 +0000 Subject: [PATCH] ata: sata_dwc_460ex: remove incorrect locking This lock is already taken in ata_scsi_queuecmd() a few levels up the call stack so attempting to take it here is an error. Moreover, it is pointless in the first place since it only protects a single, atomic assignment. Signed-off-by: Mans Rullgard <mans@xxxxxxxxx> --- drivers/ata/sata_dwc_460ex.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c index 799df86..5696f39 100644 --- a/drivers/ata/sata_dwc_460ex.c +++ b/drivers/ata/sata_dwc_460ex.c @@ -1001,16 +1001,14 @@ static void sata_dwc_exec_command_by_tag(struct ata_port *ap, struct ata_taskfile *tf, u8 tag, u32 cmd_issued) { - unsigned long flags; struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap); struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap); dev_dbg(ap->dev, "%s cmd(0x%02x): %s tag=%d\n", __func__, tf->command, ata_get_cmd_descript(tf->command), tag); - spin_lock_irqsave(&ap->host->lock, flags); hsdevp->cmd_issued[tag] = cmd_issued; - spin_unlock_irqrestore(&ap->host->lock, flags); + /* * Clear SError before executing a new command. * sata_dwc_scr_write and read can not be used here. Clearing the PM -- 2.6.3