[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 c1a7098..af86773 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 e6eabc8..9307512 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;