s390/qdio: remove internal polling in non-thinint path
authorJulian Wiedmann <jwi@linux.ibm.com>
Tue, 16 Jun 2020 12:13:00 +0000 (14:13 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 20 Jul 2020 08:55:26 +0000 (10:55 +0200)
For non-thinint devices in LPAR, qdio polls an idle Input Queue for a
little while to catch more work. But platform support for thinints has
been around practically _forever_ by now, so this micro-optimization is
seeing 0 actual use. Remove it to reduce the overall complexity of the
hot path.

In the meantime we also grew support for driver-level polling
(eg. NAPI in qeth), so it's quite questionable how useful this would
actually be on current kernels.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/cio/qdio.h
drivers/s390/cio/qdio_main.c

index 7f0aa95..cd2df4f 100644 (file)
@@ -15,7 +15,6 @@
 #define QDIO_BUSY_BIT_PATIENCE         (100 << 12)     /* 100 microseconds */
 #define QDIO_BUSY_BIT_RETRY_DELAY      10              /* 10 milliseconds */
 #define QDIO_BUSY_BIT_RETRIES          1000            /* = 10s retry time */
-#define QDIO_INPUT_THRESHOLD           (500 << 12)     /* 500 microseconds */
 
 enum qdio_irq_states {
        QDIO_IRQ_STATE_INACTIVE,
@@ -181,8 +180,6 @@ struct qdio_input_q {
        /* Batch of SBALs that we processed while polling the queue: */
        unsigned int batch_start;
        unsigned int batch_count;
-       /* last time of noticing incoming data */
-       u64 timestamp;
 };
 
 struct qdio_output_q {
index 0c1f186..4fab8bb 100644 (file)
@@ -510,14 +510,7 @@ static int get_inbound_buffer_frontier(struct qdio_q *q, unsigned int start)
 
 static int qdio_inbound_q_moved(struct qdio_q *q, unsigned int start)
 {
-       int count;
-
-       count = get_inbound_buffer_frontier(q, start);
-
-       if (count && !is_thinint_irq(q->irq_ptr) && MACHINE_IS_LPAR)
-               q->u.in.timestamp = get_tod_clock();
-
-       return count;
+       return get_inbound_buffer_frontier(q, start);
 }
 
 static inline int qdio_inbound_q_done(struct qdio_q *q, unsigned int start)
@@ -535,22 +528,7 @@ static inline int qdio_inbound_q_done(struct qdio_q *q, unsigned int start)
                /* more work coming */
                return 0;
 
-       if (is_thinint_irq(q->irq_ptr))
-               return 1;
-
-       /* don't poll under z/VM */
-       if (MACHINE_IS_VM)
-               return 1;
-
-       /*
-        * At this point we know, that inbound first_to_check
-        * has (probably) not moved (see qdio_inbound_processing).
-        */
-       if (get_tod_clock_fast() > q->u.in.timestamp + QDIO_INPUT_THRESHOLD) {
-               DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in done:%02x", start);
-               return 1;
-       } else
-               return 0;
+       return 1;
 }
 
 static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count)