As udmabuf increasingly enjoys popularity - being used in projects like libcamera, Gstreamer, Mesa and KWin - users more frequently encounter cases where the current default size limit of 64MB is too low. Examples include allocating video buffers at a 8K resolution - and even 4K is affected when using non-subsampled video formats or high bit depths.
While the limit can already be changed via the kernel command line, exposing it as a kernel config makes that easier and more discoverable for distros. Thus let's do that.
Signed-off-by: Robert Mader robert.mader@collabora.com --- drivers/dma-buf/Kconfig | 6 ++++++ drivers/dma-buf/udmabuf.c | 4 ++++ 2 files changed, 10 insertions(+)
diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig index 7efc0f0d0712..35f0779cdc80 100644 --- a/drivers/dma-buf/Kconfig +++ b/drivers/dma-buf/Kconfig @@ -40,6 +40,12 @@ config UDMABUF A driver to let userspace turn memfd regions into dma-bufs. Qemu can use this to create host dmabufs for guest framebuffers.
+config UDMABUF_SIZE_LIMIT_MBYTES + int "Size limit in Mega Bytes" + default 64 + help + Maximum size of a udmabuf, in megabytes. Default is 64. + config DMABUF_DEBUG bool "DMA-BUF debug checks" depends on DMA_SHARED_BUFFER diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index bced421c0d65..a83153326362 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -20,7 +20,11 @@ static int list_limit = 1024; module_param(list_limit, int, 0644); MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit. Default is 1024.");
+#ifdef CONFIG_UDMABUF_SIZE_LIMIT_MBYTES +static int size_limit_mb = CONFIG_UDMABUF_SIZE_LIMIT_MBYTES; +#else static int size_limit_mb = 64; +#endif module_param(size_limit_mb, int, 0644); MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in megabytes. Default is 64.");
While there does not seem to be a particularly strong reason to have a size limit for udmabufs in the first place, raising the limit moderatly to 256MB is enough to avoid hitting the limit in increasingly common use-cases - notably allocating video buffers for 8K resolutions.
Signed-off-by: Robert Mader robert.mader@collabora.com --- drivers/dma-buf/Kconfig | 4 ++-- drivers/dma-buf/udmabuf.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig index 35f0779cdc80..0e7f5dc978e2 100644 --- a/drivers/dma-buf/Kconfig +++ b/drivers/dma-buf/Kconfig @@ -42,9 +42,9 @@ config UDMABUF
config UDMABUF_SIZE_LIMIT_MBYTES int "Size limit in Mega Bytes" - default 64 + default 256 help - Maximum size of a udmabuf, in megabytes. Default is 64. + Maximum size of a udmabuf, in megabytes. Default is 256.
config DMABUF_DEBUG bool "DMA-BUF debug checks" diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index a83153326362..c7649a04b865 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -23,10 +23,10 @@ MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit. Default is 1024. #ifdef CONFIG_UDMABUF_SIZE_LIMIT_MBYTES static int size_limit_mb = CONFIG_UDMABUF_SIZE_LIMIT_MBYTES; #else -static int size_limit_mb = 64; +static int size_limit_mb = 256; #endif module_param(size_limit_mb, int, 0644); -MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in megabytes. Default is 64."); +MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in megabytes. Default is 256.");
struct udmabuf { pgoff_t pagecount;
On 7/11/26 16:48, Robert Mader wrote:
As udmabuf increasingly enjoys popularity - being used in projects like libcamera, Gstreamer, Mesa and KWin - users more frequently encounter cases where the current default size limit of 64MB is too low. Examples include allocating video buffers at a 8K resolution - and even 4K is affected when using non-subsampled video formats or high bit depths.
While the limit can already be changed via the kernel command line, exposing it as a kernel config makes that easier and more discoverable for distros. Thus let's do that.
Well config options are usually only useful if the value can't be changed on runtime through a module parameter, but that is clearly not the case here.
On the other hand I do see your problem. I would just vote to disable the limit by default, there is nothing preventing userspace from allocating multiple uDMA-bufs so it doesn't seem to prevent any security issue or similar.
Regards, Christian.
Signed-off-by: Robert Mader robert.mader@collabora.com
drivers/dma-buf/Kconfig | 6 ++++++ drivers/dma-buf/udmabuf.c | 4 ++++ 2 files changed, 10 insertions(+)
diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig index 7efc0f0d0712..35f0779cdc80 100644 --- a/drivers/dma-buf/Kconfig +++ b/drivers/dma-buf/Kconfig @@ -40,6 +40,12 @@ config UDMABUF A driver to let userspace turn memfd regions into dma-bufs. Qemu can use this to create host dmabufs for guest framebuffers.
+config UDMABUF_SIZE_LIMIT_MBYTES
int "Size limit in Mega Bytes"default 64helpMaximum size of a udmabuf, in megabytes. Default is 64.config DMABUF_DEBUG bool "DMA-BUF debug checks" depends on DMA_SHARED_BUFFER diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index bced421c0d65..a83153326362 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -20,7 +20,11 @@ static int list_limit = 1024; module_param(list_limit, int, 0644); MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit. Default is 1024.");
+#ifdef CONFIG_UDMABUF_SIZE_LIMIT_MBYTES +static int size_limit_mb = CONFIG_UDMABUF_SIZE_LIMIT_MBYTES; +#else static int size_limit_mb = 64; +#endif module_param(size_limit_mb, int, 0644); MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in megabytes. Default is 64.");
-- 2.55.0
Hi,
On 13.07.26 11:12, Christian König wrote:
On 7/11/26 16:48, Robert Mader wrote:
As udmabuf increasingly enjoys popularity - being used in projects like libcamera, Gstreamer, Mesa and KWin - users more frequently encounter cases where the current default size limit of 64MB is too low. Examples include allocating video buffers at a 8K resolution - and even 4K is affected when using non-subsampled video formats or high bit depths.
While the limit can already be changed via the kernel command line, exposing it as a kernel config makes that easier and more discoverable for distros. Thus let's do that.
Well config options are usually only useful if the value can't be changed on runtime through a module parameter, but that is clearly not the case here.
On the other hand I do see your problem. I would just vote to disable the limit by default, there is nothing preventing userspace from allocating multiple uDMA-bufs so it doesn't seem to prevent any security issue or similar.
I fully agree and would prefer that as well. If there is no resistance / concerns from anybody I'll send a corresponding patch at the end of the week.
Thanks,
Robert
Regards, Christian.
Signed-off-by: Robert Mader robert.mader@collabora.com
drivers/dma-buf/Kconfig | 6 ++++++ drivers/dma-buf/udmabuf.c | 4 ++++ 2 files changed, 10 insertions(+)
diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig index 7efc0f0d0712..35f0779cdc80 100644 --- a/drivers/dma-buf/Kconfig +++ b/drivers/dma-buf/Kconfig @@ -40,6 +40,12 @@ config UDMABUF A driver to let userspace turn memfd regions into dma-bufs. Qemu can use this to create host dmabufs for guest framebuffers.
+config UDMABUF_SIZE_LIMIT_MBYTES
int "Size limit in Mega Bytes"default 64helpMaximum size of a udmabuf, in megabytes. Default is 64.- config DMABUF_DEBUG bool "DMA-BUF debug checks" depends on DMA_SHARED_BUFFER
diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index bced421c0d65..a83153326362 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -20,7 +20,11 @@ static int list_limit = 1024; module_param(list_limit, int, 0644); MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit. Default is 1024.");
+#ifdef CONFIG_UDMABUF_SIZE_LIMIT_MBYTES +static int size_limit_mb = CONFIG_UDMABUF_SIZE_LIMIT_MBYTES; +#else static int size_limit_mb = 64; +#endif module_param(size_limit_mb, int, 0644); MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in megabytes. Default is 64.");
-- 2.55.0
Hi Robert,
Subject: Re: [RFC PATCH 1/2] dma-buf/udmabuf: Introduce CONFIG_UDMABUF_SIZE_LIMIT_MBYTES
Hi,
On 13.07.26 11:12, Christian König wrote:
On 7/11/26 16:48, Robert Mader wrote:
As udmabuf increasingly enjoys popularity - being used in projects
like
libcamera, Gstreamer, Mesa and KWin - users more frequently
encounter
cases where the current default size limit of 64MB is too low.
Examples
include allocating video buffers at a 8K resolution - and even 4K is affected when using non-subsampled video formats or high bit
depths.
While the limit can already be changed via the kernel command line, exposing it as a kernel config makes that easier and more
discoverable
for distros. Thus let's do that.
Well config options are usually only useful if the value can't be
changed on runtime through a module parameter, but that is clearly not the case here.
On the other hand I do see your problem. I would just vote to disable
the limit by default, there is nothing preventing userspace from allocating multiple uDMA-bufs so it doesn't seem to prevent any security issue or similar.
I fully agree and would prefer that as well. If there is no resistance / concerns from anybody I'll send a corresponding patch at the end of the week.
AFAIU, the main motivation behind the limits was to ensure that there are some kind of guardrails. I am not opposed to their removal but I think it would now allow users to pin large arbitrary amounts of memory and I feel like there needs to be a way to prevent users from doing that.
Early RFC versions of udmabuf had mlock accounting to address this issue but not sure why it was dropped eventually. I am wondering if it makes sense to bring that back.
Thanks, Vivek
Thanks,
Robert
Regards, Christian.
Signed-off-by: Robert Mader robert.mader@collabora.com
drivers/dma-buf/Kconfig | 6 ++++++ drivers/dma-buf/udmabuf.c | 4 ++++ 2 files changed, 10 insertions(+)
diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig index 7efc0f0d0712..35f0779cdc80 100644 --- a/drivers/dma-buf/Kconfig +++ b/drivers/dma-buf/Kconfig @@ -40,6 +40,12 @@ config UDMABUF A driver to let userspace turn memfd regions into dma-bufs. Qemu can use this to create host dmabufs for guest
framebuffers.
+config UDMABUF_SIZE_LIMIT_MBYTES
int "Size limit in Mega Bytes"default 64helpMaximum size of a udmabuf, in megabytes. Default is 64.- config DMABUF_DEBUG bool "DMA-BUF debug checks" depends on DMA_SHARED_BUFFER
diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index bced421c0d65..a83153326362 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -20,7 +20,11 @@ static int list_limit = 1024; module_param(list_limit, int, 0644); MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit.
Default is 1024.");
+#ifdef CONFIG_UDMABUF_SIZE_LIMIT_MBYTES +static int size_limit_mb = CONFIG_UDMABUF_SIZE_LIMIT_MBYTES; +#else static int size_limit_mb = 64; +#endif module_param(size_limit_mb, int, 0644); MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in
megabytes. Default is 64.");
-- 2.55.0
linaro-mm-sig@lists.linaro.org