[S390] qdio: speed up multicast traffic on full HiperSocket queue
authorUrsula Braun <ursula.braun@de.ibm.com>
Fri, 10 Oct 2008 19:33:04 +0000 (21:33 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 10 Oct 2008 19:33:46 +0000 (21:33 +0200)
If an asynchronous HiperSockets queue runs full, no further packet
can be sent. In this case the next initiative to give transmitted
skbs back to the stack is triggered only by a 10-seconds qdio timer.
This timer has been introduced for low multicast traffic scenarios
to guarantee freeing of skbs in a limited amount of time. For high
HiperSocket multicast traffic scenarios progress checking on the
outbound queue should be enforced by tasklet rescheduling.

Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/qdio.h
drivers/s390/cio/qdio_main.c

index c1a70985abfaf7d877fa60d4d6f72a78640cf5e9..af867731a5f4c86bedf7688b6095c32da89b721f 100644 (file)
 #define QDIO_BUSY_BIT_GIVE_UP          2000000 /* 2 seconds = eternity */
 #define QDIO_INPUT_THRESHOLD           500     /* 500 microseconds */
 
+/*
+ * if an asynchronous HiperSockets queue runs full, the 10 seconds timer wait
+ * till next initiative to give transmitted skbs back to the stack is too long.
+ * Therefore polling is started in case of multicast queue is filled more
+ * than 50 percent.
+ */
+#define QDIO_IQDIO_POLL_LVL            65      /* HS multicast queue */
+
 enum qdio_irq_states {
        QDIO_IRQ_STATE_INACTIVE,
        QDIO_IRQ_STATE_ESTABLISHED,
index e6eabc853422cc9320c7925099471ec04e48f44b..9307512132fe565f3ea738c7ff2401d9e7a0a552 100644 (file)
@@ -851,6 +851,12 @@ static void __qdio_outbound_processing(struct qdio_q *q)
        if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q))
                return;
 
+       if ((queue_type(q) == QDIO_IQDIO_QFMT) &&
+           (atomic_read(&q->nr_buf_used)) > QDIO_IQDIO_POLL_LVL) {
+               tasklet_schedule(&q->tasklet);
+               return;
+       }
+
        if (q->u.out.pci_out_enabled)
                return;