aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/s390/cio/qdio_thinint.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c
index 5c4e741d8221..68be6e157126 100644
--- a/drivers/s390/cio/qdio_thinint.c
+++ b/drivers/s390/cio/qdio_thinint.c
@@ -95,9 +95,11 @@ void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr)
95 } 95 }
96} 96}
97 97
98static inline u32 shared_ind_set(void) 98static inline u32 clear_shared_ind(void)
99{ 99{
100 return q_indicators[TIQDIO_SHARED_IND].ind; 100 if (!atomic_read(&q_indicators[TIQDIO_SHARED_IND].count))
101 return 0;
102 return xchg(&q_indicators[TIQDIO_SHARED_IND].ind, 0);
101} 103}
102 104
103/** 105/**
@@ -107,7 +109,7 @@ static inline u32 shared_ind_set(void)
107 */ 109 */
108static void tiqdio_thinint_handler(void *alsi, void *data) 110static void tiqdio_thinint_handler(void *alsi, void *data)
109{ 111{
110 u32 si_used = shared_ind_set(); 112 u32 si_used = clear_shared_ind();
111 struct qdio_q *q; 113 struct qdio_q *q;
112 114
113 last_ai_time = S390_lowcore.int_clock; 115 last_ai_time = S390_lowcore.int_clock;
@@ -150,13 +152,6 @@ static void tiqdio_thinint_handler(void *alsi, void *data)
150 qperf_inc(q, adapter_int); 152 qperf_inc(q, adapter_int);
151 } 153 }
152 rcu_read_unlock(); 154 rcu_read_unlock();
153
154 /*
155 * If the shared indicator was used clear it now after all queues
156 * were processed.
157 */
158 if (si_used && shared_ind_set())
159 xchg(&q_indicators[TIQDIO_SHARED_IND].ind, 0);
160} 155}
161 156
162static int set_subchannel_ind(struct qdio_irq *irq_ptr, int reset) 157static int set_subchannel_ind(struct qdio_irq *irq_ptr, int reset)