From nobody Fri Sep 25 05:30:02 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00DF550AC2B; Wed, 16 Sep 2026 14:25:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568735; cv=none; b=cgZEJekmTSI3o2pmR+UuF0kqZRgwExpm1pduA8K9anCoMkREEgyzCCiJGAz73es6T7/8AghJpvlkg1u+EzCCdi2HuqKhKmn4kx111a/cgD5+pMIETSi1FuaKMTSwB61jGV7q3kIlnKXPhGD2jZMw2bNQsmdtT+VViRsxKMQesuY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568735; c=relaxed/simple; bh=tu5A/hm9vojiLP4EZ/79AFjJPwERokzgJSRaROMmGHc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=en5lu1Wzetix/0IiIwqVHl0iSBNyY7LrkCVy6hN2lZ44lH17EyBq3WXEpaqg/BrTWl4MOWJf2xFy6g8olqatzYuj/9PqPUfA6wFKq8iP2MMYaRNvLkK8Vl+WbMp2i6NCKpVOcXIDckN1RbOEul2l/CGn3e5UNqR2wK52b1f1/5k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Nm6kalrv; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Nm6kalrv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1789568732; bh=tu5A/hm9vojiLP4EZ/79AFjJPwERokzgJSRaROMmGHc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Nm6kalrvfFhnWtZgUzPKeIWauwig2BytF98OmZgjtOxIe9l0zUoWMavAOu6J1TjU5 dic7glIlnYrkOBXIftfhkUaxt4fkmSrxF065LPcIIJkfBr5/vMASM9e9hQ2SJQZyOp tF34HDTB5Sh49h3b/MroYMlQcvv8hjaJ0Wn3QA9S76E6ddK3+/yYRzKZwppBtjVVIn 9UnHvt+nklv6qt7XPYSMO3T7oMibnsQeN6uP6QsSG0/UHphY5pgEVeinwohWpRR6t3 66uSpzXgyJHvzySkCOB+91J6yXYP7E7x/DBcJZ+sXDXd9FPezu0YyAxSk2FvJSq371 /jMTRsvY1gWOw== Received: from [192.168.0.15] (unknown [100.64.0.170]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id 7816917E01D1; Wed, 16 Sep 2026 16:25:30 +0200 (CEST) From: Detlev Casanova Date: Wed, 16 Sep 2026 10:25:26 -0400 Subject: [PATCH 1/4] media: Add a v4l2 memory allocations tracker Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-v4l2-add-mem-tracker-v1-1-900fa45e3e6a@collabora.com> References: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> In-Reply-To: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> To: Tomasz Figa , Marek Szyprowski , Mauro Carvalho Chehab , Nicolas Dufresne , Benjamin Gaignard , Philipp Zabel , Heiko Stuebner , Ezequiel Garcia Cc: kernel@collabora.com, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Detlev Casanova X-Mailer: b4 0.15.2 This is a wrapper around dma allocation functions to keep track of allocated buffers and expose the list through a per v4l2 device debugfs. This currently doesn't support all kind of memory allocation, only dma_alloc_attrs. The wrapper can therefore be used by drivers, but also by the vb2 allocation functions, so that all buffers are accounted for. Signed-off-by: Detlev Casanova --- drivers/media/common/videobuf2/Makefile | 1 + drivers/media/common/videobuf2/v4l2-allocator.c | 180 +++++++++++++++++= ++++ .../media/common/videobuf2/videobuf2-dma-contig.c | 24 ++- drivers/media/v4l2-core/v4l2-device.c | 4 +- include/media/v4l2-allocator.h | 26 +++ include/media/v4l2-device.h | 2 + include/media/videobuf2-core.h | 2 + 7 files changed, 231 insertions(+), 8 deletions(-) diff --git a/drivers/media/common/videobuf2/Makefile b/drivers/media/common= /videobuf2/Makefile index a6fe3f304685..aa2754731535 100644 --- a/drivers/media/common/videobuf2/Makefile +++ b/drivers/media/common/videobuf2/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 videobuf2-common-objs :=3D videobuf2-core.o videobuf2-common-objs +=3D frame_vector.o +videobuf2-common-objs +=3D v4l2-allocator.o =20 ifeq ($(CONFIG_TRACEPOINTS),y) videobuf2-common-objs +=3D vb2-trace.o diff --git a/drivers/media/common/videobuf2/v4l2-allocator.c b/drivers/medi= a/common/videobuf2/v4l2-allocator.c new file mode 100644 index 000000000000..9dde9d4a342b --- /dev/null +++ b/drivers/media/common/videobuf2/v4l2-allocator.c @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include + +#include +#include +#include +#include +#include + +#define ENTRY_NAME_LEN 64 + +static struct dentry *v4l2_debugfs_dir; + +struct v4l2_allocator { + struct list_head list; + struct mutex lock; + struct dentry *debugfs_dir; + struct dentry *debugfs_entry; +}; + +struct v4l2_allocator_entry { + struct list_head list; + size_t size; + dma_addr_t dma_addr; + char name[ENTRY_NAME_LEN]; + char creator[TASK_COMM_LEN]; + pid_t tgid; + u16 fd; +}; + +static int v4l2_allocator_debugfs_show(struct seq_file *m, void *data) +{ + struct v4l2_device *v4l2_dev =3D m->private; + struct v4l2_allocator *allocator =3D v4l2_dev->v4l2_allocator; + struct v4l2_allocator_entry *entry; + size_t total_size =3D 0; + + if (!allocator) + return 0; + + seq_puts(m, "created-by fd pid = size label\n"); + seq_puts(m, "------------------------------------------------------------= -------------------------\n"); + mutex_lock(&allocator->lock); + list_for_each_entry(entry, &allocator->list, list) { + seq_printf(m, "%-32s%-16u%-16u%-16zu%s\n", + entry->creator, + entry->fd, + entry->tgid, + entry->size, + entry->name); + total_size +=3D entry->size; + } + mutex_unlock(&allocator->lock); + + seq_puts(m, "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n"); + seq_printf(m, "Total size: %zu\n", total_size); + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(v4l2_allocator_debugfs); + +int v4l2_allocator_init(struct v4l2_device *v4l2_dev) +{ + struct v4l2_allocator *allocator; + + allocator =3D kzalloc_obj(*allocator); + if (!allocator) + return -ENOMEM; + + INIT_LIST_HEAD(&allocator->list); + mutex_init(&allocator->lock); + v4l2_dev->v4l2_allocator =3D allocator; + + if (!v4l2_debugfs_dir) + v4l2_debugfs_dir =3D debugfs_create_dir("v4l2", NULL); + + allocator->debugfs_dir =3D debugfs_create_dir(dev_name(v4l2_dev->dev), + v4l2_debugfs_dir); + allocator->debugfs_entry =3D debugfs_create_file("mem", 0444, + allocator->debugfs_dir, + v4l2_dev, + &v4l2_allocator_debugfs_fops); + + return 0; +} +EXPORT_SYMBOL_GPL(v4l2_allocator_init); + +void v4l2_allocator_cleanup(struct v4l2_device *v4l2_dev) +{ + struct v4l2_allocator *allocator =3D v4l2_dev->v4l2_allocator; + struct v4l2_allocator_entry *entry, *tmp; + + if (allocator) { + debugfs_remove(allocator->debugfs_entry); + debugfs_remove(allocator->debugfs_dir); + mutex_lock(&allocator->lock); + list_for_each_entry_safe(entry, tmp, &allocator->list, list) { + list_del(&entry->list); + kfree(entry); + } + mutex_unlock(&allocator->lock); + mutex_destroy(&allocator->lock); + kfree(allocator); + v4l2_dev->v4l2_allocator =3D NULL; + } +} +EXPORT_SYMBOL_GPL(v4l2_allocator_cleanup); + +static int v4l2_allocator_add(struct v4l2_device *v4l2_dev, size_t size, + dma_addr_t dma_addr, const char *name) +{ + struct v4l2_allocator *allocator =3D v4l2_dev->v4l2_allocator; + struct v4l2_allocator_entry *entry; + + if (!allocator) + return -EINVAL; + + entry =3D kzalloc_obj(*entry); + if (!entry) + return -ENOMEM; + + entry->size =3D size; + entry->dma_addr =3D dma_addr; + strscpy(entry->name, name, sizeof(entry->name)); + get_task_comm(entry->creator, current->group_leader); + entry->tgid =3D current->tgid; + + mutex_lock(&allocator->lock); + list_add(&entry->list, &allocator->list); + mutex_unlock(&allocator->lock); + + return 0; +} + +static void v4l2_allocator_remove(struct v4l2_device *v4l2_dev, size_t siz= e, dma_addr_t dma_addr) +{ + struct v4l2_allocator *allocator =3D v4l2_dev->v4l2_allocator; + struct v4l2_allocator_entry *entry, *tmp; + + if (!allocator) + return; + + mutex_lock(&allocator->lock); + list_for_each_entry_safe(entry, tmp, &allocator->list, list) { + if (entry->size =3D=3D size && entry->dma_addr =3D=3D dma_addr) { + list_del(&entry->list); + mutex_unlock(&allocator->lock); + kfree(entry); + return; + } + } + mutex_unlock(&allocator->lock); +} + +void *v4l2_dma_alloc_attrs(struct v4l2_device *v4l2_dev, struct device *de= v, + size_t size, dma_addr_t *dma_handle, + gfp_t flag, unsigned long attrs, const char *name) +{ + void *ret =3D dma_alloc_attrs(dev, size, dma_handle, flag, attrs); + + if (ret && v4l2_dev) + v4l2_allocator_add(v4l2_dev, size, *dma_handle, name); + + return ret; +} +EXPORT_SYMBOL_GPL(v4l2_dma_alloc_attrs); + +void v4l2_dma_free_attrs(struct v4l2_device *v4l2_dev, struct device *dev, + size_t size, void *cpu_addr, + dma_addr_t dma_handle, unsigned long attrs) +{ + if (v4l2_dev) + v4l2_allocator_remove(v4l2_dev, size, dma_handle); + + dma_free_attrs(dev, size, cpu_addr, dma_handle, attrs); +} +EXPORT_SYMBOL_GPL(v4l2_dma_free_attrs); + diff --git a/drivers/media/common/videobuf2/videobuf2-dma-contig.c b/driver= s/media/common/videobuf2/videobuf2-dma-contig.c index 9ce6284cd5f2..b6b7ddc96b9c 100644 --- a/drivers/media/common/videobuf2/videobuf2-dma-contig.c +++ b/drivers/media/common/videobuf2/videobuf2-dma-contig.c @@ -22,6 +22,7 @@ #include #include #include +#include =20 struct vb2_dc_buf { struct device *dev; @@ -43,6 +44,7 @@ struct vb2_dc_buf { struct dma_buf_attachment *db_attach; =20 struct vb2_buffer *vb; + struct v4l2_device *v4l2_dev; bool non_coherent_mem; }; =20 @@ -181,8 +183,10 @@ static void vb2_dc_put(void *buf_priv) sg_free_table(buf->sgt_base); kfree(buf->sgt_base); } - dma_free_attrs(buf->dev, buf->size, buf->cookie, - buf->dma_addr, buf->attrs); + + v4l2_dma_free_attrs(buf->v4l2_dev, buf->dev, buf->size, buf->cookie, + buf->dma_addr, buf->attrs); + } put_device(buf->dev); kfree(buf); @@ -191,12 +195,17 @@ static void vb2_dc_put(void *buf_priv) static int vb2_dc_alloc_coherent(struct vb2_dc_buf *buf) { struct vb2_queue *q =3D buf->vb->vb2_queue; + char name[64] =3D {0}; + + sprintf(name, "%s-%d", q->name, buf->vb->index); =20 - buf->cookie =3D dma_alloc_attrs(buf->dev, - buf->size, - &buf->dma_addr, - GFP_KERNEL | q->gfp_flags, - buf->attrs); + buf->cookie =3D v4l2_dma_alloc_attrs(buf->v4l2_dev, + buf->dev, + buf->size, + &buf->dma_addr, + GFP_KERNEL | q->gfp_flags, + buf->attrs, + name); if (!buf->cookie) return -ENOMEM; =20 @@ -246,6 +255,7 @@ static void *vb2_dc_alloc(struct vb2_buffer *vb, buf->dma_dir =3D vb->vb2_queue->dma_dir; buf->vb =3D vb; buf->non_coherent_mem =3D vb->vb2_queue->non_coherent_mem; + buf->v4l2_dev =3D vb->vb2_queue->v4l2_dev; =20 buf->size =3D size; /* Prevent the device from being released while the buffer is used */ diff --git a/drivers/media/v4l2-core/v4l2-device.c b/drivers/media/v4l2-cor= e/v4l2-device.c index 67e3073de132..3cce2b4bc4c7 100644 --- a/drivers/media/v4l2-core/v4l2-device.c +++ b/drivers/media/v4l2-core/v4l2-device.c @@ -13,6 +13,7 @@ #include #include #include +#include =20 int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev) { @@ -38,7 +39,7 @@ int v4l2_device_register(struct device *dev, struct v4l2_= device *v4l2_dev) dev->driver->name, dev_name(dev)); if (!dev_get_drvdata(dev)) dev_set_drvdata(dev, v4l2_dev); - return 0; + return v4l2_allocator_init(v4l2_dev); } EXPORT_SYMBOL_GPL(v4l2_device_register); =20 @@ -93,6 +94,7 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev) * unregistered before. */ if (v4l2_dev =3D=3D NULL || !v4l2_dev->name[0]) return; + v4l2_allocator_cleanup(v4l2_dev); v4l2_device_disconnect(v4l2_dev); =20 /* Unregister subdevs */ diff --git a/include/media/v4l2-allocator.h b/include/media/v4l2-allocator.h new file mode 100644 index 000000000000..f3fe0da10321 --- /dev/null +++ b/include/media/v4l2-allocator.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * V4L2 Memory Allocator - Track memory allocations and deallocations in t= he v4l2 device. + * + * It provides functions to allocate and free memory while keeping + * track of the allocations for debugging and analysis purposes. + * + * Copyright 2026 Collabora, Ltd. + * Detlev Casanova + */ + +#include +#include + +#include + +int v4l2_allocator_init(struct v4l2_device *v4l2_dev); +void v4l2_allocator_cleanup(struct v4l2_device *v4l2_dev); + +void *v4l2_dma_alloc_attrs(struct v4l2_device *v4l2_dev, struct device *de= v, + size_t size, dma_addr_t *dma_handle, + gfp_t flag, unsigned long attrs, const char *name); + +void v4l2_dma_free_attrs(struct v4l2_device *v4l2_dev, struct device *dev, + size_t size, void *cpu_addr, + dma_addr_t dma_handle, unsigned long attrs); diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h index 25f69b1b8db0..c2b882d32012 100644 --- a/include/media/v4l2-device.h +++ b/include/media/v4l2-device.h @@ -14,6 +14,7 @@ #include =20 struct v4l2_ctrl_handler; +struct v4l2_allocator; =20 /** * struct v4l2_device - main struct to for V4L2 device drivers @@ -46,6 +47,7 @@ struct v4l2_device { struct device *dev; struct media_device *mdev; struct list_head subdevs; + struct v4l2_allocator *v4l2_allocator; spinlock_t lock; char name[36]; void (*notify)(struct v4l2_subdev *sd, diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index 4424d481d7f7..83a5aea34f3c 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -19,6 +19,7 @@ #include #include #include +#include =20 #define VB2_MAX_FRAME (32) #define VB2_MAX_PLANES (8) @@ -602,6 +603,7 @@ struct vb2_queue { unsigned int type; unsigned int io_modes; struct device *dev; + struct v4l2_device *v4l2_dev; unsigned long dma_attrs; unsigned int bidirectional:1; unsigned int fileio_read_once:1; --=20 2.55.0 From nobody Fri Sep 25 05:30:02 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B170A51477A; Wed, 16 Sep 2026 14:25:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568737; cv=none; b=paiWxzQmHV7HxhSpr7RiX7m0DTSc/BV1qmX6MS2aSqA4aBDNGdx3snZVED3mQwwilRTS/5iBBZmJ5zlcV6tkrkh18mlsfpUR29iYqPtwtQxvPoVpzjdjIVdLRjGTQN6PXKNP6CFAHIdpSAxQEB5N4jHODyPMcur68ocLeDEHb+s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568737; c=relaxed/simple; bh=Fxe8yW3F1jNzKsru3sFOSL1At3sZumtvqZQlyoS5WYU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=H5hNJkPUZHC0fpz3Tgj44/5kfmtzC4BwSKthqpQTx/5xv8SN5asWJCWMkYYja6dIz1nmTnDSP8lpiZbH7qIxaCWNHQ3nSiW+f/Y2qsfNPixeLBNdnseGigM+9rNbQHrrWD7SebTkhSkl/135o3Gf0LKenJm+7dy8K9Z6I9ErEhQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=kaeMnSd1; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="kaeMnSd1" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1789568734; bh=Fxe8yW3F1jNzKsru3sFOSL1At3sZumtvqZQlyoS5WYU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kaeMnSd1+Nle9exhcSlW7s2cTufLBn7oxmmsA9ZcJkgt4L2v9ZZ3gYuOAyACaaV5q 72EIlf0O9gclljHKtvi5l+2/o/ElRAM2n03IWfrqInJknfMX/RZsunNa2sTt34PDep A8Uzz0b7UGOtdxkySvSe8YqEAd/5+EAzpYlK22wmq10z9cFOzgfN6Y9P0ujhE50uxx Kg/P8Te0Qyy5vn+dM3VPar6G3TC5jBRmgTJVuRsHuNaCheye/4cjMfadCRslAhO731 3UMaO3VR8k2mgpNM9Fh66MICToQpXvM8cg+lcgaRTtOPjrszvWyjv4d9pHTIYzLANM haw8eI7M+/mNQ== Received: from [192.168.0.15] (unknown [100.64.0.170]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id 6356817E047B; Wed, 16 Sep 2026 16:25:32 +0200 (CEST) From: Detlev Casanova Date: Wed, 16 Sep 2026 10:25:27 -0400 Subject: [PATCH 2/4] media: Store v4l2_fh in the vb_queue Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-v4l2-add-mem-tracker-v1-2-900fa45e3e6a@collabora.com> References: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> In-Reply-To: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> To: Tomasz Figa , Marek Szyprowski , Mauro Carvalho Chehab , Nicolas Dufresne , Benjamin Gaignard , Philipp Zabel , Heiko Stuebner , Ezequiel Garcia Cc: kernel@collabora.com, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Detlev Casanova X-Mailer: b4 0.15.2 To be able to show the fd in the debug fs, add the v4l2_fh pointer to the queue so that vb2 allocations can retrieve it. Signed-off-by: Detlev Casanova --- drivers/media/common/videobuf2/v4l2-allocator.c | 16 +++++++++++----- drivers/media/common/videobuf2/videobuf2-dma-contig.c | 1 + include/media/v4l2-allocator.h | 2 +- include/media/videobuf2-core.h | 1 + 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/media/common/videobuf2/v4l2-allocator.c b/drivers/medi= a/common/videobuf2/v4l2-allocator.c index 9dde9d4a342b..935fbbacd667 100644 --- a/drivers/media/common/videobuf2/v4l2-allocator.c +++ b/drivers/media/common/videobuf2/v4l2-allocator.c @@ -108,8 +108,8 @@ void v4l2_allocator_cleanup(struct v4l2_device *v4l2_de= v) } EXPORT_SYMBOL_GPL(v4l2_allocator_cleanup); =20 -static int v4l2_allocator_add(struct v4l2_device *v4l2_dev, size_t size, - dma_addr_t dma_addr, const char *name) +static int v4l2_allocator_add(struct v4l2_device *v4l2_dev, size_t size, d= ma_addr_t dma_addr, + struct v4l2_fh *fh, const char *name) { struct v4l2_allocator *allocator =3D v4l2_dev->v4l2_allocator; struct v4l2_allocator_entry *entry; @@ -125,7 +125,13 @@ static int v4l2_allocator_add(struct v4l2_device *v4l2= _dev, size_t size, entry->dma_addr =3D dma_addr; strscpy(entry->name, name, sizeof(entry->name)); get_task_comm(entry->creator, current->group_leader); - entry->tgid =3D current->tgid; + if (fh) { + entry->fd =3D fh->fd; + entry->tgid =3D fh->tgid; + } else { + entry->fd =3D 0; + entry->tgid =3D current->tgid; + } =20 mutex_lock(&allocator->lock); list_add(&entry->list, &allocator->list); @@ -156,12 +162,12 @@ static void v4l2_allocator_remove(struct v4l2_device = *v4l2_dev, size_t size, dma =20 void *v4l2_dma_alloc_attrs(struct v4l2_device *v4l2_dev, struct device *de= v, size_t size, dma_addr_t *dma_handle, - gfp_t flag, unsigned long attrs, const char *name) + gfp_t flag, unsigned long attrs, struct v4l2_fh *fh, const char *nam= e) { void *ret =3D dma_alloc_attrs(dev, size, dma_handle, flag, attrs); =20 if (ret && v4l2_dev) - v4l2_allocator_add(v4l2_dev, size, *dma_handle, name); + v4l2_allocator_add(v4l2_dev, size, *dma_handle, fh, name); =20 return ret; } diff --git a/drivers/media/common/videobuf2/videobuf2-dma-contig.c b/driver= s/media/common/videobuf2/videobuf2-dma-contig.c index b6b7ddc96b9c..30e136dd02b7 100644 --- a/drivers/media/common/videobuf2/videobuf2-dma-contig.c +++ b/drivers/media/common/videobuf2/videobuf2-dma-contig.c @@ -205,6 +205,7 @@ static int vb2_dc_alloc_coherent(struct vb2_dc_buf *buf) &buf->dma_addr, GFP_KERNEL | q->gfp_flags, buf->attrs, + q->v4l2_fh, name); if (!buf->cookie) return -ENOMEM; diff --git a/include/media/v4l2-allocator.h b/include/media/v4l2-allocator.h index f3fe0da10321..cdf0569bea0a 100644 --- a/include/media/v4l2-allocator.h +++ b/include/media/v4l2-allocator.h @@ -19,7 +19,7 @@ void v4l2_allocator_cleanup(struct v4l2_device *v4l2_dev); =20 void *v4l2_dma_alloc_attrs(struct v4l2_device *v4l2_dev, struct device *de= v, size_t size, dma_addr_t *dma_handle, - gfp_t flag, unsigned long attrs, const char *name); + gfp_t flag, unsigned long attrs, struct v4l2_fh *fh, const char *nam= e); =20 void v4l2_dma_free_attrs(struct v4l2_device *v4l2_dev, struct device *dev, size_t size, void *cpu_addr, diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index 83a5aea34f3c..aa47f1c7c9d1 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -604,6 +604,7 @@ struct vb2_queue { unsigned int io_modes; struct device *dev; struct v4l2_device *v4l2_dev; + struct v4l2_fh *v4l2_fh; unsigned long dma_attrs; unsigned int bidirectional:1; unsigned int fileio_read_once:1; --=20 2.55.0 From nobody Fri Sep 25 05:30:02 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C32B5519928; Wed, 16 Sep 2026 14:25:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568740; cv=none; b=dlAtwUDTLu7X8AWJif4I0wacCu1iciyYQSoAx4Z0DD4/wAzhlyR6NK0GaHL+WmJ6dYXCXxNAmosRkk962GPSTqVg1rt3bQ975M4pVAIL920yoTfjrj4Jg6JfXl39ui/ClHoms/YUnSUYjU0MSAGFtldqkXxDdzl7GWjnPecvnuc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568740; c=relaxed/simple; bh=XNxacR9rRNpYWb2+YGNWFMZ9uT1v868SDz6zTGPQgD8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QGM7BFqWsnNwJ2Sv9xyAwjxvkwahFL6Twqa/E3Lpn0C4t2+65C1Or02SWSPs6kFPizdKMlqYdOLEqIojoHiYPfgyR7/rreprv0jT3qoAqDDejXwT+5QIeXZJHRN/v7vOihso/ZLzZQtj9BGxPipU7V3AhalhX3njuInwdWU1y4A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=qMlPOTzo; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="qMlPOTzo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1789568736; bh=XNxacR9rRNpYWb2+YGNWFMZ9uT1v868SDz6zTGPQgD8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qMlPOTzoIx3WLYjPXmwJpQJBfmPvgAyOOlYZBcg0kMxDCVimSYl2ukIrNX/z0dnJw Vy4QivtqsE29LaeIAfyOqC+DXYaI6nBnjEdMzenWCu/kO7w8P5t69MBCWE0ieiN9s1 0K+Aa7P78rIMDVesrR6kosccywKMDBvmCLoOA8BzkM87ZNJE8RE1oAsYLfNled5QTY QY4gicHCyBvc/yEKf5nRdWtl7cZ7c8THjZ8v1iTZMtMAVOYN8umL7B2akz6vNR2efj MlCwGyA+4r82lnkHMeNe+K2svZ+UWKFKg1BPEL+cAii5csQwH7kPoJk9XnbpMBuGSZ BIjWFGOS12dQg== Received: from [192.168.0.15] (unknown [100.64.0.170]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4B61C17E09B5; Wed, 16 Sep 2026 16:25:34 +0200 (CEST) From: Detlev Casanova Date: Wed, 16 Sep 2026 10:25:28 -0400 Subject: [PATCH 3/4] media: verisilicon: Switch to tracked dma allocations Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-v4l2-add-mem-tracker-v1-3-900fa45e3e6a@collabora.com> References: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> In-Reply-To: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> To: Tomasz Figa , Marek Szyprowski , Mauro Carvalho Chehab , Nicolas Dufresne , Benjamin Gaignard , Philipp Zabel , Heiko Stuebner , Ezequiel Garcia Cc: kernel@collabora.com, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Detlev Casanova X-Mailer: b4 0.15.2 Use the newly introduced v4l2_dma_alloc_attrs and v4l2_dma_free_attrs functions to track all dma allocations and have them exposed to userspace for easier debug. Signed-off-by: Detlev Casanova --- drivers/media/platform/verisilicon/hantro.h | 1 + drivers/media/platform/verisilicon/hantro_drv.c | 4 + drivers/media/platform/verisilicon/hantro_h264.c | 7 +- drivers/media/platform/verisilicon/hantro_hevc.c | 100 +++++++------ drivers/media/platform/verisilicon/hantro_mpeg2.c | 16 +-- .../media/platform/verisilicon/hantro_postproc.c | 14 +- drivers/media/platform/verisilicon/hantro_vp8.c | 25 ++-- drivers/media/platform/verisilicon/hantro_vp9.c | 34 +++-- .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 160 ++++++++++++-----= ---- 9 files changed, 215 insertions(+), 146 deletions(-) diff --git a/drivers/media/platform/verisilicon/hantro.h b/drivers/media/pl= atform/verisilicon/hantro.h index d5cddc783688..acf5312d5ed4 100644 --- a/drivers/media/platform/verisilicon/hantro.h +++ b/drivers/media/platform/verisilicon/hantro.h @@ -24,6 +24,7 @@ #include #include #include +#include =20 #include "hantro_hw.h" =20 diff --git a/drivers/media/platform/verisilicon/hantro_drv.c b/drivers/medi= a/platform/verisilicon/hantro_drv.c index 32855b14e0f1..2b8aa2033d3f 100644 --- a/drivers/media/platform/verisilicon/hantro_drv.c +++ b/drivers/media/platform/verisilicon/hantro_drv.c @@ -232,6 +232,8 @@ queue_init(void *priv, struct vb2_queue *src_vq, struct= vb2_queue *dst_vq) src_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; src_vq->lock =3D &ctx->dev->vpu_mutex; src_vq->dev =3D ctx->dev->v4l2_dev.dev; + src_vq->v4l2_dev =3D &ctx->dev->v4l2_dev; + src_vq->v4l2_fh =3D &ctx->fh; src_vq->supports_requests =3D true; =20 ret =3D vb2_queue_init(src_vq); @@ -258,6 +260,8 @@ queue_init(void *priv, struct vb2_queue *src_vq, struct= vb2_queue *dst_vq) dst_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; dst_vq->lock =3D &ctx->dev->vpu_mutex; dst_vq->dev =3D ctx->dev->v4l2_dev.dev; + dst_vq->v4l2_dev =3D &ctx->dev->v4l2_dev; + dst_vq->v4l2_fh =3D &ctx->fh; =20 return vb2_queue_init(dst_vq); } diff --git a/drivers/media/platform/verisilicon/hantro_h264.c b/drivers/med= ia/platform/verisilicon/hantro_h264.c index 2414782f1eb6..6b6afd74f8ae 100644 --- a/drivers/media/platform/verisilicon/hantro_h264.c +++ b/drivers/media/platform/verisilicon/hantro_h264.c @@ -498,7 +498,7 @@ void hantro_h264_dec_exit(struct hantro_ctx *ctx) struct hantro_h264_dec_hw_ctx *h264_dec =3D &ctx->h264_dec; struct hantro_aux_buf *priv =3D &h264_dec->priv; =20 - dma_free_coherent(vpu->dev, priv->size, priv->cpu, priv->dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, priv->size, priv->cpu, priv= ->dma, 0); } =20 int hantro_h264_dec_init(struct hantro_ctx *ctx) @@ -508,8 +508,9 @@ int hantro_h264_dec_init(struct hantro_ctx *ctx) struct hantro_aux_buf *priv =3D &h264_dec->priv; struct hantro_h264_dec_priv_tbl *tbl; =20 - priv->cpu =3D dma_alloc_coherent(vpu->dev, sizeof(*tbl), &priv->dma, - GFP_KERNEL); + priv->cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + sizeof(*tbl), &priv->dma, + GFP_KERNEL, 0, &ctx->fh, "h264-priv"); if (!priv->cpu) return -ENOMEM; =20 diff --git a/drivers/media/platform/verisilicon/hantro_hevc.c b/drivers/med= ia/platform/verisilicon/hantro_hevc.c index 83cd12b0ddd6..e73498285bf7 100644 --- a/drivers/media/platform/verisilicon/hantro_hevc.c +++ b/drivers/media/platform/verisilicon/hantro_hevc.c @@ -7,6 +7,7 @@ =20 #include #include +#include =20 #include "hantro.h" #include "hantro_hw.h" @@ -89,46 +90,52 @@ static int tile_buffer_reallocate(struct hantro_ctx *ct= x) =20 /* Need to reallocate due to tiles passed via PPS */ if (hevc_dec->tile_filter.cpu) { - dma_free_coherent(vpu->dev, hevc_dec->tile_filter.size, - hevc_dec->tile_filter.cpu, - hevc_dec->tile_filter.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_filter.size, + hevc_dec->tile_filter.cpu, + hevc_dec->tile_filter.dma, 0); hevc_dec->tile_filter.cpu =3D NULL; } =20 if (hevc_dec->tile_sao.cpu) { - dma_free_coherent(vpu->dev, hevc_dec->tile_sao.size, - hevc_dec->tile_sao.cpu, - hevc_dec->tile_sao.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_sao.size, + hevc_dec->tile_sao.cpu, + hevc_dec->tile_sao.dma, 0); hevc_dec->tile_sao.cpu =3D NULL; } =20 if (hevc_dec->tile_bsd.cpu) { - dma_free_coherent(vpu->dev, hevc_dec->tile_bsd.size, - hevc_dec->tile_bsd.cpu, - hevc_dec->tile_bsd.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_bsd.size, + hevc_dec->tile_bsd.cpu, + hevc_dec->tile_bsd.dma, 0); hevc_dec->tile_bsd.cpu =3D NULL; } =20 size =3D (VERT_FILTER_RAM_SIZE * height64 * (num_tile_cols - 1) * ctx->bi= t_depth) / 8; - hevc_dec->tile_filter.cpu =3D dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_filter.dma, - GFP_KERNEL); + hevc_dec->tile_filter.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->d= ev, size, + &hevc_dec->tile_filter.dma, + GFP_KERNEL, + DMA_ATTR_NO_KERNEL_MAPPING, + &ctx->fh, "hevc-tile-filter"); if (!hevc_dec->tile_filter.cpu) return -ENOMEM; hevc_dec->tile_filter.size =3D size; =20 size =3D (VERT_SAO_RAM_SIZE * height64 * (num_tile_cols - 1) * ctx->bit_d= epth) / 8; - hevc_dec->tile_sao.cpu =3D dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_sao.dma, - GFP_KERNEL); + hevc_dec->tile_sao.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev,= size, + &hevc_dec->tile_sao.dma, + GFP_KERNEL, + DMA_ATTR_NO_KERNEL_MAPPING, + &ctx->fh, "hevc-tile-sao"); if (!hevc_dec->tile_sao.cpu) goto err_free_tile_buffers; hevc_dec->tile_sao.size =3D size; =20 size =3D BSD_CTRL_RAM_SIZE * height64 * (num_tile_cols - 1); - hevc_dec->tile_bsd.cpu =3D dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_bsd.dma, - GFP_KERNEL); + hevc_dec->tile_bsd.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev,= size, + &hevc_dec->tile_bsd.dma, + GFP_KERNEL, + DMA_ATTR_NO_KERNEL_MAPPING, + &ctx->fh, "hevc-tile-bsd"); if (!hevc_dec->tile_bsd.cpu) goto err_free_sao_buffers; hevc_dec->tile_bsd.size =3D size; @@ -139,16 +146,16 @@ static int tile_buffer_reallocate(struct hantro_ctx *= ctx) =20 err_free_sao_buffers: if (hevc_dec->tile_sao.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_sao.size, - hevc_dec->tile_sao.cpu, - hevc_dec->tile_sao.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_sao.size, + hevc_dec->tile_sao.cpu, + hevc_dec->tile_sao.dma, 0); hevc_dec->tile_sao.cpu =3D NULL; =20 err_free_tile_buffers: if (hevc_dec->tile_filter.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_filter.size, - hevc_dec->tile_filter.cpu, - hevc_dec->tile_filter.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_filter.size, + hevc_dec->tile_filter.cpu, + hevc_dec->tile_filter.dma, 0); hevc_dec->tile_filter.cpu =3D NULL; =20 return -ENOMEM; @@ -218,33 +225,33 @@ void hantro_hevc_dec_exit(struct hantro_ctx *ctx) struct hantro_hevc_dec_hw_ctx *hevc_dec =3D &ctx->hevc_dec; =20 if (hevc_dec->tile_sizes.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_sizes.size, - hevc_dec->tile_sizes.cpu, - hevc_dec->tile_sizes.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_sizes.size, + hevc_dec->tile_sizes.cpu, + hevc_dec->tile_sizes.dma, 0); hevc_dec->tile_sizes.cpu =3D NULL; =20 if (hevc_dec->scaling_lists.cpu) - dma_free_coherent(vpu->dev, hevc_dec->scaling_lists.size, - hevc_dec->scaling_lists.cpu, - hevc_dec->scaling_lists.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->scaling_lists.si= ze, + hevc_dec->scaling_lists.cpu, + hevc_dec->scaling_lists.dma, 0); hevc_dec->scaling_lists.cpu =3D NULL; =20 if (hevc_dec->tile_filter.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_filter.size, - hevc_dec->tile_filter.cpu, - hevc_dec->tile_filter.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_filter.size, + hevc_dec->tile_filter.cpu, + hevc_dec->tile_filter.dma, 0); hevc_dec->tile_filter.cpu =3D NULL; =20 if (hevc_dec->tile_sao.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_sao.size, - hevc_dec->tile_sao.cpu, - hevc_dec->tile_sao.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_sao.size, + hevc_dec->tile_sao.cpu, + hevc_dec->tile_sao.dma, 0); hevc_dec->tile_sao.cpu =3D NULL; =20 if (hevc_dec->tile_bsd.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_bsd.size, - hevc_dec->tile_bsd.cpu, - hevc_dec->tile_bsd.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, hevc_dec->tile_bsd.size, + hevc_dec->tile_bsd.cpu, + hevc_dec->tile_bsd.dma, 0); hevc_dec->tile_bsd.cpu =3D NULL; } =20 @@ -262,17 +269,20 @@ int hantro_hevc_dec_init(struct hantro_ctx *ctx) * chunk (HW guys wanted to have this). */ size =3D round_up(MAX_TILE_COLS * MAX_TILE_ROWS * 4 * sizeof(u16) + 16, 1= 6); - hevc_dec->tile_sizes.cpu =3D dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_sizes.dma, - GFP_KERNEL); + hevc_dec->tile_sizes.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->de= v, size, + &hevc_dec->tile_sizes.dma, + GFP_KERNEL, 0, + &ctx->fh, "hevc-tile-sizes"); if (!hevc_dec->tile_sizes.cpu) return -ENOMEM; =20 hevc_dec->tile_sizes.size =3D size; =20 - hevc_dec->scaling_lists.cpu =3D dma_alloc_coherent(vpu->dev, SCALING_LIST= _SIZE, - &hevc_dec->scaling_lists.dma, - GFP_KERNEL); + hevc_dec->scaling_lists.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu-= >dev, + SCALING_LIST_SIZE, + &hevc_dec->scaling_lists.dma, + GFP_KERNEL, 0, + &ctx->fh, "hevc-scaling-lists"); if (!hevc_dec->scaling_lists.cpu) return -ENOMEM; =20 diff --git a/drivers/media/platform/verisilicon/hantro_mpeg2.c b/drivers/me= dia/platform/verisilicon/hantro_mpeg2.c index 04e545eb0a83..edb29204b9c2 100644 --- a/drivers/media/platform/verisilicon/hantro_mpeg2.c +++ b/drivers/media/platform/verisilicon/hantro_mpeg2.c @@ -41,10 +41,10 @@ int hantro_mpeg2_dec_init(struct hantro_ctx *ctx) =20 ctx->mpeg2_dec.qtable.size =3D ARRAY_SIZE(zigzag) * 4; ctx->mpeg2_dec.qtable.cpu =3D - dma_alloc_coherent(vpu->dev, - ctx->mpeg2_dec.qtable.size, - &ctx->mpeg2_dec.qtable.dma, - GFP_KERNEL); + v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + ctx->mpeg2_dec.qtable.size, + &ctx->mpeg2_dec.qtable.dma, + GFP_KERNEL, 0, &ctx->fh, "mpeg2-qtable"); if (!ctx->mpeg2_dec.qtable.cpu) return -ENOMEM; return 0; @@ -54,8 +54,8 @@ void hantro_mpeg2_dec_exit(struct hantro_ctx *ctx) { struct hantro_dev *vpu =3D ctx->dev; =20 - dma_free_coherent(vpu->dev, - ctx->mpeg2_dec.qtable.size, - ctx->mpeg2_dec.qtable.cpu, - ctx->mpeg2_dec.qtable.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + ctx->mpeg2_dec.qtable.size, + ctx->mpeg2_dec.qtable.cpu, + ctx->mpeg2_dec.qtable.dma, 0); } diff --git a/drivers/media/platform/verisilicon/hantro_postproc.c b/drivers= /media/platform/verisilicon/hantro_postproc.c index e94d1ba5ef10..030db07f96e3 100644 --- a/drivers/media/platform/verisilicon/hantro_postproc.c +++ b/drivers/media/platform/verisilicon/hantro_postproc.c @@ -189,8 +189,8 @@ void hantro_postproc_free(struct hantro_ctx *ctx) struct hantro_aux_buf *priv =3D &ctx->postproc.dec_q[i]; =20 if (priv->cpu) { - dma_free_attrs(vpu->dev, priv->size, priv->cpu, - priv->dma, priv->attrs); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, priv->size, priv->cpu, + priv->dma, priv->attrs); priv->cpu =3D NULL; } } @@ -226,6 +226,7 @@ static int hantro_postproc_alloc(struct hantro_ctx *ctx= , int index) struct hantro_dev *vpu =3D ctx->dev; struct hantro_aux_buf *priv =3D &ctx->postproc.dec_q[index]; unsigned int buf_size =3D hantro_postproc_buffer_size(ctx); + char name[32]; =20 if (!buf_size) return -EINVAL; @@ -235,8 +236,9 @@ static int hantro_postproc_alloc(struct hantro_ctx *ctx= , int index) * buffers for the decoder, so no mapping is needed. */ priv->attrs =3D DMA_ATTR_NO_KERNEL_MAPPING; - priv->cpu =3D dma_alloc_attrs(vpu->dev, buf_size, &priv->dma, - GFP_KERNEL, priv->attrs); + snprintf(name, sizeof(name), "postproc-dec-%d", index); + priv->cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, buf_size, &p= riv->dma, + GFP_KERNEL, priv->attrs, &ctx->fh, name); if (!priv->cpu) return -ENOMEM; priv->size =3D buf_size; @@ -273,8 +275,8 @@ hantro_postproc_get_dec_buf_addr(struct hantro_ctx *ctx= , int index) =20 if (priv->size < buf_size && priv->cpu) { /* buffer is too small, release it */ - dma_free_attrs(vpu->dev, priv->size, priv->cpu, - priv->dma, priv->attrs); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, priv->size, priv->cpu, + priv->dma, priv->attrs); priv->cpu =3D NULL; } =20 diff --git a/drivers/media/platform/verisilicon/hantro_vp8.c b/drivers/medi= a/platform/verisilicon/hantro_vp8.c index 381bc1d3bfda..c94b1692adbb 100644 --- a/drivers/media/platform/verisilicon/hantro_vp8.c +++ b/drivers/media/platform/verisilicon/hantro_vp8.c @@ -161,8 +161,9 @@ int hantro_vp8_dec_init(struct hantro_ctx *ctx) */ aux_buf =3D &ctx->vp8_dec.segment_map; aux_buf->size =3D segment_map_size; - aux_buf->cpu =3D dma_alloc_coherent(vpu->dev, aux_buf->size, - &aux_buf->dma, GFP_KERNEL); + aux_buf->cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + aux_buf->size, &aux_buf->dma, + GFP_KERNEL, 0, &ctx->fh, "vp8-segment-map"); if (!aux_buf->cpu) return -ENOMEM; =20 @@ -172,8 +173,9 @@ int hantro_vp8_dec_init(struct hantro_ctx *ctx) */ aux_buf =3D &ctx->vp8_dec.prob_tbl; aux_buf->size =3D sizeof(struct vp8_prob_tbl_packed); - aux_buf->cpu =3D dma_alloc_coherent(vpu->dev, aux_buf->size, - &aux_buf->dma, GFP_KERNEL); + aux_buf->cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + aux_buf->size, &aux_buf->dma, + GFP_KERNEL, 0, &ctx->fh, "vp8-prob-tbl"); if (!aux_buf->cpu) { ret =3D -ENOMEM; goto err_free_seg_map; @@ -182,9 +184,10 @@ int hantro_vp8_dec_init(struct hantro_ctx *ctx) return 0; =20 err_free_seg_map: - dma_free_coherent(vpu->dev, ctx->vp8_dec.segment_map.size, - ctx->vp8_dec.segment_map.cpu, - ctx->vp8_dec.segment_map.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + ctx->vp8_dec.segment_map.size, + ctx->vp8_dec.segment_map.cpu, + ctx->vp8_dec.segment_map.dma, 0); =20 return ret; } @@ -194,8 +197,8 @@ void hantro_vp8_dec_exit(struct hantro_ctx *ctx) struct hantro_vp8_dec_hw_ctx *vp8_dec =3D &ctx->vp8_dec; struct hantro_dev *vpu =3D ctx->dev; =20 - dma_free_coherent(vpu->dev, vp8_dec->segment_map.size, - vp8_dec->segment_map.cpu, vp8_dec->segment_map.dma); - dma_free_coherent(vpu->dev, vp8_dec->prob_tbl.size, - vp8_dec->prob_tbl.cpu, vp8_dec->prob_tbl.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, vp8_dec->segment_map.size, + vp8_dec->segment_map.cpu, vp8_dec->segment_map.dma, 0); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, vp8_dec->prob_tbl.size, + vp8_dec->prob_tbl.cpu, vp8_dec->prob_tbl.dma, 0); } diff --git a/drivers/media/platform/verisilicon/hantro_vp9.c b/drivers/medi= a/platform/verisilicon/hantro_vp9.c index 566cd376c097..3933a835cc57 100644 --- a/drivers/media/platform/verisilicon/hantro_vp9.c +++ b/drivers/media/platform/verisilicon/hantro_vp9.c @@ -182,7 +182,10 @@ int hantro_vp9_dec_init(struct hantro_ctx *ctx) vp9_dec->bsd_ctrl_offset =3D size; size +=3D hantro_vp9_bsd_control_size(max_height); =20 - tile_edge->cpu =3D dma_alloc_coherent(vpu->dev, size, &tile_edge->dma, GF= P_KERNEL); + tile_edge->cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + size, &tile_edge->dma, + GFP_KERNEL, 0, &ctx->fh, + "vp9-tile-edge"); if (!tile_edge->cpu) return -ENOMEM; =20 @@ -193,7 +196,10 @@ int hantro_vp9_dec_init(struct hantro_ctx *ctx) vp9_dec->segment_map_size =3D size; size *=3D 2; /* we need two areas of this size, used alternately */ =20 - segment_map->cpu =3D dma_alloc_coherent(vpu->dev, size, &segment_map->dma= , GFP_KERNEL); + segment_map->cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + size, &segment_map->dma, + GFP_KERNEL, 0, &ctx->fh, + "vp9-segment-map"); if (!segment_map->cpu) goto err_segment_map; =20 @@ -206,7 +212,10 @@ int hantro_vp9_dec_init(struct hantro_ctx *ctx) vp9_dec->tile_info_offset =3D size; size +=3D hantro_vp9_tile_info_size(); =20 - misc->cpu =3D dma_alloc_coherent(vpu->dev, size, &misc->dma, GFP_KERNEL); + misc->cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + size, &misc->dma, + GFP_KERNEL, 0, &ctx->fh, + "vp9-misc"); if (!misc->cpu) goto err_misc; =20 @@ -218,10 +227,14 @@ int hantro_vp9_dec_init(struct hantro_ctx *ctx) return 0; =20 err_misc: - dma_free_coherent(vpu->dev, segment_map->size, segment_map->cpu, segment_= map->dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + segment_map->size, segment_map->cpu, + segment_map->dma, 0); =20 err_segment_map: - dma_free_coherent(vpu->dev, tile_edge->size, tile_edge->cpu, tile_edge->d= ma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + tile_edge->size, tile_edge->cpu, + tile_edge->dma, 0); =20 return -ENOMEM; } @@ -234,7 +247,12 @@ void hantro_vp9_dec_exit(struct hantro_ctx *ctx) struct hantro_aux_buf *segment_map =3D &vp9_dec->segment_map; struct hantro_aux_buf *misc =3D &vp9_dec->misc; =20 - dma_free_coherent(vpu->dev, misc->size, misc->cpu, misc->dma); - dma_free_coherent(vpu->dev, segment_map->size, segment_map->cpu, segment_= map->dma); - dma_free_coherent(vpu->dev, tile_edge->size, tile_edge->cpu, tile_edge->d= ma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + misc->size, misc->cpu, misc->dma, 0); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + segment_map->size, segment_map->cpu, + segment_map->dma, 0); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + tile_edge->size, tile_edge->cpu, + tile_edge->dma, 0); } diff --git a/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.= c b/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c index e4e21ad37323..f48e8dbfc880 100644 --- a/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c +++ b/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c @@ -232,30 +232,38 @@ static void rockchip_vpu981_av1_dec_tiles_free(struct= hantro_ctx *ctx) struct hantro_av1_dec_hw_ctx *av1_dec =3D &ctx->av1_dec; =20 if (av1_dec->db_data_col.cpu) - dma_free_coherent(vpu->dev, av1_dec->db_data_col.size, - av1_dec->db_data_col.cpu, - av1_dec->db_data_col.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->db_data_col.size, + av1_dec->db_data_col.cpu, + av1_dec->db_data_col.dma, 0); av1_dec->db_data_col.cpu =3D NULL; =20 if (av1_dec->db_ctrl_col.cpu) - dma_free_coherent(vpu->dev, av1_dec->db_ctrl_col.size, - av1_dec->db_ctrl_col.cpu, - av1_dec->db_ctrl_col.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->db_ctrl_col.size, + av1_dec->db_ctrl_col.cpu, + av1_dec->db_ctrl_col.dma, 0); av1_dec->db_ctrl_col.cpu =3D NULL; =20 if (av1_dec->cdef_col.cpu) - dma_free_coherent(vpu->dev, av1_dec->cdef_col.size, - av1_dec->cdef_col.cpu, av1_dec->cdef_col.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->cdef_col.size, + av1_dec->cdef_col.cpu, + av1_dec->cdef_col.dma, 0); av1_dec->cdef_col.cpu =3D NULL; =20 if (av1_dec->sr_col.cpu) - dma_free_coherent(vpu->dev, av1_dec->sr_col.size, - av1_dec->sr_col.cpu, av1_dec->sr_col.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->sr_col.size, + av1_dec->sr_col.cpu, + av1_dec->sr_col.dma, 0); av1_dec->sr_col.cpu =3D NULL; =20 if (av1_dec->lr_col.cpu) - dma_free_coherent(vpu->dev, av1_dec->lr_col.size, - av1_dec->lr_col.cpu, av1_dec->lr_col.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->lr_col.size, + av1_dec->lr_col.cpu, + av1_dec->lr_col.dma, 0); av1_dec->lr_col.cpu =3D NULL; } =20 @@ -278,41 +286,46 @@ static int rockchip_vpu981_av1_dec_tiles_reallocate(s= truct hantro_ctx *ctx) rockchip_vpu981_av1_dec_tiles_free(ctx); =20 size =3D ALIGN(height * 12 * ctx->bit_depth / 8, 128) * num_tile_cols; - av1_dec->db_data_col.cpu =3D dma_alloc_coherent(vpu->dev, size, - &av1_dec->db_data_col.dma, - GFP_KERNEL); + av1_dec->db_data_col.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->de= v, size, + &av1_dec->db_data_col.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-db-data-col"); if (!av1_dec->db_data_col.cpu) goto buffer_allocation_error; av1_dec->db_data_col.size =3D size; =20 size =3D ALIGN(height * 2 * 16 / 4, 128) * num_tile_cols; - av1_dec->db_ctrl_col.cpu =3D dma_alloc_coherent(vpu->dev, size, - &av1_dec->db_ctrl_col.dma, - GFP_KERNEL); + av1_dec->db_ctrl_col.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->de= v, size, + &av1_dec->db_ctrl_col.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-db-ctrl-col"); if (!av1_dec->db_ctrl_col.cpu) goto buffer_allocation_error; av1_dec->db_ctrl_col.size =3D size; =20 size =3D ALIGN(height_in_sb * 44 * ctx->bit_depth * 16 / 8, 128) * num_ti= le_cols; - av1_dec->cdef_col.cpu =3D dma_alloc_coherent(vpu->dev, size, - &av1_dec->cdef_col.dma, - GFP_KERNEL); + av1_dec->cdef_col.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, = size, + &av1_dec->cdef_col.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-cdef-col"); if (!av1_dec->cdef_col.cpu) goto buffer_allocation_error; av1_dec->cdef_col.size =3D size; =20 size =3D ALIGN(height_in_sb * (3040 + 1280), 128) * num_tile_cols; - av1_dec->sr_col.cpu =3D dma_alloc_coherent(vpu->dev, size, - &av1_dec->sr_col.dma, - GFP_KERNEL); + av1_dec->sr_col.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, si= ze, + &av1_dec->sr_col.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-sr-col"); if (!av1_dec->sr_col.cpu) goto buffer_allocation_error; av1_dec->sr_col.size =3D size; =20 size =3D ALIGN(stripe_num * 1536 * ctx->bit_depth / 8, 128) * num_tile_co= ls; - av1_dec->lr_col.cpu =3D dma_alloc_coherent(vpu->dev, size, - &av1_dec->lr_col.dma, - GFP_KERNEL); + av1_dec->lr_col.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, si= ze, + &av1_dec->lr_col.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-lr-col"); if (!av1_dec->lr_col.cpu) goto buffer_allocation_error; av1_dec->lr_col.size =3D size; @@ -331,37 +344,45 @@ void rockchip_vpu981_av1_dec_exit(struct hantro_ctx *= ctx) struct hantro_av1_dec_hw_ctx *av1_dec =3D &ctx->av1_dec; =20 if (av1_dec->global_model.cpu) - dma_free_coherent(vpu->dev, av1_dec->global_model.size, - av1_dec->global_model.cpu, - av1_dec->global_model.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->global_model.size, + av1_dec->global_model.cpu, + av1_dec->global_model.dma, 0); av1_dec->global_model.cpu =3D NULL; =20 if (av1_dec->tile_info.cpu) - dma_free_coherent(vpu->dev, av1_dec->tile_info.size, - av1_dec->tile_info.cpu, - av1_dec->tile_info.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->tile_info.size, + av1_dec->tile_info.cpu, + av1_dec->tile_info.dma, 0); av1_dec->tile_info.cpu =3D NULL; =20 if (av1_dec->film_grain.cpu) - dma_free_coherent(vpu->dev, av1_dec->film_grain.size, - av1_dec->film_grain.cpu, - av1_dec->film_grain.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->film_grain.size, + av1_dec->film_grain.cpu, + av1_dec->film_grain.dma, 0); av1_dec->film_grain.cpu =3D NULL; =20 if (av1_dec->prob_tbl.cpu) - dma_free_coherent(vpu->dev, av1_dec->prob_tbl.size, - av1_dec->prob_tbl.cpu, av1_dec->prob_tbl.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->prob_tbl.size, + av1_dec->prob_tbl.cpu, + av1_dec->prob_tbl.dma, 0); av1_dec->prob_tbl.cpu =3D NULL; =20 if (av1_dec->prob_tbl_out.cpu) - dma_free_coherent(vpu->dev, av1_dec->prob_tbl_out.size, - av1_dec->prob_tbl_out.cpu, - av1_dec->prob_tbl_out.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->prob_tbl_out.size, + av1_dec->prob_tbl_out.cpu, + av1_dec->prob_tbl_out.dma, 0); av1_dec->prob_tbl_out.cpu =3D NULL; =20 if (av1_dec->tile_buf.cpu) - dma_free_coherent(vpu->dev, av1_dec->tile_buf.size, - av1_dec->tile_buf.cpu, av1_dec->tile_buf.dma); + v4l2_dma_free_attrs(&vpu->v4l2_dev, vpu->dev, + av1_dec->tile_buf.size, + av1_dec->tile_buf.cpu, + av1_dec->tile_buf.dma, 0); av1_dec->tile_buf.cpu =3D NULL; =20 rockchip_vpu981_av1_dec_tiles_free(ctx); @@ -374,40 +395,48 @@ int rockchip_vpu981_av1_dec_init(struct hantro_ctx *c= tx) =20 memset(av1_dec, 0, sizeof(*av1_dec)); =20 - av1_dec->global_model.cpu =3D dma_alloc_coherent(vpu->dev, GLOBAL_MODEL_S= IZE, - &av1_dec->global_model.dma, - GFP_KERNEL); + av1_dec->global_model.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->d= ev, + GLOBAL_MODEL_SIZE, + &av1_dec->global_model.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-global-model"); if (!av1_dec->global_model.cpu) return -ENOMEM; av1_dec->global_model.size =3D GLOBAL_MODEL_SIZE; =20 - av1_dec->tile_info.cpu =3D dma_alloc_coherent(vpu->dev, AV1_TILE_INFO_SIZ= E, - &av1_dec->tile_info.dma, - GFP_KERNEL); + av1_dec->tile_info.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + AV1_TILE_INFO_SIZE, + &av1_dec->tile_info.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-tile-info"); if (!av1_dec->tile_info.cpu) return -ENOMEM; av1_dec->tile_info.size =3D AV1_TILE_INFO_SIZE; =20 - av1_dec->film_grain.cpu =3D dma_alloc_coherent(vpu->dev, - ALIGN(sizeof(struct rockchip_av1_film_grain), 2048), - &av1_dec->film_grain.dma, - GFP_KERNEL); + av1_dec->film_grain.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + ALIGN(sizeof(struct rockchip_av1_film_grain), + 2048), + &av1_dec->film_grain.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-film-grain"); if (!av1_dec->film_grain.cpu) return -ENOMEM; av1_dec->film_grain.size =3D ALIGN(sizeof(struct rockchip_av1_film_grain)= , 2048); =20 - av1_dec->prob_tbl.cpu =3D dma_alloc_coherent(vpu->dev, - ALIGN(sizeof(struct av1cdfs), 2048), - &av1_dec->prob_tbl.dma, - GFP_KERNEL); + av1_dec->prob_tbl.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + ALIGN(sizeof(struct av1cdfs), 2048), + &av1_dec->prob_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-prob-tbl"); if (!av1_dec->prob_tbl.cpu) return -ENOMEM; av1_dec->prob_tbl.size =3D ALIGN(sizeof(struct av1cdfs), 2048); =20 - av1_dec->prob_tbl_out.cpu =3D dma_alloc_coherent(vpu->dev, - ALIGN(sizeof(struct av1cdfs), 2048), - &av1_dec->prob_tbl_out.dma, - GFP_KERNEL); + av1_dec->prob_tbl_out.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->d= ev, + ALIGN(sizeof(struct av1cdfs), 2048), + &av1_dec->prob_tbl_out.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-prob-tbl-out"); if (!av1_dec->prob_tbl_out.cpu) return -ENOMEM; av1_dec->prob_tbl_out.size =3D ALIGN(sizeof(struct av1cdfs), 2048); @@ -416,10 +445,11 @@ int rockchip_vpu981_av1_dec_init(struct hantro_ctx *c= tx) =20 rockchip_av1_set_default_cdfs(av1_dec->cdfs, av1_dec->cdfs_ndvc); =20 - av1_dec->tile_buf.cpu =3D dma_alloc_coherent(vpu->dev, - AV1_TILE_SIZE, - &av1_dec->tile_buf.dma, - GFP_KERNEL); + av1_dec->tile_buf.cpu =3D v4l2_dma_alloc_attrs(&vpu->v4l2_dev, vpu->dev, + AV1_TILE_SIZE, + &av1_dec->tile_buf.dma, + GFP_KERNEL, 0, &ctx->fh, + "av1-tile-buf"); if (!av1_dec->tile_buf.cpu) return -ENOMEM; av1_dec->tile_buf.size =3D AV1_TILE_SIZE; --=20 2.55.0 From nobody Fri Sep 25 05:30:02 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5B9851A74D; Wed, 16 Sep 2026 14:25:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568741; cv=none; b=RvVuEY7jHp5U8A6TCQgXJRVxC6oChrHri6vMgHEC2IJ3XcF/a0yQVuYdqmGo7eGvnKkyKBhaFO2a/AqA4n7pXx2ZTDKuBnRvfeEc4uMfuaj3RItpeM/ARghMwqttESFlxBuflBhaCa3OCrjYpqLsCQC8qzgzbJtwNJV7Uo5IwUI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789568741; c=relaxed/simple; bh=rffjsrzNUHUz6Ej9X9i0hw88J4ZQTjnnMh0u/4385Lo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=co+U6wgNfsJYnIQOypNONpDv2eqIb7kwaww8Zju3AZl49W/dc5afgPwlLIWcTzwXS9AnAFojSGAmDG0R4nh/uk4pucLjqcqVOpKZ0duPBRdnZ3zgf1dp8I9tzAX6xSByMzBYg0zBtoTFR9wspCkn7s2QQIjT8FGKIvbB5V+u9c8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Zc1JPrSI; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Zc1JPrSI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1789568737; bh=rffjsrzNUHUz6Ej9X9i0hw88J4ZQTjnnMh0u/4385Lo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Zc1JPrSIAsq6dDX/gzI9oesvM2y8DXXWwJuP7wtyHlNWx9ZgaD36hLyxTnwjIyXxB 4ETG3PUhCT/dCVuj2BC/r2T5p/1dYszIYaZVD/463hNatHRbYWbFHEUxltxVGvR4vt znOY+99Ps/0GwHgzgYxGlBzs2haIEeb+TAuus/W5YPHYkglDM9fLfYuxjoR42FERq0 OznCfHETYE+04swM0DOiP9O4MMVZhyVNY/upSGko8605doIArdwK6j55iACfePjNty cQ8ug7InZiFC/oiCHLF0hTVOUC7iaIb2+kH8AYxDeY9IbTCBTE4aQCQOLhAa8JIGmq nCnoHI6c2Bc8Q== Received: from [192.168.0.15] (unknown [100.64.0.170]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4F4F517E0070; Wed, 16 Sep 2026 16:25:36 +0200 (CEST) From: Detlev Casanova Date: Wed, 16 Sep 2026 10:25:29 -0400 Subject: [PATCH 4/4] media: rkvdec: Switch to tracked dma allocations Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-v4l2-add-mem-tracker-v1-4-900fa45e3e6a@collabora.com> References: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> In-Reply-To: <20260916-v4l2-add-mem-tracker-v1-0-900fa45e3e6a@collabora.com> To: Tomasz Figa , Marek Szyprowski , Mauro Carvalho Chehab , Nicolas Dufresne , Benjamin Gaignard , Philipp Zabel , Heiko Stuebner , Ezequiel Garcia Cc: kernel@collabora.com, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Detlev Casanova X-Mailer: b4 0.15.2 Use the newly introduced v4l2_dma_alloc_attrs and v4l2_dma_free_attrs functions to track all dma allocations and have them exposed to userspace for easier debug. Signed-off-by: Detlev Casanova --- .../media/platform/rockchip/rkvdec/rkvdec-h264.c | 14 ++++++--- .../media/platform/rockchip/rkvdec/rkvdec-hevc.c | 14 ++++++--- .../media/platform/rockchip/rkvdec/rkvdec-rcb.c | 21 ++++++++------ .../platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c | 14 ++++++--- .../platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c | 14 ++++++--- .../platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c | 14 ++++++--- .../platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c | 14 ++++++--- .../media/platform/rockchip/rkvdec/rkvdec-vp9.c | 33 +++++++++++++++---= ---- drivers/media/platform/rockchip/rkvdec/rkvdec.c | 4 +++ 9 files changed, 100 insertions(+), 42 deletions(-) diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c b/drivers= /media/platform/rockchip/rkvdec/rkvdec-h264.c index d3202cecb988..5b5bc091e792 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c @@ -11,6 +11,7 @@ =20 #include #include +#include =20 #include "rkvdec.h" #include "rkvdec-regs.h" @@ -379,8 +380,11 @@ static int rkvdec_h264_start(struct rkvdec_ctx *ctx) if (!h264_ctx) return -ENOMEM; =20 - priv_tbl =3D dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), - &h264_ctx->priv_tbl.dma, GFP_KERNEL); + priv_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + sizeof(*priv_tbl), + &h264_ctx->priv_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "h264-priv-tbl"); if (!priv_tbl) { ret =3D -ENOMEM; goto err_free_ctx; @@ -404,8 +408,10 @@ static void rkvdec_h264_stop(struct rkvdec_ctx *ctx) struct rkvdec_h264_ctx *h264_ctx =3D ctx->priv; struct rkvdec_dev *rkvdec =3D ctx->dev; =20 - dma_free_coherent(rkvdec->dev, h264_ctx->priv_tbl.size, - h264_ctx->priv_tbl.cpu, h264_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + h264_ctx->priv_tbl.size, + h264_ctx->priv_tbl.cpu, + h264_ctx->priv_tbl.dma, 0); kfree(h264_ctx); } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c b/drivers= /media/platform/rockchip/rkvdec/rkvdec-hevc.c index ac8b825d080a..fef8bf6c7625 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c @@ -13,6 +13,7 @@ */ =20 #include +#include =20 #include "rkvdec.h" #include "rkvdec-regs.h" @@ -532,8 +533,11 @@ static int rkvdec_hevc_start(struct rkvdec_ctx *ctx) if (!hevc_ctx) return -ENOMEM; =20 - priv_tbl =3D dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), - &hevc_ctx->priv_tbl.dma, GFP_KERNEL); + priv_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + sizeof(*priv_tbl), + &hevc_ctx->priv_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "hevc-priv-tbl"); if (!priv_tbl) { kfree(hevc_ctx); return -ENOMEM; @@ -553,8 +557,10 @@ static void rkvdec_hevc_stop(struct rkvdec_ctx *ctx) struct rkvdec_hevc_ctx *hevc_ctx =3D ctx->priv; struct rkvdec_dev *rkvdec =3D ctx->dev; =20 - dma_free_coherent(rkvdec->dev, hevc_ctx->priv_tbl.size, - hevc_ctx->priv_tbl.cpu, hevc_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + hevc_ctx->priv_tbl.size, + hevc_ctx->priv_tbl.cpu, + hevc_ctx->priv_tbl.dma, 0); kfree(hevc_ctx); } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-rcb.c b/drivers/= media/platform/rockchip/rkvdec/rkvdec-rcb.c index fdcf1f177379..1d43793720c7 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-rcb.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-rcb.c @@ -13,6 +13,7 @@ #include #include #include +#include =20 struct rkvdec_rcb_config { struct rkvdec_aux_buf *rcb_bufs; @@ -65,10 +66,10 @@ void rkvdec_free_rcb(struct rkvdec_ctx *ctx) gen_pool_free(dev->sram_pool, virt_addr, rcb_size); break; case RKVDEC_ALLOC_DMA: - dma_free_coherent(dev->dev, - rcb_size, - cfg->rcb_bufs[i].cpu, - cfg->rcb_bufs[i].dma); + v4l2_dma_free_attrs(&dev->v4l2_dev, dev->dev, + rcb_size, + cfg->rcb_bufs[i].cpu, + cfg->rcb_bufs[i].dma, 0); break; } } @@ -150,10 +151,14 @@ int rkvdec_allocate_rcb(struct rkvdec_ctx *ctx, ram_fallback: /* Fallback to RAM */ if (!cpu) { - cpu =3D dma_alloc_coherent(ctx->dev->dev, - rcb_size, - &dma, - GFP_KERNEL); + char name[32]; + + snprintf(name, sizeof(name), "rcb-%d", i); + cpu =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, ctx->dev->dev, + rcb_size, + &dma, + GFP_KERNEL, 0, &ctx->fh, + name); alloc_type =3D RKVDEC_ALLOC_DMA; } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c b= /drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c index b961fddc8583..b0cb6963c8e0 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c @@ -8,6 +8,7 @@ =20 #include #include +#include =20 #include "rkvdec.h" #include "rkvdec-cabac.h" @@ -387,8 +388,11 @@ static int rkvdec_h264_start(struct rkvdec_ctx *ctx) if (!h264_ctx) return -ENOMEM; =20 - priv_tbl =3D dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), - &h264_ctx->priv_tbl.dma, GFP_KERNEL); + priv_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + sizeof(*priv_tbl), + &h264_ctx->priv_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "vdpu381-h264-priv-tbl"); if (!priv_tbl) { ret =3D -ENOMEM; goto err_free_ctx; @@ -412,8 +416,10 @@ static void rkvdec_h264_stop(struct rkvdec_ctx *ctx) struct rkvdec_h264_ctx *h264_ctx =3D ctx->priv; struct rkvdec_dev *rkvdec =3D ctx->dev; =20 - dma_free_coherent(rkvdec->dev, h264_ctx->priv_tbl.size, - h264_ctx->priv_tbl.cpu, h264_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + h264_ctx->priv_tbl.size, + h264_ctx->priv_tbl.cpu, + h264_ctx->priv_tbl.dma, 0); kfree(h264_ctx); } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c b= /drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c index fe6414a17551..c1e16ba6f80f 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c @@ -7,6 +7,7 @@ */ =20 #include +#include =20 #include "rkvdec.h" #include "rkvdec-cabac.h" @@ -555,8 +556,11 @@ static int rkvdec_hevc_start(struct rkvdec_ctx *ctx) if (!hevc_ctx) return -ENOMEM; =20 - priv_tbl =3D dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), - &hevc_ctx->priv_tbl.dma, GFP_KERNEL); + priv_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + sizeof(*priv_tbl), + &hevc_ctx->priv_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "vdpu381-hevc-priv-tbl"); if (!priv_tbl) { ret =3D -ENOMEM; goto err_free_ctx; @@ -580,8 +584,10 @@ static void rkvdec_hevc_stop(struct rkvdec_ctx *ctx) struct rkvdec_hevc_ctx *hevc_ctx =3D ctx->priv; struct rkvdec_dev *rkvdec =3D ctx->dev; =20 - dma_free_coherent(rkvdec->dev, hevc_ctx->priv_tbl.size, - hevc_ctx->priv_tbl.cpu, hevc_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + hevc_ctx->priv_tbl.size, + hevc_ctx->priv_tbl.cpu, + hevc_ctx->priv_tbl.dma, 0); kfree(hevc_ctx); } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c b= /drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c index fb4f849d7366..3c1d3ca7cb6f 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c @@ -8,6 +8,7 @@ =20 #include #include +#include =20 #include =20 @@ -455,8 +456,11 @@ static int rkvdec_h264_start(struct rkvdec_ctx *ctx) if (!h264_ctx) return -ENOMEM; =20 - priv_tbl =3D dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), - &h264_ctx->priv_tbl.dma, GFP_KERNEL); + priv_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + sizeof(*priv_tbl), + &h264_ctx->priv_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "vdpu383-h264-priv-tbl"); if (!priv_tbl) { ret =3D -ENOMEM; goto err_free_ctx; @@ -481,8 +485,10 @@ static void rkvdec_h264_stop(struct rkvdec_ctx *ctx) struct rkvdec_h264_ctx *h264_ctx =3D ctx->priv; struct rkvdec_dev *rkvdec =3D ctx->dev; =20 - dma_free_coherent(rkvdec->dev, h264_ctx->priv_tbl.size, - h264_ctx->priv_tbl.cpu, h264_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + h264_ctx->priv_tbl.size, + h264_ctx->priv_tbl.cpu, + h264_ctx->priv_tbl.dma, 0); kfree(h264_ctx); } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c b= /drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c index 96d938ee70b0..b0ec46f482fa 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c @@ -7,6 +7,7 @@ */ =20 #include +#include =20 #include "rkvdec.h" #include "rkvdec-cabac.h" @@ -563,8 +564,11 @@ static int rkvdec_hevc_start(struct rkvdec_ctx *ctx) if (!hevc_ctx) return -ENOMEM; =20 - priv_tbl =3D dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), - &hevc_ctx->priv_tbl.dma, GFP_KERNEL); + priv_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + sizeof(*priv_tbl), + &hevc_ctx->priv_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "vdpu383-hevc-priv-tbl"); if (!priv_tbl) { ret =3D -ENOMEM; goto err_free_ctx; @@ -588,8 +592,10 @@ static void rkvdec_hevc_stop(struct rkvdec_ctx *ctx) struct rkvdec_hevc_ctx *hevc_ctx =3D ctx->priv; struct rkvdec_dev *rkvdec =3D ctx->dev; =20 - dma_free_coherent(rkvdec->dev, hevc_ctx->priv_tbl.size, - hevc_ctx->priv_tbl.cpu, hevc_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + hevc_ctx->priv_tbl.size, + hevc_ctx->priv_tbl.cpu, + hevc_ctx->priv_tbl.dma, 0); kfree(hevc_ctx); } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c b/drivers/= media/platform/rockchip/rkvdec/rkvdec-vp9.c index 2751f5396ee8..9f41f6ca82d1 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c @@ -20,6 +20,7 @@ #include #include #include +#include =20 #include "rkvdec.h" #include "rkvdec-regs.h" @@ -979,8 +980,11 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx) ctx->priv =3D vp9_ctx; =20 BUILD_BUG_ON(sizeof(priv_tbl->probs) % 16); /* ensure probs size is 128-b= it aligned */ - priv_tbl =3D dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), - &vp9_ctx->priv_tbl.dma, GFP_KERNEL); + priv_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + sizeof(*priv_tbl), + &vp9_ctx->priv_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "vp9-priv-tbl"); if (!priv_tbl) { ret =3D -ENOMEM; goto err_free_ctx; @@ -989,8 +993,11 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx) vp9_ctx->priv_tbl.size =3D sizeof(*priv_tbl); vp9_ctx->priv_tbl.cpu =3D priv_tbl; =20 - count_tbl =3D dma_alloc_coherent(rkvdec->dev, RKVDEC_VP9_COUNT_SIZE, - &vp9_ctx->count_tbl.dma, GFP_KERNEL); + count_tbl =3D v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + RKVDEC_VP9_COUNT_SIZE, + &vp9_ctx->count_tbl.dma, + GFP_KERNEL, 0, &ctx->fh, + "vp9-count-tbl"); if (!count_tbl) { ret =3D -ENOMEM; goto err_free_priv_tbl; @@ -1003,8 +1010,10 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx) return 0; =20 err_free_priv_tbl: - dma_free_coherent(rkvdec->dev, vp9_ctx->priv_tbl.size, - vp9_ctx->priv_tbl.cpu, vp9_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + vp9_ctx->priv_tbl.size, + vp9_ctx->priv_tbl.cpu, + vp9_ctx->priv_tbl.dma, 0); =20 err_free_ctx: kfree(vp9_ctx); @@ -1016,10 +1025,14 @@ static void rkvdec_vp9_stop(struct rkvdec_ctx *ctx) struct rkvdec_vp9_ctx *vp9_ctx =3D ctx->priv; struct rkvdec_dev *rkvdec =3D ctx->dev; =20 - dma_free_coherent(rkvdec->dev, vp9_ctx->count_tbl.size, - vp9_ctx->count_tbl.cpu, vp9_ctx->count_tbl.dma); - dma_free_coherent(rkvdec->dev, vp9_ctx->priv_tbl.size, - vp9_ctx->priv_tbl.cpu, vp9_ctx->priv_tbl.dma); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + vp9_ctx->count_tbl.size, + vp9_ctx->count_tbl.cpu, + vp9_ctx->count_tbl.dma, 0); + v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev, + vp9_ctx->priv_tbl.size, + vp9_ctx->priv_tbl.cpu, + vp9_ctx->priv_tbl.dma, 0); kfree(vp9_ctx); } =20 diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec.c b/drivers/medi= a/platform/rockchip/rkvdec/rkvdec.c index 1d1e9bfef8e9..8770fdb5c919 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec.c @@ -1208,6 +1208,8 @@ static int rkvdec_queue_init(void *priv, src_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; src_vq->lock =3D &rkvdec->vdev_lock; src_vq->dev =3D rkvdec->v4l2_dev.dev; + src_vq->v4l2_dev =3D &rkvdec->v4l2_dev; + src_vq->v4l2_fh =3D &ctx->fh; src_vq->supports_requests =3D true; src_vq->requires_requests =3D true; =20 @@ -1227,6 +1229,8 @@ static int rkvdec_queue_init(void *priv, dst_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; dst_vq->lock =3D &rkvdec->vdev_lock; dst_vq->dev =3D rkvdec->v4l2_dev.dev; + dst_vq->v4l2_dev =3D &rkvdec->v4l2_dev; + dst_vq->v4l2_fh =3D &ctx->fh; =20 return vb2_queue_init(dst_vq); } --=20 2.55.0