]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From: Gerald Schaefer <geraldsc@de.ibm.com> |
2 | Subject: dasd: fix message flood for unsolicited interrupts | |
3 | References: bnc#440610 | |
4 | ||
5 | Symptom: The message log is flooded with messages for unsolicited | |
6 | interrupts and missing sense data. | |
7 | Problem: CIO generates fake IRBs which are falsly interpreted as | |
8 | unsolicited interrupts. | |
9 | Solution: Ignore fake IRBs in unsolicited interupt handler. | |
10 | ||
11 | Acked-by: John Jolly <jjolly@suse.de> | |
12 | --- | |
13 | drivers/s390/cio/qdio.h | 8 ++++++++ | |
14 | drivers/s390/cio/qdio_main.c | 6 ++++++ | |
15 | 2 files changed, 14 insertions(+) | |
16 | ||
17 | Index: linux-sles11/drivers/s390/cio/qdio.h | |
18 | =================================================================== | |
19 | --- linux-sles11.orig/drivers/s390/cio/qdio.h | |
20 | +++ linux-sles11/drivers/s390/cio/qdio.h | |
21 | @@ -16,6 +16,14 @@ | |
22 | #define QDIO_BUSY_BIT_GIVE_UP 2000000 /* 2 seconds = eternity */ | |
23 | #define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */ | |
24 | ||
25 | +/* | |
26 | + * if an asynchronous HiperSockets queue runs full, the 10 seconds timer wait | |
27 | + * till next initiative to give transmitted skbs back to the stack is too long. | |
28 | + * Therefore polling is started in case of multicast queue is filled more | |
29 | + * than 50 percent. | |
30 | + */ | |
31 | +#define QDIO_IQDIO_POLL_LVL 65 /* HS multicast queue */ | |
32 | + | |
33 | enum qdio_irq_states { | |
34 | QDIO_IRQ_STATE_INACTIVE, | |
35 | QDIO_IRQ_STATE_ESTABLISHED, | |
36 | Index: linux-sles11/drivers/s390/cio/qdio_main.c | |
37 | =================================================================== | |
38 | --- linux-sles11.orig/drivers/s390/cio/qdio_main.c | |
39 | +++ linux-sles11/drivers/s390/cio/qdio_main.c | |
40 | @@ -851,6 +851,12 @@ static void __qdio_outbound_processing(s | |
41 | if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q)) | |
42 | return; | |
43 | ||
44 | + if ((queue_type(q) == QDIO_IQDIO_QFMT) && | |
45 | + (atomic_read(&q->nr_buf_used)) > QDIO_IQDIO_POLL_LVL) { | |
46 | + tasklet_schedule(&q->tasklet); | |
47 | + return; | |
48 | + } | |
49 | + | |
50 | if (q->u.out.pci_out_enabled) | |
51 | return; | |
52 |