Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/qdio: split qdio_inspect_queue()

The callers know what type of queue they want to inspect. Introduce
type-specific variants to inspect an {Input,Output} queue, so that we
can avoid one function parameter and some conditional branches in the
hot paths.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>

authored by

Julian Wiedmann and committed by
Heiko Carstens
b44995e5 513251fe

+64 -47
+4 -3
arch/s390/include/asm/qdio.h
··· 352 352 unsigned int bufnr, unsigned int count, struct qaob *aob); 353 353 extern int qdio_start_irq(struct ccw_device *cdev); 354 354 extern int qdio_stop_irq(struct ccw_device *cdev); 355 - extern int qdio_inspect_queue(struct ccw_device *cdev, unsigned int nr, 356 - bool is_input, unsigned int *bufnr, 357 - unsigned int *error); 355 + extern int qdio_inspect_input_queue(struct ccw_device *cdev, unsigned int nr, 356 + unsigned int *bufnr, unsigned int *error); 357 + extern int qdio_inspect_output_queue(struct ccw_device *cdev, unsigned int nr, 358 + unsigned int *bufnr, unsigned int *error); 358 359 extern int qdio_shutdown(struct ccw_device *, int); 359 360 extern int qdio_free(struct ccw_device *); 360 361 extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *);
+50 -34
drivers/s390/cio/qdio_main.c
··· 500 500 } 501 501 } 502 502 503 + int qdio_inspect_input_queue(struct ccw_device *cdev, unsigned int nr, 504 + unsigned int *bufnr, unsigned int *error) 505 + { 506 + struct qdio_irq *irq = cdev->private->qdio_data; 507 + unsigned int start; 508 + struct qdio_q *q; 509 + int count; 510 + 511 + if (!irq) 512 + return -ENODEV; 513 + 514 + q = irq->input_qs[nr]; 515 + start = q->first_to_check; 516 + *error = 0; 517 + 518 + count = get_inbound_buffer_frontier(q, start, error); 519 + if (count == 0) 520 + return 0; 521 + 522 + *bufnr = start; 523 + q->first_to_check = add_buf(start, count); 524 + return count; 525 + } 526 + EXPORT_SYMBOL_GPL(qdio_inspect_input_queue); 527 + 503 528 static inline int qdio_inbound_q_done(struct qdio_q *q, unsigned int start) 504 529 { 505 530 unsigned char state = 0; ··· 603 578 return 0; 604 579 } 605 580 } 581 + 582 + int qdio_inspect_output_queue(struct ccw_device *cdev, unsigned int nr, 583 + unsigned int *bufnr, unsigned int *error) 584 + { 585 + struct qdio_irq *irq = cdev->private->qdio_data; 586 + unsigned int start; 587 + struct qdio_q *q; 588 + int count; 589 + 590 + if (!irq) 591 + return -ENODEV; 592 + 593 + q = irq->output_qs[nr]; 594 + start = q->first_to_check; 595 + *error = 0; 596 + 597 + count = get_outbound_buffer_frontier(q, start, error); 598 + if (count == 0) 599 + return 0; 600 + 601 + *bufnr = start; 602 + q->first_to_check = add_buf(start, count); 603 + return count; 604 + } 605 + EXPORT_SYMBOL_GPL(qdio_inspect_output_queue); 606 606 607 607 static int qdio_kick_outbound_q(struct qdio_q *q, unsigned int count, 608 608 unsigned long aob) ··· 1333 1283 1334 1284 } 1335 1285 EXPORT_SYMBOL(qdio_start_irq); 1336 - 1337 - static int __qdio_inspect_queue(struct qdio_q *q, unsigned int *bufnr, 1338 - unsigned int *error) 1339 - { 1340 - unsigned int start = q->first_to_check; 1341 - int count; 1342 - 1343 - *error = 0; 1344 - count = q->is_input_q ? get_inbound_buffer_frontier(q, start, error) : 1345 - get_outbound_buffer_frontier(q, start, error); 1346 - if (count == 0) 1347 - return 0; 1348 - 1349 - *bufnr = start; 1350 - 1351 - /* for the next time */ 1352 - q->first_to_check = add_buf(start, count); 1353 - 1354 - return count; 1355 - } 1356 - 1357 - int qdio_inspect_queue(struct ccw_device *cdev, unsigned int nr, bool is_input, 1358 - unsigned int *bufnr, unsigned int *error) 1359 - { 1360 - struct qdio_irq *irq_ptr = cdev->private->qdio_data; 1361 - struct qdio_q *q; 1362 - 1363 - if (!irq_ptr) 1364 - return -ENODEV; 1365 - q = is_input ? irq_ptr->input_qs[nr] : irq_ptr->output_qs[nr]; 1366 - 1367 - return __qdio_inspect_queue(q, bufnr, error); 1368 - } 1369 - EXPORT_SYMBOL_GPL(qdio_inspect_queue); 1370 1286 1371 1287 /** 1372 1288 * qdio_stop_irq - disable interrupt processing for the device
+8 -8
drivers/s390/net/qeth_core_main.c
··· 5850 5850 /* Fetch completed RX buffers: */ 5851 5851 if (!card->rx.b_count) { 5852 5852 card->rx.qdio_err = 0; 5853 - card->rx.b_count = qdio_inspect_queue(CARD_DDEV(card), 5854 - 0, true, 5855 - &card->rx.b_index, 5856 - &card->rx.qdio_err); 5853 + card->rx.b_count = 5854 + qdio_inspect_input_queue(CARD_DDEV(card), 0, 5855 + &card->rx.b_index, 5856 + &card->rx.qdio_err); 5857 5857 if (card->rx.b_count <= 0) { 5858 5858 card->rx.b_count = 0; 5859 5859 break; ··· 5900 5900 unsigned int start, error; 5901 5901 int completed; 5902 5902 5903 - completed = qdio_inspect_queue(CARD_DDEV(card), 1, true, &start, 5904 - &error); 5903 + completed = qdio_inspect_input_queue(CARD_DDEV(card), 1, &start, 5904 + &error); 5905 5905 if (completed <= 0) 5906 5906 return; 5907 5907 ··· 6038 6038 return 0; 6039 6039 } 6040 6040 6041 - completed = qdio_inspect_queue(CARD_DDEV(card), queue_no, false, 6042 - &start, &error); 6041 + completed = qdio_inspect_output_queue(CARD_DDEV(card), queue_no, 6042 + &start, &error); 6043 6043 if (completed <= 0) { 6044 6044 /* Ensure we see TX completion for pending work: */ 6045 6045 if (napi_complete_done(napi, 0) &&
+2 -2
drivers/s390/scsi/zfcp_qdio.c
··· 79 79 unsigned int start, error; 80 80 int completed; 81 81 82 - completed = qdio_inspect_queue(cdev, 0, false, &start, &error); 82 + completed = qdio_inspect_output_queue(cdev, 0, &start, &error); 83 83 if (completed > 0) { 84 84 if (error) { 85 85 zfcp_qdio_handler_error(qdio, "qdreqt1", error); ··· 169 169 tasklet_schedule(&qdio->request_tasklet); 170 170 171 171 /* Check the Response Queue: */ 172 - completed = qdio_inspect_queue(cdev, 0, true, &start, &error); 172 + completed = qdio_inspect_input_queue(cdev, 0, &start, &error); 173 173 if (completed < 0) 174 174 return; 175 175 if (completed > 0)