Re: [PATCH 1/1] sata_mv: Prevent PIO commands to be defered too long if traffic in progress.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Oct 12, 2009 at 3:44 PM, Gwendal Grignou <gwendal@xxxxxxxxxx> wrote:
> Use excl_link when non NCQ commands are defered, to be sure they are processed
> as soon as outstanding commands are completed. It prevents some commands to be
> defered indifinitely when using a port multiplier.
>
> Signed-off-by: Gwendal Grignou <gwendal@xxxxxxxxxx>

Reviewed-by: Grant Grundler <grundler@xxxxxxxxxx>

thanks,
grant

> ---
>  drivers/ata/sata_mv.c |   29 +++++++++++++++++++++++++++--
>  1 files changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
> index 17f9ff9..6f5093b 100644
> --- a/drivers/ata/sata_mv.c
> +++ b/drivers/ata/sata_mv.c
> @@ -1382,6 +1382,25 @@ static int mv_qc_defer(struct ata_queued_cmd *qc)
>         */
>        if (pp->pp_flags & MV_PP_FLAG_DELAYED_EH)
>                return ATA_DEFER_PORT;
> +
> +       /* PIO commands need exclusive link: no other commands [DMA or PIO]
> +        * can run concurrently.
> +        * set excl_link when we want to send a PIO command in DMA mode
> +        * or a non-NCQ command in NCQ mode.
> +        * When we receive a command from that link, and there are no
> +        * outstanding commands, mark a flag to clear excl_link and let
> +        * the command go through.
> +        */
> +       if (unlikely(ap->excl_link)) {
> +               if (link == ap->excl_link) {
> +                       if (ap->nr_active_links)
> +                               return ATA_DEFER_PORT;
> +                       qc->flags |= ATA_QCFLAG_CLEAR_EXCL;
> +                       return 0;
> +               } else
> +                       return ATA_DEFER_PORT;
> +       }
> +
>        /*
>         * If the port is completely idle, then allow the new qc.
>         */
> @@ -1395,8 +1414,14 @@ static int mv_qc_defer(struct ata_queued_cmd *qc)
>         * doesn't allow it.
>         */
>        if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) &&
> -           (pp->pp_flags & MV_PP_FLAG_NCQ_EN) && ata_is_ncq(qc->tf.protocol))
> -               return 0;
> +           (pp->pp_flags & MV_PP_FLAG_NCQ_EN)) {
> +               if (ata_is_ncq(qc->tf.protocol))
> +                       return 0;
> +               else {
> +                       ap->excl_link = link;
> +                       return ATA_DEFER_PORT;
> +               }
> +       }
>
>        return ATA_DEFER_PORT;
>  }
> --
> 1.5.4.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ide" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux