]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firewire: ohci: allocate isoc context header by kvmalloc()
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sat, 17 Jan 2026 14:28:19 +0000 (23:28 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 18 Jan 2026 08:18:48 +0000 (17:18 +0900)
Isochronous packet handling now runs in a workqueue context, where page
faults is acceptable.

This commit replaces __get_free_page() with kvmalloc() when allocating the
isochronous context header buffer.

Link: https://lore.kernel.org/r/20260117142823.440811-7-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
drivers/firewire/ohci.c

index 8bba70b65ad7e8a56e3c65988044dbd99c4df73e..888c43940999a356c78fb313b0a10a9f1b751958 100644 (file)
@@ -2958,7 +2958,7 @@ static struct fw_iso_context *ohci_allocate_iso_context(struct fw_card *card,
                                int type, int channel, size_t header_size)
 {
        struct fw_ohci *ohci = fw_ohci(card);
-       void *header __free(free_page) = NULL;
+       void *header __free(kvfree) = NULL;
        struct iso_context *ctx;
        descriptor_callback_t callback;
        u64 *channels;
@@ -3016,7 +3016,7 @@ static struct fw_iso_context *ohci_allocate_iso_context(struct fw_card *card,
 
        if (type != FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL) {
                ctx->sc.header_length = 0;
-               header = (void *) __get_free_page(GFP_KERNEL);
+               header = kvmalloc(PAGE_SIZE, GFP_KERNEL);
                if (!header) {
                        ret = -ENOMEM;
                        goto out;
@@ -3137,7 +3137,7 @@ static void ohci_free_iso_context(struct fw_iso_context *base)
        context_release(&ctx->context);
 
        if (base->type != FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL) {
-               free_page((unsigned long)ctx->sc.header);
+               kvfree(ctx->sc.header);
                ctx->sc.header = NULL;
        }