[S390] qdio: prevent starvation on PCI devices
If adapter interrupts are not available and traditional IO interrupts are used for qdio the inbound tasklet continued to run if new data arrived. That could possibly block other tasklets scheduled on the same CPU. If new data arrives schedule the tasklet again instead of directly processing the new data. Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
09a308f384
commit
f3eb20fafd
1 changed files with 7 additions and 3 deletions
|
@ -606,7 +606,7 @@ static void qdio_kick_handler(struct qdio_q *q)
|
|||
static void __qdio_inbound_processing(struct qdio_q *q)
|
||||
{
|
||||
qperf_inc(q, tasklet_inbound);
|
||||
again:
|
||||
|
||||
if (!qdio_inbound_q_moved(q))
|
||||
return;
|
||||
|
||||
|
@ -615,7 +615,10 @@ static void __qdio_inbound_processing(struct qdio_q *q)
|
|||
if (!qdio_inbound_q_done(q)) {
|
||||
/* means poll time is not yet over */
|
||||
qperf_inc(q, tasklet_inbound_resched);
|
||||
goto again;
|
||||
if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED)) {
|
||||
tasklet_schedule(&q->tasklet);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
qdio_stop_polling(q);
|
||||
|
@ -625,7 +628,8 @@ static void __qdio_inbound_processing(struct qdio_q *q)
|
|||
*/
|
||||
if (!qdio_inbound_q_done(q)) {
|
||||
qperf_inc(q, tasklet_inbound_resched2);
|
||||
goto again;
|
||||
if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED))
|
||||
tasklet_schedule(&q->tasklet);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue