summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2013-03-29 08:33:18 +0000
committermav <mav@FreeBSD.org>2013-03-29 08:33:18 +0000
commitaf8596b2cc62189c01d5688c7cb01de728b219d7 (patch)
tree1d3500ee6f1f7391e8ecd83f62996b0df3ccbd42
parentde46cf4da4c86d0845f64c3825e3bcad5b1fb6df (diff)
downloadFreeBSD-src-af8596b2cc62189c01d5688c7cb01de728b219d7.zip
FreeBSD-src-af8596b2cc62189c01d5688c7cb01de728b219d7.tar.gz
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.
-rw-r--r--sys/cam/ata/ata_da.c44
-rw-r--r--sys/cam/scsi/scsi_da.c19
2 files changed, 21 insertions, 42 deletions
diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c
index e929e51..159091b 100644
--- a/sys/cam/ata/ata_da.c
+++ b/sys/cam/ata/ata_da.c
@@ -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);
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index aaa2a4c..714b1b2 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -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);
OpenPOWER on IntegriCloud