hysteresis for CAM_RESRC_UNAVAIL
mjacob at freebsd.org
mjacob at freebsd.org
Thu Sep 28 18:03:29 PDT 2006
On Tue, 26 Sep 2006, Ade Lovett wrote:
>
> On Sep 26, 2006, at 20:18 , mjacob at freebsd.org wrote:
>> I'll redo this with a tunable and send out again. Should I include BUSY
>> status as well?
See attached.
-------------- next part --------------
Index: cam_periph.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/cam_periph.c,v
retrieving revision 1.62
diff -u -r1.62 cam_periph.c
--- cam_periph.c 24 May 2006 15:22:21 -0000 1.62
+++ cam_periph.c 29 Sep 2006 01:03:01 -0000
@@ -86,6 +86,14 @@
MALLOC_DEFINE(M_CAMPERIPH, "CAM periph", "CAM peripheral buffers");
+static int periph_selto_delay = 1000;
+TUNABLE_INT("kern.cam.periph_selto_delay", &periph_selto_delay);
+static int periph_noresrc_delay = 500;
+TUNABLE_INT("kern.cam.periph_noresrc_delay", &periph_noresrc_delay);
+static int periph_busy_delay = 500;
+TUNABLE_INT("kern.cam.periph_busy_delay", &periph_busy_delay);
+
+
void
periphdriver_register(void *data)
{
@@ -1544,7 +1552,7 @@
int error, printed = 0;
int openings;
u_int32_t relsim_flags;
- u_int32_t timeout;
+ u_int32_t timeout = 0;
action_string = NULL;
status = ccb->ccb_h.status;
@@ -1636,11 +1644,11 @@
}
/*
- * Wait a second to give the device
+ * Wait a biit to give the device
* time to recover before we try again.
*/
relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT;
- timeout = 1000;
+ timeout = periph_selto_delay;
break;
}
}
@@ -1699,8 +1707,16 @@
}
break;
case CAM_RESRC_UNAVAIL:
+ /* Wait a bit for the resource shortage to abate. */
+ timeout = periph_noresrc_delay;
+ /* FALLTHROUGH */
case CAM_BUSY:
- /* timeout??? */
+ if (timeout == 0) {
+ /* Wait a bit for the busy condition to abate. */
+ timeout = periph_busy_delay;
+ }
+ relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT;
+ /* FALLTHROUGH */
default:
/* decrement the number of retries */
if (ccb->ccb_h.retry_count > 0) {
More information about the freebsd-scsi
mailing list