Changeset View
Changeset View
Standalone View
Standalone View
sys/cam/scsi/scsi_da.c
Show All 12 Lines | |||||
static int da_poll_period = DA_DEFAULT_POLL_PERIOD; | static int da_poll_period = DA_DEFAULT_POLL_PERIOD; | ||||
static int da_retry_count = DA_DEFAULT_RETRY; | static int da_retry_count = DA_DEFAULT_RETRY; | ||||
static int da_default_timeout = DA_DEFAULT_TIMEOUT; | static int da_default_timeout = DA_DEFAULT_TIMEOUT; | ||||
static sbintime_t da_default_softtimeout = DA_DEFAULT_SOFTTIMEOUT; | static sbintime_t da_default_softtimeout = DA_DEFAULT_SOFTTIMEOUT; | ||||
static int da_send_ordered = DA_DEFAULT_SEND_ORDERED; | static int da_send_ordered = DA_DEFAULT_SEND_ORDERED; | ||||
static int da_disable_wp_detection = 0; | static int da_disable_wp_detection = 0; | ||||
static SYSCTL_NODE(_kern_cam, OID_AUTO, da, CTLFLAG_RD, 0, | static SYSCTL_NODE(_kern_cam, OID_AUTO, da, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, | ||||
"CAM Direct Access Disk driver"); | "CAM Direct Access Disk driver"); | ||||
SYSCTL_INT(_kern_cam_da, OID_AUTO, poll_period, CTLFLAG_RWTUN, | SYSCTL_INT(_kern_cam_da, OID_AUTO, poll_period, CTLFLAG_RWTUN, | ||||
&da_poll_period, 0, "Media polling period in seconds"); | &da_poll_period, 0, "Media polling period in seconds"); | ||||
SYSCTL_INT(_kern_cam_da, OID_AUTO, retry_count, CTLFLAG_RWTUN, | SYSCTL_INT(_kern_cam_da, OID_AUTO, retry_count, CTLFLAG_RWTUN, | ||||
&da_retry_count, 0, "Normal I/O retry count"); | &da_retry_count, 0, "Normal I/O retry count"); | ||||
SYSCTL_INT(_kern_cam_da, OID_AUTO, default_timeout, CTLFLAG_RWTUN, | SYSCTL_INT(_kern_cam_da, OID_AUTO, default_timeout, CTLFLAG_RWTUN, | ||||
&da_default_timeout, 0, "Normal I/O timeout (in seconds)"); | &da_default_timeout, 0, "Normal I/O timeout (in seconds)"); | ||||
SYSCTL_INT(_kern_cam_da, OID_AUTO, send_ordered, CTLFLAG_RWTUN, | SYSCTL_INT(_kern_cam_da, OID_AUTO, send_ordered, CTLFLAG_RWTUN, | ||||
&da_send_ordered, 0, "Send Ordered Tags"); | &da_send_ordered, 0, "Send Ordered Tags"); | ||||
SYSCTL_INT(_kern_cam_da, OID_AUTO, disable_wp_detection, CTLFLAG_RWTUN, | SYSCTL_INT(_kern_cam_da, OID_AUTO, disable_wp_detection, CTLFLAG_RWTUN, | ||||
&da_disable_wp_detection, 0, | &da_disable_wp_detection, 0, | ||||
"Disable detection of write-protected disks"); | "Disable detection of write-protected disks"); | ||||
SYSCTL_PROC(_kern_cam_da, OID_AUTO, default_softtimeout, | SYSCTL_PROC(_kern_cam_da, OID_AUTO, default_softtimeout, | ||||
CTLTYPE_UINT | CTLFLAG_RW, NULL, 0, dasysctlsofttimeout, "I", | CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, NULL, 0, | ||||
dasysctlsofttimeout, "I", | |||||
"Soft I/O timeout (ms)"); | "Soft I/O timeout (ms)"); | ||||
TUNABLE_INT64("kern.cam.da.default_softtimeout", &da_default_softtimeout); | TUNABLE_INT64("kern.cam.da.default_softtimeout", &da_default_softtimeout); | ||||
/* | /* | ||||
* DA_ORDEREDTAG_INTERVAL determines how often, relative | * DA_ORDEREDTAG_INTERVAL determines how often, relative | ||||
* to the default timeout, we check to see whether an ordered | * to the default timeout, we check to see whether an ordered | ||||
* tagged transaction is appropriate to prevent simple tag | * tagged transaction is appropriate to prevent simple tag | ||||
* starvation. Since we'd like to ensure that there is at least | * starvation. Since we'd like to ensure that there is at least | ||||
Show All 24 Lines | |||||
snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number); | snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number); | ||||
sysctl_ctx_init(&softc->sysctl_ctx); | sysctl_ctx_init(&softc->sysctl_ctx); | ||||
cam_periph_lock(periph); | cam_periph_lock(periph); | ||||
softc->flags |= DA_FLAG_SCTX_INIT; | softc->flags |= DA_FLAG_SCTX_INIT; | ||||
cam_periph_unlock(periph); | cam_periph_unlock(periph); | ||||
softc->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&softc->sysctl_ctx, | softc->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&softc->sysctl_ctx, | ||||
SYSCTL_STATIC_CHILDREN(_kern_cam_da), OID_AUTO, tmpstr2, | SYSCTL_STATIC_CHILDREN(_kern_cam_da), OID_AUTO, tmpstr2, | ||||
CTLFLAG_RD, 0, tmpstr, "device_index"); | CTLFLAG_RD | CTLFLAG_MPSAFE, 0, tmpstr, "device_index"); | ||||
if (softc->sysctl_tree == NULL) { | if (softc->sysctl_tree == NULL) { | ||||
printf("dasysctlinit: unable to allocate sysctl tree\n"); | printf("dasysctlinit: unable to allocate sysctl tree\n"); | ||||
da_periph_release(periph, DA_REF_SYSCTL); | da_periph_release(periph, DA_REF_SYSCTL); | ||||
return; | return; | ||||
} | } | ||||
/* | /* | ||||
* Now register the sysctl handler, so the user can change the value on | * Now register the sysctl handler, so the user can change the value on | ||||
* the fly. | * the fly. | ||||
*/ | */ | ||||
SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | ||||
OID_AUTO, "delete_method", CTLTYPE_STRING | CTLFLAG_RWTUN, | OID_AUTO, "delete_method", | ||||
CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_NEEDGIANT, | |||||
softc, 0, dadeletemethodsysctl, "A", | softc, 0, dadeletemethodsysctl, "A", | ||||
"BIO_DELETE execution method"); | "BIO_DELETE execution method"); | ||||
SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | ||||
OID_AUTO, "delete_max", CTLTYPE_U64 | CTLFLAG_RW, | OID_AUTO, "delete_max", | ||||
CTLTYPE_U64 | CTLFLAG_RW | CTLFLAG_NEEDGIANT, | |||||
softc, 0, dadeletemaxsysctl, "Q", | softc, 0, dadeletemaxsysctl, "Q", | ||||
"Maximum BIO_DELETE size"); | "Maximum BIO_DELETE size"); | ||||
SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | ||||
OID_AUTO, "minimum_cmd_size", CTLTYPE_INT | CTLFLAG_RW, | OID_AUTO, "minimum_cmd_size", | ||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, | |||||
&softc->minimum_cmd_size, 0, dacmdsizesysctl, "I", | &softc->minimum_cmd_size, 0, dacmdsizesysctl, "I", | ||||
"Minimum CDB size"); | "Minimum CDB size"); | ||||
SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | ||||
SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | ||||
"trim_count", CTLFLAG_RD, &softc->trim_count, | "trim_count", CTLFLAG_RD, &softc->trim_count, | ||||
"Total number of unmap/dsm commands sent"); | "Total number of unmap/dsm commands sent"); | ||||
SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | ||||
SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | ||||
"trim_ranges", CTLFLAG_RD, &softc->trim_ranges, | "trim_ranges", CTLFLAG_RD, &softc->trim_ranges, | ||||
"Total number of ranges in unmap/dsm commands"); | "Total number of ranges in unmap/dsm commands"); | ||||
SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | ||||
SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | ||||
"trim_lbas", CTLFLAG_RD, &softc->trim_lbas, | "trim_lbas", CTLFLAG_RD, &softc->trim_lbas, | ||||
"Total lbas in the unmap/dsm commands sent"); | "Total lbas in the unmap/dsm commands sent"); | ||||
SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | ||||
OID_AUTO, "zone_mode", CTLTYPE_STRING | CTLFLAG_RD, | OID_AUTO, "zone_mode", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | |||||
softc, 0, dazonemodesysctl, "A", | softc, 0, dazonemodesysctl, "A", | ||||
"Zone Mode"); | "Zone Mode"); | ||||
SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), | ||||
OID_AUTO, "zone_support", CTLTYPE_STRING | CTLFLAG_RD, | OID_AUTO, "zone_support", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | |||||
softc, 0, dazonesupsysctl, "A", | softc, 0, dazonesupsysctl, "A", | ||||
"Zone Support"); | "Zone Support"); | ||||
SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | ||||
SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | ||||
"optimal_seq_zones", CTLFLAG_RD, &softc->optimal_seq_zones, | "optimal_seq_zones", CTLFLAG_RD, &softc->optimal_seq_zones, | ||||
"Optimal Number of Open Sequential Write Preferred Zones"); | "Optimal Number of Open Sequential Write Preferred Zones"); | ||||
SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, | ||||
SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, | ||||
Show All 24 Lines | |||||
#ifdef CAM_IO_STATS | #ifdef CAM_IO_STATS | ||||
/* | /* | ||||
* Now add some useful stats. | * Now add some useful stats. | ||||
* XXX These should live in cam_periph and be common to all periphs | * XXX These should live in cam_periph and be common to all periphs | ||||
*/ | */ | ||||
softc->sysctl_stats_tree = SYSCTL_ADD_NODE(&softc->sysctl_stats_ctx, | softc->sysctl_stats_tree = SYSCTL_ADD_NODE(&softc->sysctl_stats_ctx, | ||||
SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "stats", | SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "stats", | ||||
CTLFLAG_RD, 0, "Statistics"); | CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Statistics"); | ||||
SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, | SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, | ||||
SYSCTL_CHILDREN(softc->sysctl_stats_tree), | SYSCTL_CHILDREN(softc->sysctl_stats_tree), | ||||
OID_AUTO, | OID_AUTO, | ||||
"errors", | "errors", | ||||
CTLFLAG_RD, | CTLFLAG_RD, | ||||
&softc->errors, | &softc->errors, | ||||
0, | 0, | ||||
"Transport errors reported by the SIM"); | "Transport errors reported by the SIM"); | ||||
Show All 12 Lines |