s390/qdio: optimize state inspection of HW-owned SBALs
When get_buf_states() gets called with count > 1, it scans the corresponding number of SBAL states until it encounters a mismatch. But when these SBALs are in a HW-owned state, the callers don't actually care _how many_ such SBALs are on the queue. If we can't process the first SBAL, we can't process any of the following SBALs either. So when the first SBAL is HW-owned, skip the scan of the remaining SBALs and thus save some CPU time. Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> Reviewed-by: Jens Remus <jremus@linux.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>pull/683/head
parent
5a19d67027
commit
a698e13728
|
|
@ -205,17 +205,22 @@ static inline int get_buf_states(struct qdio_q *q, unsigned int bufnr,
|
||||||
int auto_ack, int merge_pending)
|
int auto_ack, int merge_pending)
|
||||||
{
|
{
|
||||||
unsigned char __state = 0;
|
unsigned char __state = 0;
|
||||||
int i;
|
int i = 1;
|
||||||
|
|
||||||
if (is_qebsm(q))
|
if (is_qebsm(q))
|
||||||
return qdio_do_eqbs(q, state, bufnr, count, auto_ack);
|
return qdio_do_eqbs(q, state, bufnr, count, auto_ack);
|
||||||
|
|
||||||
/* get initial state: */
|
/* get initial state: */
|
||||||
__state = q->slsb.val[bufnr];
|
__state = q->slsb.val[bufnr];
|
||||||
|
|
||||||
|
/* Bail out early if there is no work on the queue: */
|
||||||
|
if (__state & SLSB_OWNER_CU)
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (merge_pending && __state == SLSB_P_OUTPUT_PENDING)
|
if (merge_pending && __state == SLSB_P_OUTPUT_PENDING)
|
||||||
__state = SLSB_P_OUTPUT_EMPTY;
|
__state = SLSB_P_OUTPUT_EMPTY;
|
||||||
|
|
||||||
for (i = 1; i < count; i++) {
|
for (; i < count; i++) {
|
||||||
bufnr = next_buf(bufnr);
|
bufnr = next_buf(bufnr);
|
||||||
|
|
||||||
/* merge PENDING into EMPTY: */
|
/* merge PENDING into EMPTY: */
|
||||||
|
|
@ -228,6 +233,8 @@ static inline int get_buf_states(struct qdio_q *q, unsigned int bufnr,
|
||||||
if (q->slsb.val[bufnr] != __state)
|
if (q->slsb.val[bufnr] != __state)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
*state = __state;
|
*state = __state;
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue