Save one more register read per command by not reading rqstoutrp register

every time.  The purpose of that register is unlikely output queue overflow
detection, so read it only when its last known (and probably stale now)
value signals overflow.

This reduces CPU load and lock congestion and rises bottleneck in CTL
while doing target mode via two 8Gbps ports from 100K to 120K IOPS.
This commit is contained in:
Alexander Motin 2013-11-10 13:37:44 +00:00
parent c095756f2e
commit d00fd0a920

View File

@ -322,9 +322,13 @@ isp_destroy_handle(ispsoftc_t *isp, uint32_t handle)
void *
isp_getrqentry(ispsoftc_t *isp)
{
isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
if (ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp)) == isp->isp_reqodx) {
return (NULL);
uint32_t next;
next = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
if (next == isp->isp_reqodx) {
isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
if (next == isp->isp_reqodx)
return (NULL);
}
return (ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx));
}