lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <AANLkTilwtazg_T4cX2EMb2xterwV1lhXdqUe3Q1UcsDN@mail.gmail.com>
Date:	Mon, 7 Jun 2010 08:21:42 -0400
From:	Marc Dionne <marc.c.dionne@...il.com>
To:	Tejun Heo <tj@...nel.org>
Cc:	Robert Hancock <hancockrwd@...il.com>,
	Matthew Garrett <mjg59@...f.ucam.org>,
	Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
	linux-ide@...r.kernel.org, garzik@...hat.com
Subject: Re: Hang during boot, bisected to commit 96d60303fd

On Mon, Jun 7, 2010 at 5:22 AM, Tejun Heo <tj@...nel.org> wrote:
> Hello,
>
> On 06/07/2010 06:34 AM, Robert Hancock wrote:
>> I'm thinking that the hardreset and device classification makes more
>> sense as a place to do this anyways, since that's the point where we
>> really know if there's a device connected or not.. Tejun, any
>> thoughts?
>
> Heh, of course it doesn't work.  Device presence can't be reliably
> determined by sampling status once like that.  We don't have all the
> crap in libata-eh for nothing.  :-)
>
> Marc, can you please try the following patch?
>
> Thanks.
>
> diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
> index 1984a6e..261f86d 100644
> --- a/drivers/ata/libahci.c
> +++ b/drivers/ata/libahci.c
> @@ -541,29 +541,11 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val)
>        return -EINVAL;
>  }
>
> -static int ahci_is_device_present(void __iomem *port_mmio)
> -{
> -       u8 status = readl(port_mmio + PORT_TFDATA) & 0xff;
> -
> -       /* Make sure PxTFD.STS.BSY and PxTFD.STS.DRQ are 0 */
> -       if (status & (ATA_BUSY | ATA_DRQ))
> -               return 0;
> -
> -       /* Make sure PxSSTS.DET is 3h */
> -       status = readl(port_mmio + PORT_SCR_STAT) & 0xf;
> -       if (status != 3)
> -               return 0;
> -       return 1;
> -}
> -
>  void ahci_start_engine(struct ata_port *ap)
>  {
>        void __iomem *port_mmio = ahci_port_base(ap);
>        u32 tmp;
>
> -       if (!ahci_is_device_present(port_mmio))
> -               return;
> -
>        /* start DMA */
>        tmp = readl(port_mmio + PORT_CMD);
>        tmp |= PORT_CMD_START;
> @@ -1892,6 +1874,9 @@ static void ahci_error_handler(struct ata_port *ap)
>        }
>
>        sata_pmp_error_handler(ap);
> +
> +       if (!ata_dev_enabled(ap->link.device))
> +               ahci_stop_engine(ap);
>  }
>
>  static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)
>
> --
> tejun

Hi Tejun,

With that patch the system boots normally.  Out of curiosity I also
instrumented ahci_error_handler a bit, and the stop_engine case
triggers once for the 6 unused ports, but doesn't trigger for the 2
ports with devices (SSD and DVD), as expected.

Feel free to add a Tested-by if you submit it.

Thanks,
Marc
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ