diff options
author | Warner Losh <imp@FreeBSD.org> | 2017-08-24 22:10:58 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2017-08-24 22:10:58 +0000 |
commit | e4c9cba71ff03f0aa6daa924437208b29cffeb40 (patch) | |
tree | 2665b3185a856f3d3156973fc6bf7268fe4f09fd /sys/cam/cam_xpt.c | |
parent | a4658c801e0b38d579a4c38087e51a621851d9b4 (diff) |
Fix 32-bit overflow on latency measurements
o Allow I/O scheduler to gather times on 32-bit systems. We do this by shifting
the sbintime_t over by 8 bits and truncating to 32-bits. This gives us 8.24
time. This is sufficient both in range (256 seconds is about 128x what current
users need) and precision (60ns easily meets the 1ms smallest bucket size
measurements). 64-bit systems are unchanged. Centralize all the time math so
it's easy to tweak tha range / precision tradeoffs in the future.
o While I'm here, the I/O scheduler should be using periph_data rather than
sim_data since it is operating on behalf of the periph.
Differential Review: https://reviews.freebsd.org/D12119
Notes
Notes:
svn path=/head/; revision=322862
Diffstat (limited to 'sys/cam/cam_xpt.c')
-rw-r--r-- | sys/cam/cam_xpt.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index b29c0aa7079f..ec7169dd7b15 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include <cam/cam.h> #include <cam/cam_ccb.h> +#include <cam/cam_iosched.h> #include <cam/cam_periph.h> #include <cam/cam_queue.h> #include <cam/cam_sim.h> @@ -3494,7 +3495,7 @@ xpt_run_devq(struct cam_devq *devq) mtx_lock(mtx); else mtx = NULL; - work_ccb->ccb_h.qos.sim_data = sbinuptime(); // xxx uintprt_t too small 32bit platforms + work_ccb->ccb_h.qos.periph_data = cam_iosched_now(); (*(sim->sim_action))(sim, work_ccb); if (mtx) mtx_unlock(mtx); @@ -4641,7 +4642,7 @@ xpt_done(union ccb *done_ccb) return; /* Store the time the ccb was in the sim */ - done_ccb->ccb_h.qos.sim_data = sbinuptime() - done_ccb->ccb_h.qos.sim_data; + done_ccb->ccb_h.qos.periph_data = cam_iosched_delta_t(done_ccb->ccb_h.qos.periph_data); hash = (done_ccb->ccb_h.path_id + done_ccb->ccb_h.target_id + done_ccb->ccb_h.target_lun) % cam_num_doneqs; queue = &cam_doneqs[hash]; @@ -4664,7 +4665,7 @@ xpt_done_direct(union ccb *done_ccb) return; /* Store the time the ccb was in the sim */ - done_ccb->ccb_h.qos.sim_data = sbinuptime() - done_ccb->ccb_h.qos.sim_data; + done_ccb->ccb_h.qos.periph_data = cam_iosched_delta_t(done_ccb->ccb_h.qos.periph_data); xpt_done_process(&done_ccb->ccb_h); } |