s390/qdio: split qdio_inspect_queue()
authorJulian Wiedmann <jwi@linux.ibm.com>
Fri, 23 Jul 2021 07:16:10 +0000 (09:16 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 6 Dec 2021 13:42:25 +0000 (14:42 +0100)
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>
arch/s390/include/asm/qdio.h
drivers/s390/cio/qdio_main.c
drivers/s390/net/qeth_core_main.c
drivers/s390/scsi/zfcp_qdio.c

index 97356ec27d37754d14441b50adc82c11bb8e82a8..5eb431f59eded1f37260f794f78d41bbcd3e266c 100644 (file)
@@ -352,9 +352,10 @@ extern int do_QDIO(struct ccw_device *cdev, unsigned int callflags, int q_nr,
                   unsigned int bufnr, unsigned int count, struct qaob *aob);
 extern int qdio_start_irq(struct ccw_device *cdev);
 extern int qdio_stop_irq(struct ccw_device *cdev);
-extern int qdio_inspect_queue(struct ccw_device *cdev, unsigned int nr,
-                             bool is_input, unsigned int *bufnr,
-                             unsigned int *error);
+extern int qdio_inspect_input_queue(struct ccw_device *cdev, unsigned int nr,
+                                   unsigned int *bufnr, unsigned int *error);
+extern int qdio_inspect_output_queue(struct ccw_device *cdev, unsigned int nr,
+                                    unsigned int *bufnr, unsigned int *error);
 extern int qdio_shutdown(struct ccw_device *, int);
 extern int qdio_free(struct ccw_device *);
 extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *);
index 35a32240b4ce8c508423741c8afa3d09458502f8..3f047faf59f00b82f7a81c3917e771ea23bcc39f 100644 (file)
@@ -500,6 +500,31 @@ static int get_inbound_buffer_frontier(struct qdio_q *q, unsigned int start,
        }
 }
 
+int qdio_inspect_input_queue(struct ccw_device *cdev, unsigned int nr,
+                            unsigned int *bufnr, unsigned int *error)
+{
+       struct qdio_irq *irq = cdev->private->qdio_data;
+       unsigned int start;
+       struct qdio_q *q;
+       int count;
+
+       if (!irq)
+               return -ENODEV;
+
+       q = irq->input_qs[nr];
+       start = q->first_to_check;
+       *error = 0;
+
+       count = get_inbound_buffer_frontier(q, start, error);
+       if (count == 0)
+               return 0;
+
+       *bufnr = start;
+       q->first_to_check = add_buf(start, count);
+       return count;
+}
+EXPORT_SYMBOL_GPL(qdio_inspect_input_queue);
+
 static inline int qdio_inbound_q_done(struct qdio_q *q, unsigned int start)
 {
        unsigned char state = 0;
@@ -579,6 +604,31 @@ static int get_outbound_buffer_frontier(struct qdio_q *q, unsigned int start,
        }
 }
 
+int qdio_inspect_output_queue(struct ccw_device *cdev, unsigned int nr,
+                             unsigned int *bufnr, unsigned int *error)
+{
+       struct qdio_irq *irq = cdev->private->qdio_data;
+       unsigned int start;
+       struct qdio_q *q;
+       int count;
+
+       if (!irq)
+               return -ENODEV;
+
+       q = irq->output_qs[nr];
+       start = q->first_to_check;
+       *error = 0;
+
+       count = get_outbound_buffer_frontier(q, start, error);
+       if (count == 0)
+               return 0;
+
+       *bufnr = start;
+       q->first_to_check = add_buf(start, count);
+       return count;
+}
+EXPORT_SYMBOL_GPL(qdio_inspect_output_queue);
+
 static int qdio_kick_outbound_q(struct qdio_q *q, unsigned int count,
                                unsigned long aob)
 {
@@ -1284,40 +1334,6 @@ rescan:
 }
 EXPORT_SYMBOL(qdio_start_irq);
 
-static int __qdio_inspect_queue(struct qdio_q *q, unsigned int *bufnr,
-                               unsigned int *error)
-{
-       unsigned int start = q->first_to_check;
-       int count;
-
-       *error = 0;
-       count = q->is_input_q ? get_inbound_buffer_frontier(q, start, error) :
-                               get_outbound_buffer_frontier(q, start, error);
-       if (count == 0)
-               return 0;
-
-       *bufnr = start;
-
-       /* for the next time */
-       q->first_to_check = add_buf(start, count);
-
-       return count;
-}
-
-int qdio_inspect_queue(struct ccw_device *cdev, unsigned int nr, bool is_input,
-                      unsigned int *bufnr, unsigned int *error)
-{
-       struct qdio_irq *irq_ptr = cdev->private->qdio_data;
-       struct qdio_q *q;
-
-       if (!irq_ptr)
-               return -ENODEV;
-       q = is_input ? irq_ptr->input_qs[nr] : irq_ptr->output_qs[nr];
-
-       return __qdio_inspect_queue(q, bufnr, error);
-}
-EXPORT_SYMBOL_GPL(qdio_inspect_queue);
-
 /**
  * qdio_stop_irq - disable interrupt processing for the device
  * @cdev: associated ccw_device for the qdio subchannel
index 26c55f67289f018b4b05f290d31daf31aa7f8edb..8cfbcb6aec075f3fe7dd77e5eca62867494ce6de 100644 (file)
@@ -5850,10 +5850,10 @@ static unsigned int qeth_rx_poll(struct qeth_card *card, int budget)
                /* Fetch completed RX buffers: */
                if (!card->rx.b_count) {
                        card->rx.qdio_err = 0;
-                       card->rx.b_count = qdio_inspect_queue(CARD_DDEV(card),
-                                                             0, true,
-                                                             &card->rx.b_index,
-                                                             &card->rx.qdio_err);
+                       card->rx.b_count =
+                               qdio_inspect_input_queue(CARD_DDEV(card), 0,
+                                                        &card->rx.b_index,
+                                                        &card->rx.qdio_err);
                        if (card->rx.b_count <= 0) {
                                card->rx.b_count = 0;
                                break;
@@ -5900,8 +5900,8 @@ static void qeth_cq_poll(struct qeth_card *card)
                unsigned int start, error;
                int completed;
 
-               completed = qdio_inspect_queue(CARD_DDEV(card), 1, true, &start,
-                                              &error);
+               completed = qdio_inspect_input_queue(CARD_DDEV(card), 1, &start,
+                                                    &error);
                if (completed <= 0)
                        return;
 
@@ -6038,8 +6038,8 @@ static int qeth_tx_poll(struct napi_struct *napi, int budget)
                        return 0;
                }
 
-               completed = qdio_inspect_queue(CARD_DDEV(card), queue_no, false,
-                                              &start, &error);
+               completed = qdio_inspect_output_queue(CARD_DDEV(card), queue_no,
+                                                     &start, &error);
                if (completed <= 0) {
                        /* Ensure we see TX completion for pending work: */
                        if (napi_complete_done(napi, 0) &&
index 6a2720105138df2fb14363cf67f48f2741b77fb7..728945c7062149eb91c2d67236dd821b8113e065 100644 (file)
@@ -79,7 +79,7 @@ static void zfcp_qdio_request_tasklet(struct tasklet_struct *tasklet)
        unsigned int start, error;
        int completed;
 
-       completed = qdio_inspect_queue(cdev, 0, false, &start, &error);
+       completed = qdio_inspect_output_queue(cdev, 0, &start, &error);
        if (completed > 0) {
                if (error) {
                        zfcp_qdio_handler_error(qdio, "qdreqt1", error);
@@ -169,7 +169,7 @@ static void zfcp_qdio_irq_tasklet(struct tasklet_struct *tasklet)
                tasklet_schedule(&qdio->request_tasklet);
 
        /* Check the Response Queue: */
-       completed = qdio_inspect_queue(cdev, 0, true, &start, &error);
+       completed = qdio_inspect_input_queue(cdev, 0, &start, &error);
        if (completed < 0)
                return;
        if (completed > 0)