|
|
@@ -132,6 +132,7 @@ struct airq_info {
|
|
|
struct airq_iv *aiv;
|
|
|
};
|
|
|
static struct airq_info *airq_areas[MAX_AIRQ_AREAS];
|
|
|
+static DEFINE_MUTEX(airq_areas_lock);
|
|
|
|
|
|
#define CCW_CMD_SET_VQ 0x13
|
|
|
#define CCW_CMD_VDEV_RESET 0x33
|
|
|
@@ -244,9 +245,11 @@ static unsigned long get_airq_indicator(struct virtqueue *vqs[], int nvqs,
|
|
|
unsigned long bit, flags;
|
|
|
|
|
|
for (i = 0; i < MAX_AIRQ_AREAS && !indicator_addr; i++) {
|
|
|
+ mutex_lock(&airq_areas_lock);
|
|
|
if (!airq_areas[i])
|
|
|
airq_areas[i] = new_airq_info();
|
|
|
info = airq_areas[i];
|
|
|
+ mutex_unlock(&airq_areas_lock);
|
|
|
if (!info)
|
|
|
return 0;
|
|
|
write_lock_irqsave(&info->lock, flags);
|