Skip to content

Commit

Permalink
[S390] qdio: merge inbound and outbound handler functions
Browse files Browse the repository at this point in the history
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: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Jan Glauber authored and Martin Schwidefsky committed Mar 26, 2009
1 parent d303b6f commit 9c8a08d
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 45 deletions.
2 changes: 1 addition & 1 deletion drivers/s390/cio/qdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state,
int auto_ack);
void qdio_check_outbound_after_thinint(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);
int qdio_siga_sync_q(struct qdio_q *q);

Expand Down
62 changes: 19 additions & 43 deletions drivers/s390/cio/qdio_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

qdio_perf_stat_inc(&perf_stats.inbound_handler);

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);
int start = q->first_to_kick;
int end = q->first_to_check;
int 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);
count = sub_buf(end, start);

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 */
q->first_to_kick = q->first_to_check;
q->first_to_kick = end;
q->qdio_error = 0;
}

Expand All @@ -603,7 +604,7 @@ static void __qdio_inbound_processing(struct qdio_q *q)
if (!qdio_inbound_q_moved(q))
return;

qdio_kick_inbound_handler(q);
qdio_kick_handler(q);

if (!qdio_inbound_q_done(q))
/* means poll time is not yet over */
Expand Down Expand Up @@ -736,38 +737,13 @@ static int qdio_kick_outbound_q(struct qdio_q *q)
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)
{
qdio_perf_stat_inc(&perf_stats.tasklet_outbound);
BUG_ON(atomic_read(&q->nr_buf_used) < 0);

if (qdio_outbound_q_moved(q))
qdio_kick_outbound_handler(q);
qdio_kick_handler(q);

if (queue_type(q) == QDIO_ZFCP_QFMT)
if (!pci_out_supported(q) && !qdio_outbound_q_done(q))
Expand Down
2 changes: 1 addition & 1 deletion drivers/s390/cio/qdio_thinint.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ static void __tiqdio_inbound_processing(struct qdio_q *q)
if (!qdio_inbound_q_moved(q))
return;

qdio_kick_inbound_handler(q);
qdio_kick_handler(q);

if (!tiqdio_inbound_q_done(q)) {
qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop);
Expand Down

0 comments on commit 9c8a08d

Please sign in to comment.