aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorUrsula Braun <ursula.braun@de.ibm.com>2008-10-10 15:33:04 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2008-10-10 15:33:46 -0400
commit4bcb3a37180ee4dffaef8298f373b334a7bedabb (patch)
treeed8621d5a3763aff53475742d60e9db3cbb4de1d /drivers
parentf6bccf695431da0e9bd773550ae91b8cb9ffb227 (diff)
[S390] qdio: speed up multicast traffic on full HiperSocket queue
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/s390/cio/qdio.h8
-rw-r--r--drivers/s390/cio/qdio_main.c6
2 files changed, 14 insertions, 0 deletions
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
index c1a70985abfa..af867731a5f4 100644
--- a/drivers/s390/cio/qdio.h
+++ b/drivers/s390/cio/qdio.h
@@ -16,6 +16,14 @@
16#define QDIO_BUSY_BIT_GIVE_UP 2000000 /* 2 seconds = eternity */ 16#define QDIO_BUSY_BIT_GIVE_UP 2000000 /* 2 seconds = eternity */
17#define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */ 17#define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */
18 18
19/*
20 * if an asynchronous HiperSockets queue runs full, the 10 seconds timer wait
21 * till next initiative to give transmitted skbs back to the stack is too long.
22 * Therefore polling is started in case of multicast queue is filled more
23 * than 50 percent.
24 */
25#define QDIO_IQDIO_POLL_LVL 65 /* HS multicast queue */
26
19enum qdio_irq_states { 27enum qdio_irq_states {
20 QDIO_IRQ_STATE_INACTIVE, 28 QDIO_IRQ_STATE_INACTIVE,
21 QDIO_IRQ_STATE_ESTABLISHED, 29 QDIO_IRQ_STATE_ESTABLISHED,
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
index e6eabc853422..9307512132fe 100644
--- a/drivers/s390/cio/qdio_main.c
+++ b/drivers/s390/cio/qdio_main.c
@@ -851,6 +851,12 @@ static void __qdio_outbound_processing(struct qdio_q *q)
851 if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q)) 851 if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q))
852 return; 852 return;
853 853
854 if ((queue_type(q) == QDIO_IQDIO_QFMT) &&
855 (atomic_read(&q->nr_buf_used)) > QDIO_IQDIO_POLL_LVL) {
856 tasklet_schedule(&q->tasklet);
857 return;
858 }
859
854 if (q->u.out.pci_out_enabled) 860 if (q->u.out.pci_out_enabled)
855 return; 861 return;
856 862