mirror of
https://github.com/torvalds/linux.git
synced 2026-09-28 12:02:03 +02:00
firewire: core: move allocation/reallocation paths into specific branch after isoc resource management in cdev
After managing the actual isochronous resources, there is post-processing logic to determine what type of event should be notified. However, there is room for improvement. This commit refactors the logic. Link: https://lore.kernel.org/r/20260501135823.241940-5-o-takashi@sakamocchi.jp Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
This commit is contained in:
parent
afa66eeb18
commit
fcabbf40fa
|
|
@ -1331,7 +1331,7 @@ static void iso_resource_auto_work(struct work_struct *work)
|
||||||
unsigned long index = r->resource.handle;
|
unsigned long index = r->resource.handle;
|
||||||
int current_generation, resource_generation, channel, bandwidth, todo;
|
int current_generation, resource_generation, channel, bandwidth, todo;
|
||||||
u64 reset_jiffies;
|
u64 reset_jiffies;
|
||||||
bool free = false, success;
|
bool free;
|
||||||
|
|
||||||
scoped_guard(spinlock_irq, &client->lock) {
|
scoped_guard(spinlock_irq, &client->lock) {
|
||||||
reset_jiffies = client->device->card->reset_jiffies;
|
reset_jiffies = client->device->card->reset_jiffies;
|
||||||
|
|
@ -1364,37 +1364,31 @@ static void iso_resource_auto_work(struct work_struct *work)
|
||||||
fw_iso_resource_manage(client->device->card, current_generation, r->params.channels,
|
fw_iso_resource_manage(client->device->card, current_generation, r->params.channels,
|
||||||
&channel, &bandwidth, todo != ISO_RES_AUTO_DEALLOC);
|
&channel, &bandwidth, todo != ISO_RES_AUTO_DEALLOC);
|
||||||
|
|
||||||
/*
|
|
||||||
* Is this generation outdated already? As long as this resource sticks
|
|
||||||
* in the xarray, it will be scheduled again for a newer generation or at
|
|
||||||
* shutdown.
|
|
||||||
*/
|
|
||||||
if (channel == -EAGAIN &&
|
|
||||||
(todo == ISO_RES_AUTO_ALLOC || todo == ISO_RES_AUTO_REALLOC))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
success = channel >= 0 || bandwidth > 0;
|
|
||||||
|
|
||||||
scoped_guard(spinlock_irq, &client->lock) {
|
|
||||||
// Transit from allocation to reallocation, except if the client
|
|
||||||
// requested deallocation in the meantime.
|
|
||||||
if (r->todo == ISO_RES_AUTO_ALLOC)
|
|
||||||
r->todo = ISO_RES_AUTO_REALLOC;
|
|
||||||
// Allocation or reallocation failure? Pull this resource out of the
|
|
||||||
// xarray and prepare for deletion, unless the client is shutting down.
|
|
||||||
if (r->todo == ISO_RES_AUTO_REALLOC && !success &&
|
|
||||||
!client->in_shutdown &&
|
|
||||||
xa_erase(&client->resource_xa, index)) {
|
|
||||||
client_put(client);
|
|
||||||
free = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (todo == ISO_RES_AUTO_DEALLOC) {
|
if (todo == ISO_RES_AUTO_DEALLOC) {
|
||||||
free = true;
|
free = true;
|
||||||
e = r->e_dealloc;
|
e = r->e_dealloc;
|
||||||
r->e_dealloc = NULL;
|
r->e_dealloc = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
free = false;
|
||||||
|
|
||||||
|
// Is this generation outdated already? As long as this resource sticks in the
|
||||||
|
// xarray, it will be scheduled again for a newer generation or at shutdown.
|
||||||
|
if (channel == -EAGAIN)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
bool success = channel >= 0 || bandwidth > 0;
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
// Allocation or reallocation failure? Pull this resource out of the
|
||||||
|
// xarray and prepare for deletion, unless the client is shutting down.
|
||||||
|
scoped_guard(spinlock_irq, &client->lock) {
|
||||||
|
if (!client->in_shutdown && xa_erase(&client->resource_xa, index)) {
|
||||||
|
client_put(client);
|
||||||
|
free = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (todo == ISO_RES_AUTO_REALLOC) {
|
if (todo == ISO_RES_AUTO_REALLOC) {
|
||||||
if (success)
|
if (success)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -1403,6 +1397,11 @@ static void iso_resource_auto_work(struct work_struct *work)
|
||||||
e = r->e_dealloc;
|
e = r->e_dealloc;
|
||||||
r->e_dealloc = NULL;
|
r->e_dealloc = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
// Transit from allocation to reallocation, except if the client requested
|
||||||
|
// deallocation in the meantime.
|
||||||
|
scoped_guard(spinlock_irq, &client->lock)
|
||||||
|
r->todo = ISO_RES_AUTO_REALLOC;
|
||||||
|
|
||||||
if (channel >= 0)
|
if (channel >= 0)
|
||||||
r->params.channels = 1ULL << channel;
|
r->params.channels = 1ULL << channel;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user