diff options
author | Takashi Sakamoto <o-takashi@sakamocchi.jp> | 2023-01-20 18:03:42 +0900 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2023-01-23 09:17:43 +0100 |
commit | 13a55d6bb15fa6bf0dcaf997e0676f532f258f52 (patch) | |
tree | e95f3aeb31e343e1c38d597bd5552c5986408c2e /drivers/firewire/core-cdev.c | |
parent | 87978e6ad45a16835cc58234451111091be3c59a (diff) | |
download | linux-13a55d6bb15fa6bf0dcaf997e0676f532f258f52.tar.gz linux-13a55d6bb15fa6bf0dcaf997e0676f532f258f52.tar.bz2 linux-13a55d6bb15fa6bf0dcaf997e0676f532f258f52.zip |
firewire: core: use kref structure to maintain lifetime of data for fw_request structure
Developers have acknowledged that maintenance of lifetime for
fw_transaction structure is effective when handling asynchronous
transaction to IEC 61883-1 FCP region, since the core function allows
multiples listeners to the region. Some of them needs to access to the
payload of request in process context after the callback to listener,
while the core function releases the object for the structure just after
completing the callbacks to listeners.
One of the listeners is character device. Current implementation of the
character device duplicates the object for the payload of transaction,
while it's a cost in kernel memory consumption. The lifetime management
can reduce it.
The typical way to maintain the lifetime is reference count. This commit
uses kref structure as a first step for the purpose.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20230120090344.296451-2-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'drivers/firewire/core-cdev.c')
-rw-r--r-- | drivers/firewire/core-cdev.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index 958aa4662ccb..93dd80d8d4e1 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c @@ -826,12 +826,12 @@ static int ioctl_send_response(struct client *client, union ioctl_arg *arg) if (a->length != fw_get_response_length(r->request)) { ret = -EINVAL; - kfree(r->request); + fw_request_put(r->request); goto out; } if (copy_from_user(r->data, u64_to_uptr(a->data), a->length)) { ret = -EFAULT; - kfree(r->request); + fw_request_put(r->request); goto out; } fw_send_response(r->card, r->request, a->rcode); |