mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-23 08:35:19 -05:00
firewire: core: use guard macro to maintain list of events for userspace clients
The core function maintains events to userspace by list in the instance of client. The concurrent access to the list is protected by spinlock in the instance. This commit uses guard macro to maintain the spinlock. Link: https://lore.kernel.org/r/20240805085408.251763-10-o-takashi@sakamocchi.jp Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
This commit is contained in:
parent
bacf921c42
commit
4f1f91aeca
1 changed files with 12 additions and 15 deletions
|
@ -287,19 +287,17 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
|
|||
static void queue_event(struct client *client, struct event *event,
|
||||
void *data0, size_t size0, void *data1, size_t size1)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
event->v[0].data = data0;
|
||||
event->v[0].size = size0;
|
||||
event->v[1].data = data1;
|
||||
event->v[1].size = size1;
|
||||
|
||||
spin_lock_irqsave(&client->lock, flags);
|
||||
if (client->in_shutdown)
|
||||
kfree(event);
|
||||
else
|
||||
list_add_tail(&event->link, &client->event_list);
|
||||
spin_unlock_irqrestore(&client->lock, flags);
|
||||
scoped_guard(spinlock_irqsave, &client->lock) {
|
||||
if (client->in_shutdown)
|
||||
kfree(event);
|
||||
else
|
||||
list_add_tail(&event->link, &client->event_list);
|
||||
}
|
||||
|
||||
wake_up_interruptible(&client->wait);
|
||||
}
|
||||
|
@ -321,10 +319,10 @@ static int dequeue_event(struct client *client,
|
|||
fw_device_is_shutdown(client->device))
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irq(&client->lock);
|
||||
event = list_first_entry(&client->event_list, struct event, link);
|
||||
list_del(&event->link);
|
||||
spin_unlock_irq(&client->lock);
|
||||
scoped_guard(spinlock_irq, &client->lock) {
|
||||
event = list_first_entry(&client->event_list, struct event, link);
|
||||
list_del(&event->link);
|
||||
}
|
||||
|
||||
total = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(event->v) && total < count; i++) {
|
||||
|
@ -1887,9 +1885,8 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
|
|||
fw_iso_buffer_destroy(&client->buffer, client->device->card);
|
||||
|
||||
/* Freeze client->resource_idr and client->event_list */
|
||||
spin_lock_irq(&client->lock);
|
||||
client->in_shutdown = true;
|
||||
spin_unlock_irq(&client->lock);
|
||||
scoped_guard(spinlock_irq, &client->lock)
|
||||
client->in_shutdown = true;
|
||||
|
||||
wait_event(client->tx_flush_wait, !has_outbound_transactions(client));
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue