All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: "Martin K. Petersen" <martin.petersen@oracle.com>, tj@kernel.org
Cc: linux-ide@vger.kernel.org
Subject: Re: [PATCH 4/4] libata: Fall back to unqueued READ LOG EXT if the DMA variant fails
Date: Tue, 05 May 2015 08:00:53 +0200	[thread overview]
Message-ID: <55485C95.1010608@suse.de> (raw)
In-Reply-To: <1430790861-30066-4-git-send-email-martin.petersen@oracle.com>

On 05/05/2015 03:54 AM, Martin K. Petersen wrote:
> Some devices advertise support for the READ/WRITE LOG DMA EXT commands
> but fail when we try to issue them. This can lead to queued TRIM being
> unintentionally disabled since the relevant feature flag is located in a
> general purpose log page.
> 
> Fall back to unqueued READ LOG EXT if the DMA variant fails while
> reading a log page.
> 
> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
> ---
>  drivers/ata/libata-eh.c | 12 +++++++++++-
>  include/linux/libata.h  |  1 +
>  2 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
> index 07f41be38fbe..2893563d0537 100644
> --- a/drivers/ata/libata-eh.c
> +++ b/drivers/ata/libata-eh.c
> @@ -1507,13 +1507,17 @@ unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
>  {
>  	struct ata_taskfile tf;
>  	unsigned int err_mask;
> +	bool dma = false;
>  
>  	DPRINTK("read log page - log 0x%x, page 0x%x\n", log, page);
>  
> +retry:
>  	ata_tf_init(dev, &tf);
> -	if (dev->dma_mode && ata_id_has_read_log_dma_ext(dev->id)) {
> +	if (dev->dma_mode && ata_id_has_read_log_dma_ext(dev->id) &&
> +	    !(dev->horkage & ATA_HORKAGE_NO_NCQ_LOG)) {
>  		tf.command = ATA_CMD_READ_LOG_DMA_EXT;
>  		tf.protocol = ATA_PROT_DMA;
> +		dma = true;
>  	} else {
>  		tf.command = ATA_CMD_READ_LOG_EXT;
>  		tf.protocol = ATA_PROT_PIO;
> @@ -1527,6 +1531,12 @@ unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
>  	err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
>  				     buf, sectors * ATA_SECT_SIZE, 0);
>  
> +	if (err_mask && dma) {
> +		dev->horkage |= ATA_HORKAGE_NO_NCQ_LOG;
> +		ata_dev_warn(dev, "READ LOG DMA EXT failed, trying unqueued\n");
> +		goto retry;
> +	}
> +
>  	DPRINTK("EXIT, err_mask=%x\n", err_mask);
>  	return err_mask;
>  }
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index 8dad4a307bb8..c3ef58014b33 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -424,6 +424,7 @@ enum {
>  	ATA_HORKAGE_NOLPM	= (1 << 20),	/* don't use LPM */
>  	ATA_HORKAGE_WD_BROKEN_LPM = (1 << 21),	/* some WDs have broken LPM */
>  	ATA_HORKAGE_ZERO_AFTER_TRIM = (1 << 22),/* guarantees zero after trim */
> +	ATA_HORKAGE_NO_NCQ_LOG	= (1 << 23),	/* don't use NCQ for log read */
>  
>  	 /* DMA mask for user DMA control: User visible values; DO NOT
>  	    renumber */
> 
Reviewed-by: Hannes Reinecke <hare@suse.de>

Cheers,

Hannes

-- 
Dr. Hannes Reinecke		               zSeries & Storage
hare@suse.de			               +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)

  reply	other threads:[~2015-05-05  6:00 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-05  1:54 [PATCH 1/4] libata: Allow NCQ TRIM to be enabled or disabled with a module parameter Martin K. Petersen
2015-05-05  1:54 ` [PATCH 2/4] libata: Expose TRIM capability in sysfs Martin K. Petersen
2015-05-05  5:54   ` Hannes Reinecke
2015-05-05 17:50   ` Christoph Hellwig
2015-05-05 21:54     ` Martin K. Petersen
2015-05-05  1:54 ` [PATCH 3/4] libata: READ LOG DMA EXT support can be in either page 119 or 120 Martin K. Petersen
2015-05-05  6:00   ` Hannes Reinecke
2015-05-05  1:54 ` [PATCH 4/4] libata: Fall back to unqueued READ LOG EXT if the DMA variant fails Martin K. Petersen
2015-05-05  6:00   ` Hannes Reinecke [this message]
2015-06-12 19:58   ` David Milburn
2015-06-14 23:45     ` Martin K. Petersen
2015-06-15 15:24       ` David Milburn
2015-06-16 16:43         ` Martin K. Petersen
2015-05-05  5:51 ` [PATCH 1/4] libata: Allow NCQ TRIM to be enabled or disabled with a module parameter Hannes Reinecke
2015-05-05 13:31 ` Tejun Heo
2015-05-05 14:07   ` Hannes Reinecke
2015-05-05 21:57     ` Martin K. Petersen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55485C95.1010608@suse.de \
    --to=hare@suse.de \
    --cc=linux-ide@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.