mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-10 00:17:18 +00:00
s390/qdio: don't attempt IRQ avoidance on Output SBALs
Output interrupts are not subject to SLSB-based avoidance, so remove the gratuitous SLSB updates for Output SBALs in ERROR state. Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> Reviewed-by: Benjamin Block <bblock@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
94c43bdaa0
commit
6d76c898d8
@ -423,9 +423,6 @@ static inline void account_sbals(struct qdio_q *q, unsigned int count)
|
|||||||
static void process_buffer_error(struct qdio_q *q, unsigned int start,
|
static void process_buffer_error(struct qdio_q *q, unsigned int start,
|
||||||
int count)
|
int count)
|
||||||
{
|
{
|
||||||
unsigned char state = (q->is_input_q) ? SLSB_P_INPUT_NOT_INIT :
|
|
||||||
SLSB_P_OUTPUT_NOT_INIT;
|
|
||||||
|
|
||||||
q->qdio_error = QDIO_ERROR_SLSB_STATE;
|
q->qdio_error = QDIO_ERROR_SLSB_STATE;
|
||||||
|
|
||||||
/* special handling for no target buffer empty */
|
/* special handling for no target buffer empty */
|
||||||
@ -433,7 +430,7 @@ static void process_buffer_error(struct qdio_q *q, unsigned int start,
|
|||||||
q->sbal[start]->element[15].sflags == 0x10) {
|
q->sbal[start]->element[15].sflags == 0x10) {
|
||||||
qperf_inc(q, target_full);
|
qperf_inc(q, target_full);
|
||||||
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "OUTFULL FTC:%02x", start);
|
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "OUTFULL FTC:%02x", start);
|
||||||
goto set;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBF_ERROR("%4x BUF ERROR", SCH_NO(q));
|
DBF_ERROR("%4x BUF ERROR", SCH_NO(q));
|
||||||
@ -442,13 +439,6 @@ static void process_buffer_error(struct qdio_q *q, unsigned int start,
|
|||||||
DBF_ERROR("F14:%2x F15:%2x",
|
DBF_ERROR("F14:%2x F15:%2x",
|
||||||
q->sbal[start]->element[14].sflags,
|
q->sbal[start]->element[14].sflags,
|
||||||
q->sbal[start]->element[15].sflags);
|
q->sbal[start]->element[15].sflags);
|
||||||
|
|
||||||
set:
|
|
||||||
/*
|
|
||||||
* Interrupts may be avoided as long as the error is present
|
|
||||||
* so change the buffer state immediately to avoid starvation.
|
|
||||||
*/
|
|
||||||
set_buf_states(q, start, state, count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void inbound_primed(struct qdio_q *q, unsigned int start,
|
static inline void inbound_primed(struct qdio_q *q, unsigned int start,
|
||||||
@ -530,6 +520,11 @@ static int get_inbound_buffer_frontier(struct qdio_q *q, unsigned int start)
|
|||||||
return count;
|
return count;
|
||||||
case SLSB_P_INPUT_ERROR:
|
case SLSB_P_INPUT_ERROR:
|
||||||
process_buffer_error(q, start, count);
|
process_buffer_error(q, start, count);
|
||||||
|
/*
|
||||||
|
* Interrupts may be avoided as long as the error is present
|
||||||
|
* so change the buffer state immediately to avoid starvation.
|
||||||
|
*/
|
||||||
|
set_buf_states(q, start, SLSB_P_INPUT_NOT_INIT, count);
|
||||||
if (atomic_sub_return(count, &q->nr_buf_used) == 0)
|
if (atomic_sub_return(count, &q->nr_buf_used) == 0)
|
||||||
qperf_inc(q, inbound_queue_full);
|
qperf_inc(q, inbound_queue_full);
|
||||||
if (q->irq_ptr->perf_stat_enabled)
|
if (q->irq_ptr->perf_stat_enabled)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user