summaryrefslogtreecommitdiffstats
path: root/sys/cam/cam_xpt.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cam/cam_xpt.c')
-rw-r--r--sys/cam/cam_xpt.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c
index 79d3023..a5ff305 100644
--- a/sys/cam/cam_xpt.c
+++ b/sys/cam/cam_xpt.c
@@ -2652,20 +2652,25 @@ call_sim:
struct ccb_getdevstats *cgds;
struct cam_eb *bus;
struct cam_et *tar;
+ struct cam_devq *devq;
cgds = &start_ccb->cgds;
bus = path->bus;
tar = path->target;
+ devq = bus->sim->devq;
+ mtx_lock(&devq->send_mtx);
cgds->dev_openings = dev->ccbq.dev_openings;
cgds->dev_active = dev->ccbq.dev_active;
- cgds->devq_openings = dev->ccbq.devq_openings;
- cgds->devq_queued = cam_ccbq_pending_ccb_count(&dev->ccbq);
- cgds->held = dev->ccbq.held;
+ cgds->allocated = dev->ccbq.allocated;
+ cgds->queued = cam_ccbq_pending_ccb_count(&dev->ccbq);
+ cgds->held = cgds->allocated - cgds->dev_active -
+ cgds->queued;
cgds->last_reset = tar->last_reset;
cgds->maxtags = dev->maxtags;
cgds->mintags = dev->mintags;
if (timevalcmp(&tar->last_reset, &bus->last_reset, <))
cgds->last_reset = bus->last_reset;
+ mtx_unlock(&devq->send_mtx);
cgds->ccb_h.status = CAM_REQ_CMP;
}
break;
@@ -3008,7 +3013,6 @@ xpt_polled_action(union ccb *start_ccb)
* can get it before us while we simulate interrupts.
*/
mtx_lock(&devq->send_mtx);
- dev->ccbq.devq_openings--;
dev->ccbq.dev_openings--;
while((devq->send_openings <= 0 || dev->ccbq.dev_openings < 0) &&
(--timeout > 0)) {
@@ -3020,7 +3024,6 @@ xpt_polled_action(union ccb *start_ccb)
camisr_runqueue();
mtx_lock(&devq->send_mtx);
}
- dev->ccbq.devq_openings++;
dev->ccbq.dev_openings++;
mtx_unlock(&devq->send_mtx);
OpenPOWER on IntegriCloud