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:
parent
c095756f2e
commit
d00fd0a920
@ -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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user