Your email messages would be easier to work with if they were wrapped after column 72 or so.
On Fri, 9 Aug 2013, Brandt, Todd E wrote: > This patch essentially removes the disk spinup wait time from the system S3 > resume delay. It can be a very significant improvement on systems with large > SATA disks which can take several seconds to spin up. On the systems I've > tested this patch reduces the resume time to around half a second (assuming > no USB devices are consuming that time). Without the patch my systems require > anywhere from 5 to 12 seconds to wakeup from S3 resume depending on the size > of the disks attached. > > This is a rewrite of my first attempt to optimize S3 disk resume time: > http://marc.info/?l=linux-ide&m=136874337908364&w=2 . It's vastly simpler in > that it doesn't make any alterations at all to the pm subsystem to allow > non-blocking resume, it simply enables the ata_port and scsi_disk drivers to > do their work in a non-blocking way. > > Made some alterations to the first draft of the patch, this is v2. > > 1) Added scsi cmd error reporting in response to Oliver's comments. The > sd_resume_async_end function now prints out the same error information that > was printed in the sd_start_stop_device call; including the sense buffer > contents. I didn't add any additional error messages for the ata port wakeup > since, if the port wakeup fails, the error data is printed out by the error > handler process itself, so it doesn't require the ata_port_resume call to > check up on it after the failure. The only potential issue is that the > ata_port_resume_async call sets the ata port device to RPM_ACTIVE even if the > ata_eh_handle_port_resume call fails, but there doesn't appear to be any code > which actually calls pm_runtime_set_suspended for ata_ports at the moment, so > the ata_port appears to always be set to RPM_ACTIVE anyway (please correct me > if I'm wrong). > 2) I created a new ata_port_resume_async function just for the "resume" > callback so that it wouldn't affect the thaw, restore, or runtime resume > callback behaviour (just to be on the safe side). > 3) I also moved the scsi_disk_put call up into the sd_resume_async_end > callback since the reference counter shouldn't be decremented until the disk > is actually finished starting. > > Signed-off-by: Todd Brandt <[email protected]> I will comment only on the sd.c portion. > +static int sd_resume_async(struct device *dev) > +{ > + unsigned char cmd[6] = { START_STOP }; > + struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); > + struct request *req; > + char *sense = NULL; > + > + if (!sdkp->device->manage_start_stop) { > + scsi_disk_put(sdkp); > + return 0; > + } > + > + sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); > + > + cmd[4] |= 1; > + > + if (sdkp->device->start_stop_pwr_cond) > + cmd[4] |= 1 << 4; /* Active or Standby */ > + > + if (!scsi_device_online(sdkp->device)) { > + scsi_disk_put(sdkp); > + return -ENODEV; > + } > + > + req = blk_get_request(sdkp->device->request_queue, 0, __GFP_WAIT); > + if (!req) { > + scsi_disk_put(sdkp); > + return DRIVER_ERROR << 24; > + } > + > + sense = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO); > + if (!sense) { > + __blk_put_request(req->q, req); > + scsi_disk_put(sdkp); > + return DRIVER_ERROR << 24; > + } The usual idiom for situations like this is: if (!scsi_device_online(...)) { rc = -ENODEV; goto err_online; } if (!req) { retval = DRIVER_ERROR << 24; goto err_get_request; } if (!sense) { retval = DRIVER_ERROR << 24; goto err_sense; } ... Also, the return values here don't really make sense. This routine isn't invoked by part of the SCSI stack; it is called (indirectly) by the PM layer. Hence the only sensible error codes are generic things like -ENOMEM or -EIO. Apart from these minor issues, this part seems okay. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

