[S390] qdio: add missing tiq_list locking
Add a mutex to protect the tiq_list. Although reading the list is done using RCU adding and removing elements from the list must still happen locked since multiple qdio devices may change the list in parallel otherwise. Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
feed9b62da
commit
b454740246
|
@ -1112,6 +1112,7 @@ int qdio_shutdown(struct ccw_device *cdev, int how)
|
|||
if (!irq_ptr)
|
||||
return -ENODEV;
|
||||
|
||||
BUG_ON(irqs_disabled());
|
||||
DBF_EVENT("qshutdown:%4x", cdev->private->schid.sch_no);
|
||||
|
||||
mutex_lock(&irq_ptr->setup_mutex);
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
/* list of thin interrupt input queues */
|
||||
static LIST_HEAD(tiq_list);
|
||||
DEFINE_MUTEX(tiq_list_lock);
|
||||
|
||||
/* adapter local summary indicator */
|
||||
static unsigned char *tiqdio_alsi;
|
||||
|
@ -95,10 +96,10 @@ void tiqdio_add_input_queues(struct qdio_irq *irq_ptr)
|
|||
if (!css_qdio_omit_svs && irq_ptr->siga_flag.sync)
|
||||
css_qdio_omit_svs = 1;
|
||||
|
||||
for_each_input_queue(irq_ptr, q, i) {
|
||||
mutex_lock(&tiq_list_lock);
|
||||
for_each_input_queue(irq_ptr, q, i)
|
||||
list_add_rcu(&q->entry, &tiq_list);
|
||||
synchronize_rcu();
|
||||
}
|
||||
mutex_unlock(&tiq_list_lock);
|
||||
xchg(irq_ptr->dsci, 1);
|
||||
tasklet_schedule(&tiqdio_tasklet);
|
||||
}
|
||||
|
@ -118,7 +119,10 @@ void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr)
|
|||
/* if establish triggered an error */
|
||||
if (!q || !q->entry.prev || !q->entry.next)
|
||||
continue;
|
||||
|
||||
mutex_lock(&tiq_list_lock);
|
||||
list_del_rcu(&q->entry);
|
||||
mutex_unlock(&tiq_list_lock);
|
||||
synchronize_rcu();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue