From owner-svn-src-all@FreeBSD.ORG Fri Mar 29 08:33:19 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 32DEAE3D; Fri, 29 Mar 2013 08:33:19 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 16C5B24B; Fri, 29 Mar 2013 08:33:19 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r2T8XIf4012068; Fri, 29 Mar 2013 08:33:18 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r2T8XIAR012066; Fri, 29 Mar 2013 08:33:18 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201303290833.r2T8XIAR012066@svn.freebsd.org> From: Alexander Motin Date: Fri, 29 Mar 2013 08:33:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r248872 - in head/sys/cam: ata scsi X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Mar 2013 08:33:19 -0000 Author: mav Date: Fri Mar 29 08:33:18 2013 New Revision: 248872 URL: http://svnweb.freebsd.org/changeset/base/248872 Log: Make pre-shutdown flush and spindown routines to not use xpt_polled_action(), but execute the commands in regular way. There is no any reason to cook CPU while the system is still fully operational. After this change polling in CAM is used only for kernel dumping. Modified: head/sys/cam/ata/ata_da.c head/sys/cam/scsi/scsi_da.c Modified: head/sys/cam/ata/ata_da.c ============================================================================== --- head/sys/cam/ata/ata_da.c Fri Mar 29 08:32:49 2013 (r248871) +++ head/sys/cam/ata/ata_da.c Fri Mar 29 08:33:18 2013 (r248872) @@ -1833,11 +1833,10 @@ adaflush(void) { struct cam_periph *periph; struct ada_softc *softc; + union ccb *ccb; int error; CAM_PERIPH_FOREACH(periph, &adadriver) { - union ccb ccb; - /* If we paniced with lock held - not recurse here. */ if (cam_periph_owned(periph)) continue; @@ -1853,10 +1852,8 @@ adaflush(void) continue; } - xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); - - ccb.ccb_h.ccb_state = ADA_CCB_DUMP; - cam_fill_ataio(&ccb.ataio, + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); + cam_fill_ataio(&ccb->ataio, 0, adadone, CAM_DIR_NONE, @@ -1864,18 +1861,14 @@ adaflush(void) NULL, 0, ada_default_timeout*1000); - if (softc->flags & ADA_FLAG_CAN_48BIT) - ata_48bit_cmd(&ccb.ataio, ATA_FLUSHCACHE48, 0, 0, 0); + ata_48bit_cmd(&ccb->ataio, ATA_FLUSHCACHE48, 0, 0, 0); else - ata_28bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0); - xpt_polled_action(&ccb); + ata_28bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0); - error = cam_periph_error(&ccb, - 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); - if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) - cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, - /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + error = cam_periph_runccb(ccb, adaerror, /*cam_flags*/0, + /*sense_flags*/ SF_NO_RECOVERY | SF_NO_RETRY, + softc->disk->d_devstat); if (error != 0) xpt_print(periph->path, "Synchronize cache failed\n"); cam_periph_unlock(periph); @@ -1887,11 +1880,10 @@ adaspindown(uint8_t cmd, int flags) { struct cam_periph *periph; struct ada_softc *softc; + union ccb *ccb; int error; CAM_PERIPH_FOREACH(periph, &adadriver) { - union ccb ccb; - /* If we paniced with lock held - not recurse here. */ if (cam_periph_owned(periph)) continue; @@ -1908,10 +1900,8 @@ adaspindown(uint8_t cmd, int flags) if (bootverbose) xpt_print(periph->path, "spin-down\n"); - xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); - - ccb.ccb_h.ccb_state = ADA_CCB_DUMP; - cam_fill_ataio(&ccb.ataio, + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); + cam_fill_ataio(&ccb->ataio, 0, adadone, CAM_DIR_NONE | flags, @@ -1919,15 +1909,11 @@ adaspindown(uint8_t cmd, int flags) NULL, 0, ada_default_timeout*1000); + ata_28bit_cmd(&ccb->ataio, cmd, 0, 0, 0); - ata_28bit_cmd(&ccb.ataio, cmd, 0, 0, 0); - xpt_polled_action(&ccb); - - error = cam_periph_error(&ccb, - 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); - if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) - cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, - /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + error = cam_periph_runccb(ccb, adaerror, /*cam_flags*/0, + /*sense_flags*/ SF_NO_RECOVERY | SF_NO_RETRY, + softc->disk->d_devstat); if (error != 0) xpt_print(periph->path, "Spin-down disk failed\n"); cam_periph_unlock(periph); Modified: head/sys/cam/scsi/scsi_da.c ============================================================================== --- head/sys/cam/scsi/scsi_da.c Fri Mar 29 08:32:49 2013 (r248871) +++ head/sys/cam/scsi/scsi_da.c Fri Mar 29 08:33:18 2013 (r248872) @@ -2846,11 +2846,10 @@ dashutdown(void * arg, int howto) { struct cam_periph *periph; struct da_softc *softc; + union ccb *ccb; int error; CAM_PERIPH_FOREACH(periph, &dadriver) { - union ccb ccb; - cam_periph_lock(periph); softc = (struct da_softc *)periph->softc; @@ -2864,10 +2863,8 @@ dashutdown(void * arg, int howto) continue; } - xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); - - ccb.ccb_h.ccb_state = DA_CCB_DUMP; - scsi_synchronize_cache(&ccb.csio, + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); + scsi_synchronize_cache(&ccb->csio, /*retries*/0, /*cbfcnp*/dadone, MSG_SIMPLE_Q_TAG, @@ -2876,13 +2873,9 @@ dashutdown(void * arg, int howto) SSD_FULL_SIZE, 60 * 60 * 1000); - xpt_polled_action(&ccb); - - error = cam_periph_error(&ccb, - 0, SF_NO_RECOVERY | SF_NO_RETRY | SF_QUIET_IR, NULL); - if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) - cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, - /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + error = cam_periph_runccb(ccb, daerror, /*cam_flags*/0, + /*sense_flags*/ SF_NO_RECOVERY | SF_NO_RETRY | SF_QUIET_IR, + softc->disk->d_devstat); if (error != 0) xpt_print(periph->path, "Synchronize cache failed\n"); cam_periph_unlock(periph);