From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965055AbbLSRT5 (ORCPT ); Sat, 19 Dec 2015 12:19:57 -0500 Received: from unicorn.mansr.com ([81.2.72.234]:50551 "EHLO unicorn.mansr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932651AbbLSRT4 (ORCPT ); Sat, 19 Dec 2015 12:19:56 -0500 From: =?iso-8859-1?Q?M=E5ns_Rullg=E5rd?= To: Julian Margetson Cc: Andy Shevchenko , Andy Shevchenko , Tejun Heo , linux-ide@vger.kernel.org, "linux-kernel\@vger.kernel.org" Subject: Re: [PATCH 1/3] ata: sata_dwc_460ex: use "dmas" DT property to find dma channel References: <1450221935-6034-1-git-send-email-mans@mansr.com> <5673061A.4070700@candw.ms> <56732C04.9040100@candw.ms> <5673F277.2050607@candw.ms> <1450441395.30729.203.camel@linux.intel.com> <5674271B.9090308@candw.ms> <56745BA4.1090607@candw.ms> <56748D85.4060108@candw.ms> <567541EE.9010308@candw.ms> <56758F33.20804@candw.ms> Date: Sat, 19 Dec 2015 17:19:53 +0000 In-Reply-To: <56758F33.20804@candw.ms> (Julian Margetson's message of "Sat, 19 Dec 2015 13:09:07 -0400") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --=-=-= Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Julian Margetson writes: > On 12/19/2015 1:05 PM, M=E5ns Rullg=E5rd wrote: >> Andy Shevchenko writes: >> >>> On Sat, Dec 19, 2015 at 5:40 PM, M=E5ns Rullg=E5rd wro= te: >>> >>>> 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. >>> I suppose the following is a quick fix to avoid preparing descriptor >>> for non-DMA operations (not tested anyhow) >>> >>> a/drivers/ata/sata_dwc_460ex.c >>> +++ b/drivers/ata/sata_dwc_460ex.c >>> @@ -1041,6 +1041,9 @@ static void sata_dwc_qc_prep_by_tag(struct >>> ata_queued_cmd *qc, u8 tag) >>> __func__, ap->port_no, get_dma_dir_descript(qc->dma_di= r), >>> qc->n_elem); >>> >>> + if (!is_slave_direction(qc->dma_dir)) >>> + return; >>> + >>> desc =3D dma_dwc_xfer_setup(qc); >>> if (!desc) { >>> dev_err(ap->dev, "%s: dma_dwc_xfer_setup returns NULL\= n", >> I already have a better patch sitting here. >> >>>> 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. >>>> - spin_lock_irqsave(&ap->host->lock, flags); >>>> hsdevp->cmd_issued[tag] =3D cmd_issued; >>>> - spin_unlock_irqrestore(&ap->host->lock, flags); >>>> + >>> This will create a second empty line, though I don't care it is so mino= r. >> The patch leaves one blank line before the following block comment. I >> think it looks better that way. >> > > Still can't get the patch applied . Sorry, didn't realise it conflicted with an intervening patch I had in my tree. Try this one. --=20 M=E5ns Rullg=E5rd --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-ata-sata_dwc_460ex-remove-incorrect-locking.patch >>From 97c1cdb8a6b933bad2c35b9461c2c15935f2a514 Mon Sep 17 00:00:00 2001 From: Mans Rullgard 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 --- 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 9985749..19d1c5e 100644 --- a/drivers/ata/sata_dwc_460ex.c +++ b/drivers/ata/sata_dwc_460ex.c @@ -995,15 +995,13 @@ 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); 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 --=-=-=--