Re: [RFC PATCH] AHCI: speed up resume

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

 



On Fri, 2008-07-04 at 07:23 +0800, Rafael J. Wysocki wrote:
> On Thursday, 3 of July 2008, Zhang Rui wrote:
> > During S3 resume, AHCI driver sleeps 1 second to wait for the HBA
> reset
> > to finish. This is luxurious, :)
> >
> > According to the AHCI 1.2 spec, We should poll the HOST_CTL
> register,
> > and return error if the host reset is not finished within 1 second.
> >
> > Test results show that the HBA reset can be done quickly(in usecs).
> > And this patch may save nearly 1 second during resume.
> 
> That's a lot.
> 
> How heavily has it been tested?

I only tested it on a SantaRosa laptop.

w/o the patch,
[  469.923186] ahci_pci_device_resume
[  469.936105] PM: Writing back config space on device 0000:00:1f.2 at
offset f (was 200, writing 20a)
[  469.936145] PM: Writing back config space on device 0000:00:1f.2 at
offset 1 (was 2b00007, writing 2b00407)
[  469.936220] PCI: Setting latency timer of device 0000:00:1f.2 to 64
[  470.092053] ata4.00: ACPI cmd ef/03:0c:00:00:00:a0 filtered out
[  470.092053] ata4.00: ACPI cmd ef/03:42:00:00:00:a0 filtered out
[  470.107675] ata4.00: configured for UDMA/33
[  470.942195] ahci_pci_device_resume done

w/ the patch applied, run S3 for more than ten times in a row,
[  571.150339] ahci_pci_device_resume
[  571.163193] ahci_pci_device_resume done
[  578.560382] ahci_pci_device_resume
[  578.576410] ahci_pci_device_resume done
[  586.065037] ahci_pci_device_resume
[  586.080806] ahci_pci_device_resume done
[  770.231756] ahci_pci_device_resume
[  770.244431] ahci_pci_device_resume done
[  777.537985] ahci_pci_device_resume
[  777.553709] ahci_pci_device_resume done
[  784.805554] ahci_pci_device_resume
[  784.819660] ahci_pci_device_resume done
[  791.888451] ahci_pci_device_resume
[  791.905222] ahci_pci_device_resume done
[  798.943719] ahci_pci_device_resume
[  798.959437] ahci_pci_device_resume done
[  806.438784] ahci_pci_device_resume
[  806.452070] ahci_pci_device_resume done
[  813.890609] ahci_pci_device_resume
[  813.903247] ahci_pci_device_resume done
[  821.265956] ahci_pci_device_resume
[  821.278714] ahci_pci_device_resume done
[  828.609051] ahci_pci_device_resume
[  828.621795] ahci_pci_device_resume done
[  835.731528] ahci_pci_device_resume
[  835.744210] ahci_pci_device_resume done

I don't know if this ssleep(1) is required for some platform specific
problems, but this patch does work well for me. :)
Hmm, we'd better get some comments from Tejun Heo first.

thanks,
rui
> 
> > Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx>
> > --
> >  drivers/ata/ahci.c |   17 ++++++++++++++---
> >  1 file changed, 14 insertions(+), 3 deletions(-)
> >
> > Index: linux-2.6/drivers/ata/ahci.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/ata/ahci.c 2007-05-03 11:06:33.000000000
> +0800
> > +++ linux-2.6/drivers/ata/ahci.c      2008-07-02 16:25:54.000000000
> +0800
> > @@ -1073,18 +1073,29 @@
> > 
> >       /* global controller reset */
> >       if (!ahci_skip_host_reset) {
> > +             int delay = msecs_to_jiffies(1000);
> > +             int timeout;
> > +
> >               tmp = readl(mmio + HOST_CTL);
> >               if ((tmp & HOST_RESET) == 0) {
> >                       writel(tmp | HOST_RESET, mmio + HOST_CTL);
> >                       readl(mmio + HOST_CTL); /* flush */
> >               }
> > 
> > -             /* reset must complete within 1 second, or
> > +             /*
> > +              * to perform host reset, OS should set HOST_RESET
> > +              * and poll until this bit is read to be "0"
> > +              * reset must complete within 1 second, or
> >                * the hardware should be considered fried.
> >                */
> > -             ssleep(1);
> > +             timeout = jiffies + delay;
> > +             while (jiffies < timeout) {
> > +                     tmp = readl(mmio + HOST_CTL);
> > +                     if (!(tmp & HOST_RESET))
> > +                             break;
> > +                     cpu_relax();
> > +             }
> > 
> > -             tmp = readl(mmio + HOST_CTL);
> >               if (tmp & HOST_RESET) {
> >                       dev_printk(KERN_ERR, host->dev,
> >                                  "controller reset failed (0x%x)\n",
> tmp);
> >
> >
> >
> >
> 
> 
> 
> --
> "Premature optimization is the root of all evil." - Donald Knuth
> 
> 

_______________________________________________
linux-pm mailing list
linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/linux-pm

[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux