firewire: convert client_list_lock to mutex
So far it is only taken in non-atomic contexts. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
Родитель
cf417e5494
Коммит
d67cfb9613
|
@ -24,6 +24,7 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
#include <linux/preempt.h>
|
#include <linux/preempt.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
|
@ -108,7 +109,6 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct fw_device *device;
|
struct fw_device *device;
|
||||||
struct client *client;
|
struct client *client;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
device = fw_device_get_by_devt(inode->i_rdev);
|
device = fw_device_get_by_devt(inode->i_rdev);
|
||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
|
@ -133,9 +133,9 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
|
||||||
|
|
||||||
file->private_data = client;
|
file->private_data = client;
|
||||||
|
|
||||||
spin_lock_irqsave(&device->client_list_lock, flags);
|
mutex_lock(&device->client_list_mutex);
|
||||||
list_add_tail(&client->link, &device->client_list);
|
list_add_tail(&client->link, &device->client_list);
|
||||||
spin_unlock_irqrestore(&device->client_list_lock, flags);
|
mutex_unlock(&device->client_list_mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -232,14 +232,11 @@ for_each_client(struct fw_device *device,
|
||||||
void (*callback)(struct client *client))
|
void (*callback)(struct client *client))
|
||||||
{
|
{
|
||||||
struct client *c;
|
struct client *c;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&device->client_list_lock, flags);
|
|
||||||
|
|
||||||
|
mutex_lock(&device->client_list_mutex);
|
||||||
list_for_each_entry(c, &device->client_list, link)
|
list_for_each_entry(c, &device->client_list, link)
|
||||||
callback(c);
|
callback(c);
|
||||||
|
mutex_unlock(&device->client_list_mutex);
|
||||||
spin_unlock_irqrestore(&device->client_list_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -247,7 +244,7 @@ queue_bus_reset_event(struct client *client)
|
||||||
{
|
{
|
||||||
struct bus_reset *bus_reset;
|
struct bus_reset *bus_reset;
|
||||||
|
|
||||||
bus_reset = kzalloc(sizeof(*bus_reset), GFP_ATOMIC);
|
bus_reset = kzalloc(sizeof(*bus_reset), GFP_KERNEL);
|
||||||
if (bus_reset == NULL) {
|
if (bus_reset == NULL) {
|
||||||
fw_notify("Out of memory when allocating bus reset event\n");
|
fw_notify("Out of memory when allocating bus reset event\n");
|
||||||
return;
|
return;
|
||||||
|
@ -988,7 +985,6 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
|
||||||
struct client *client = file->private_data;
|
struct client *client = file->private_data;
|
||||||
struct event *e, *next_e;
|
struct event *e, *next_e;
|
||||||
struct client_resource *r, *next_r;
|
struct client_resource *r, *next_r;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
if (client->buffer.pages)
|
if (client->buffer.pages)
|
||||||
fw_iso_buffer_destroy(&client->buffer, client->device->card);
|
fw_iso_buffer_destroy(&client->buffer, client->device->card);
|
||||||
|
@ -1007,9 +1003,9 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
|
||||||
list_for_each_entry_safe(e, next_e, &client->event_list, link)
|
list_for_each_entry_safe(e, next_e, &client->event_list, link)
|
||||||
kfree(e);
|
kfree(e);
|
||||||
|
|
||||||
spin_lock_irqsave(&client->device->client_list_lock, flags);
|
mutex_lock(&client->device->client_list_mutex);
|
||||||
list_del(&client->link);
|
list_del(&client->link);
|
||||||
spin_unlock_irqrestore(&client->device->client_list_lock, flags);
|
mutex_unlock(&client->device->client_list_mutex);
|
||||||
|
|
||||||
fw_device_put(client->device);
|
fw_device_put(client->device);
|
||||||
kfree(client);
|
kfree(client);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
#include <linux/rwsem.h>
|
#include <linux/rwsem.h>
|
||||||
#include <linux/semaphore.h>
|
#include <linux/semaphore.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
@ -1005,7 +1006,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
|
||||||
device->node = fw_node_get(node);
|
device->node = fw_node_get(node);
|
||||||
device->node_id = node->node_id;
|
device->node_id = node->node_id;
|
||||||
device->generation = card->generation;
|
device->generation = card->generation;
|
||||||
spin_lock_init(&device->client_list_lock);
|
mutex_init(&device->client_list_mutex);
|
||||||
INIT_LIST_HEAD(&device->client_list);
|
INIT_LIST_HEAD(&device->client_list);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <linux/cdev.h>
|
#include <linux/cdev.h>
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
#include <linux/rwsem.h>
|
#include <linux/rwsem.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/mutex.h>
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
|
|
||||||
enum fw_device_state {
|
enum fw_device_state {
|
||||||
|
@ -65,9 +65,10 @@ struct fw_device {
|
||||||
bool cmc;
|
bool cmc;
|
||||||
struct fw_card *card;
|
struct fw_card *card;
|
||||||
struct device device;
|
struct device device;
|
||||||
/* to prevent deadlocks, never take this lock with card->lock held */
|
|
||||||
spinlock_t client_list_lock;
|
struct mutex client_list_mutex;
|
||||||
struct list_head client_list;
|
struct list_head client_list;
|
||||||
|
|
||||||
u32 *config_rom;
|
u32 *config_rom;
|
||||||
size_t config_rom_length;
|
size_t config_rom_length;
|
||||||
int config_rom_retries;
|
int config_rom_retries;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче