mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
firewire: core: reduce critical section duration in pre-processing of isoc resource management in cdev
It is preferable for the critical section to be as small as possible. Current implementation of iso_resource_auto_work() function uses a spinlock to control concurrent access to members of fw_card, fw_device, iso_resource_auto structures, however the locking duration could be reduced. This commit refactors to shorten that duration. Link: https://lore.kernel.org/r/20260501135823.241940-2-o-takashi@sakamocchi.jp Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
This commit is contained in:
parent
6dbe7653fa
commit
834b33f9c9
|
|
@ -1329,32 +1329,36 @@ static void iso_resource_auto_work(struct work_struct *work)
|
|||
struct iso_resource_auto *r = from_work(r, work, work.work);
|
||||
struct client *client = r->client;
|
||||
unsigned long index = r->resource.handle;
|
||||
int generation, channel, bandwidth, todo;
|
||||
int current_generation, resource_generation, channel, bandwidth, todo;
|
||||
u64 reset_jiffies;
|
||||
bool skip, free, success;
|
||||
|
||||
scoped_guard(spinlock_irq, &client->lock) {
|
||||
generation = client->device->generation;
|
||||
reset_jiffies = client->device->card->reset_jiffies;
|
||||
current_generation = client->device->generation;
|
||||
resource_generation = r->params.generation;
|
||||
r->params.generation = current_generation;
|
||||
todo = r->todo;
|
||||
// Allow 1000ms grace period for other reallocations.
|
||||
if (todo == ISO_RES_AUTO_ALLOC &&
|
||||
time_is_after_jiffies64(client->device->card->reset_jiffies + secs_to_jiffies(1))) {
|
||||
schedule_iso_resource_auto(r, msecs_to_jiffies(333));
|
||||
skip = true;
|
||||
} else {
|
||||
// We could be called twice within the same generation.
|
||||
skip = todo == ISO_RES_AUTO_REALLOC &&
|
||||
r->params.generation == generation;
|
||||
}
|
||||
free = todo == ISO_RES_AUTO_DEALLOC;
|
||||
r->params.generation = generation;
|
||||
}
|
||||
|
||||
// Allow 1000ms grace period for other reallocations.
|
||||
if (todo == ISO_RES_AUTO_ALLOC &&
|
||||
time_is_after_jiffies64(reset_jiffies + secs_to_jiffies(1))) {
|
||||
schedule_iso_resource_auto(r, msecs_to_jiffies(333));
|
||||
skip = true;
|
||||
} else {
|
||||
// We could be called twice within the same generation.
|
||||
skip = todo == ISO_RES_AUTO_REALLOC &&
|
||||
resource_generation == current_generation;
|
||||
}
|
||||
free = todo == ISO_RES_AUTO_DEALLOC;
|
||||
|
||||
if (skip)
|
||||
goto out;
|
||||
|
||||
bandwidth = r->params.bandwidth;
|
||||
|
||||
fw_iso_resource_manage(client->device->card, generation,
|
||||
fw_iso_resource_manage(client->device->card, current_generation,
|
||||
r->params.channels, &channel, &bandwidth,
|
||||
todo == ISO_RES_AUTO_ALLOC ||
|
||||
todo == ISO_RES_AUTO_REALLOC);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user