提交 9c8a08d7 编写于 作者: J Jan Glauber 提交者: Martin Schwidefsky

[S390] qdio: merge inbound and outbound handler functions

The inbound and outbound handlers are nearly identical if the outbound
handler uses first_to_check as end index instead of last_move. Since both
values are identical at that point the handlers can be merged.
Signed-off-by: NJan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
上级 d303b6fd
...@@ -356,7 +356,7 @@ int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state, ...@@ -356,7 +356,7 @@ int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state,
int auto_ack); int auto_ack);
void qdio_check_outbound_after_thinint(struct qdio_q *q); void qdio_check_outbound_after_thinint(struct qdio_q *q);
int qdio_inbound_q_moved(struct qdio_q *q); int qdio_inbound_q_moved(struct qdio_q *q);
void qdio_kick_inbound_handler(struct qdio_q *q); void qdio_kick_handler(struct qdio_q *q);
void qdio_stop_polling(struct qdio_q *q); void qdio_stop_polling(struct qdio_q *q);
int qdio_siga_sync_q(struct qdio_q *q); int qdio_siga_sync_q(struct qdio_q *q);
......
...@@ -570,29 +570,30 @@ static int qdio_inbound_q_done(struct qdio_q *q) ...@@ -570,29 +570,30 @@ static int qdio_inbound_q_done(struct qdio_q *q)
} }
} }
void qdio_kick_inbound_handler(struct qdio_q *q) void qdio_kick_handler(struct qdio_q *q)
{ {
int count, start, end; int start = q->first_to_kick;
int end = q->first_to_check;
qdio_perf_stat_inc(&perf_stats.inbound_handler); int count;
start = q->first_to_kick;
end = q->first_to_check;
if (end >= start)
count = end - start;
else
count = end + QDIO_MAX_BUFFERS_PER_Q - start;
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "kih s:%3d c:%3d", start, count);
if (unlikely(q->irq_ptr->state != QDIO_IRQ_STATE_ACTIVE)) if (unlikely(q->irq_ptr->state != QDIO_IRQ_STATE_ACTIVE))
return; return;
q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, count = sub_buf(end, start);
start, count, q->irq_ptr->int_parm);
if (q->is_input_q) {
qdio_perf_stat_inc(&perf_stats.inbound_handler);
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "kih s:%3d c:%3d", start, count);
} else {
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "koh: nr:%1d", q->nr);
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "s:%3d c:%3d", start, count);
}
q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, start, count,
q->irq_ptr->int_parm);
/* for the next time */ /* for the next time */
q->first_to_kick = q->first_to_check; q->first_to_kick = end;
q->qdio_error = 0; q->qdio_error = 0;
} }
...@@ -603,7 +604,7 @@ static void __qdio_inbound_processing(struct qdio_q *q) ...@@ -603,7 +604,7 @@ static void __qdio_inbound_processing(struct qdio_q *q)
if (!qdio_inbound_q_moved(q)) if (!qdio_inbound_q_moved(q))
return; return;
qdio_kick_inbound_handler(q); qdio_kick_handler(q);
if (!qdio_inbound_q_done(q)) if (!qdio_inbound_q_done(q))
/* means poll time is not yet over */ /* means poll time is not yet over */
...@@ -736,38 +737,13 @@ static int qdio_kick_outbound_q(struct qdio_q *q) ...@@ -736,38 +737,13 @@ static int qdio_kick_outbound_q(struct qdio_q *q)
return cc; return cc;
} }
static void qdio_kick_outbound_handler(struct qdio_q *q)
{
int start, end, count;
start = q->first_to_kick;
end = q->last_move;
if (end >= start)
count = end - start;
else
count = end + QDIO_MAX_BUFFERS_PER_Q - start;
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "kickouth: %1d", q->nr);
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "s:%3d c:%3d", start, count);
if (unlikely(q->irq_ptr->state != QDIO_IRQ_STATE_ACTIVE))
return;
q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, start, count,
q->irq_ptr->int_parm);
/* for the next time: */
q->first_to_kick = q->last_move;
q->qdio_error = 0;
}
static void __qdio_outbound_processing(struct qdio_q *q) static void __qdio_outbound_processing(struct qdio_q *q)
{ {
qdio_perf_stat_inc(&perf_stats.tasklet_outbound); qdio_perf_stat_inc(&perf_stats.tasklet_outbound);
BUG_ON(atomic_read(&q->nr_buf_used) < 0); BUG_ON(atomic_read(&q->nr_buf_used) < 0);
if (qdio_outbound_q_moved(q)) if (qdio_outbound_q_moved(q))
qdio_kick_outbound_handler(q); qdio_kick_handler(q);
if (queue_type(q) == QDIO_ZFCP_QFMT) if (queue_type(q) == QDIO_ZFCP_QFMT)
if (!pci_out_supported(q) && !qdio_outbound_q_done(q)) if (!pci_out_supported(q) && !qdio_outbound_q_done(q))
......
...@@ -161,7 +161,7 @@ static void __tiqdio_inbound_processing(struct qdio_q *q) ...@@ -161,7 +161,7 @@ static void __tiqdio_inbound_processing(struct qdio_q *q)
if (!qdio_inbound_q_moved(q)) if (!qdio_inbound_q_moved(q))
return; return;
qdio_kick_inbound_handler(q); qdio_kick_handler(q);
if (!tiqdio_inbound_q_done(q)) { if (!tiqdio_inbound_q_done(q)) {
qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop); qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册