* [PATCH v2] dma-buf/udmabuf: Disable the size limit by default
@ 2026-07-22 11:01 Robert Mader
2026-07-22 11:27 ` sashiko-bot
0 siblings, 1 reply; 3+ messages in thread
From: Robert Mader @ 2026-07-22 11:01 UTC (permalink / raw)
To: dri-devel
Cc: Robert Mader, Gerd Hoffmann, Vivek Kasireddy, Sumit Semwal,
Christian König, linux-media, linaro-mm-sig, linux-kernel
As udmabuf increasingly enjoys popularity - being used in projects like
libcamera, Gstreamer, Mesa, KWin and Weston - 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 and high bit depths.
In its current form the size limit for individual buffers does not seem to
provide any additional level of protection - such as limiting the amount of
memory a process can pin - as the later can just allocate multiple buffers.
If additional guardrails are desired, they would likely require some kind
accounting not limited to individual buffers.
Therefor let's disable the size limit by default by setting it to the
maximal possible value, INT_MAX.
Signed-off-by: Robert Mader <robert.mader@collabora.com>
---
Changes in V2:
- Use INT_MAX instead of 0 in order to not change behavior otherwise.
See
https://lore.kernel.org/dri-devel/20260711144814.8205-1-robert.mader@collabora.com/
for a previous attempt to make the value configurable via kconfig - and
in particular
https://lore.kernel.org/dri-devel/6764ca6f-b4d8-4baa-9d27-2ca867ac2d41@amd.com/
for the suggestion and discussion to remove the default limit.
---
drivers/dma-buf/udmabuf.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c
index bced421c0d65..639e93704924 100644
--- a/drivers/dma-buf/udmabuf.c
+++ b/drivers/dma-buf/udmabuf.c
@@ -20,9 +20,9 @@ static int list_limit = 1024;
module_param(list_limit, int, 0644);
MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit. Default is 1024.");
-static int size_limit_mb = 64;
+static int size_limit_mb = INT_MAX;
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 INT_MAX.");
struct udmabuf {
pgoff_t pagecount;
--
2.55.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] dma-buf/udmabuf: Disable the size limit by default
2026-07-22 11:01 [PATCH v2] dma-buf/udmabuf: Disable the size limit by default Robert Mader
@ 2026-07-22 11:27 ` sashiko-bot
2026-07-22 11:38 ` Robert Mader
0 siblings, 1 reply; 3+ messages in thread
From: sashiko-bot @ 2026-07-22 11:27 UTC (permalink / raw)
To: Robert Mader; +Cc: dri-devel, media-ci
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
New issues:
- [High] Removing the dmabuf size limit (by setting `size_limit_mb` to `INT_MAX`) allows an unprivileged user to request a massive buffer size (up to ~2.2 TB). This forces the kernel to attempt massive unbounded vmalloc allocations for the internal tracking arrays, rapidly exhausting system memory and triggering the OOM killer.
Pre-existing issues:
- [High] Setting `size_limit_mb` to `INT_MAX` allows unprivileged users to create udmabufs of 4GB or larger. On 32-bit architectures, this triggers an integer overflow when converting the page count back to bytes (`ubuf->pagecount << PAGE_SHIFT`), resulting in a size of 0 or a severely truncated value.
--
--- Patch [1]: [PATCH v2] dma-buf/udmabuf: Disable the size limit by default ---
commit f1c9db60e57729e9743c42b43759bab6d0eafb5d
Author: Robert Mader <robert.mader@collabora.com>
dma-buf/udmabuf: Disable the size limit by default
This commit disables the default 64MB size limit for udmabuf by setting it
to INT_MAX. It aims to support users who need larger buffers for high
resolution video formats. The change assumes the per-buffer size limit does
not provide sufficient protection on its own.
Link: https://lore.kernel.org/dri-devel/20260711144814.8205-1-robert.mader@collabora.com/
Link: https://lore.kernel.org/dri-devel/6764ca6f-b4d8-4baa-9d27-2ca867ac2d41@amd.com/
> diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c
> index bced421c0d658..639e937049242 100644
> --- a/drivers/dma-buf/udmabuf.c
> +++ b/drivers/dma-buf/udmabuf.c
> @@ -20,9 +20,9 @@ static int list_limit = 1024;
> module_param(list_limit, int, 0644);
> MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit. Default is 1024.");
>
> -static int size_limit_mb = 64;
> +static int size_limit_mb = INT_MAX;
[Severity: High]
Does this change allow an unprivileged user to exhaust kernel memory?
Because the size limit is effectively removed, an unprivileged user can
request an extremely large buffer size via /dev/udmabuf.
Looking at udmabuf_create() and init_udmabuf(), the internal tracking
arrays are allocated based on this requested size:
drivers/dma-buf/udmabuf.c:udmabuf_create() {
...
folios = kvmalloc_array(max_nr_folios, sizeof(*folios), GFP_KERNEL);
...
}
drivers/dma-buf/udmabuf.c:init_udmabuf() {
...
ubuf->pages = kvmalloc_objs(*ubuf->pages, pgcnt);
...
}
Since these allocations use GFP_KERNEL without __GFP_ACCOUNT, they bypass
memory cgroups. Could a large request trigger unbounded vmalloc allocations
that consume gigabytes of memory per ioctl call, leading to an OOM condition?
[Severity: High]
This is a pre-existing issue, but does removing the size limit expose a
page count overflow on 32-bit architectures?
When a user requests a size of 4GB or larger, the pagecount exceeds
1048576. In export_udmabuf() and get_sg_table(), the size is calculated by
shifting the page count:
drivers/dma-buf/udmabuf.c:export_udmabuf() {
...
exp_info.size = ubuf->pagecount << PAGE_SHIFT;
...
}
drivers/dma-buf/udmabuf.c:get_sg_table() {
...
ret = sg_alloc_table_from_pages(sg, ubuf->pages, ubuf->pagecount, 0,
ubuf->pagecount << PAGE_SHIFT,
GFP_KERNEL);
...
}
On 32-bit architectures, this 32-bit arithmetic wraps around to 0. Can
this result in a truncated dma-buf size or an invalid SG table with
0-length elements, potentially causing a panic in IOMMU drivers?
> 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 INT_MAX.");
>
> struct udmabuf {
> pgoff_t pagecount;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260722110145.36641-1-robert.mader@collabora.com?part=1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] dma-buf/udmabuf: Disable the size limit by default
2026-07-22 11:27 ` sashiko-bot
@ 2026-07-22 11:38 ` Robert Mader
0 siblings, 0 replies; 3+ messages in thread
From: Robert Mader @ 2026-07-22 11:38 UTC (permalink / raw)
To: sashiko-reviews; +Cc: dri-devel, media-ci
Responding to the report just for the record:
On 22.07.26 13:27, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
>
> New issues:
> - [High] Removing the dmabuf size limit (by setting `size_limit_mb` to `INT_MAX`) allows an unprivileged user to request a massive buffer size (up to ~2.2 TB). This forces the kernel to attempt massive unbounded vmalloc allocations for the internal tracking arrays, rapidly exhausting system memory and triggering the OOM killer.
>
> Pre-existing issues:
> - [High] Setting `size_limit_mb` to `INT_MAX` allows unprivileged users to create udmabufs of 4GB or larger. On 32-bit architectures, this triggers an integer overflow when converting the page count back to bytes (`ubuf->pagecount << PAGE_SHIFT`), resulting in a size of 0 or a severely truncated value.
> --
>
> --- Patch [1]: [PATCH v2] dma-buf/udmabuf: Disable the size limit by default ---
> commit f1c9db60e57729e9743c42b43759bab6d0eafb5d
> Author: Robert Mader <robert.mader@collabora.com>
>
> dma-buf/udmabuf: Disable the size limit by default
>
> This commit disables the default 64MB size limit for udmabuf by setting it
> to INT_MAX. It aims to support users who need larger buffers for high
> resolution video formats. The change assumes the per-buffer size limit does
> not provide sufficient protection on its own.
>
> Link: https://lore.kernel.org/dri-devel/20260711144814.8205-1-robert.mader@collabora.com/
> Link: https://lore.kernel.org/dri-devel/6764ca6f-b4d8-4baa-9d27-2ca867ac2d41@amd.com/
>
>> diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c
>> index bced421c0d658..639e937049242 100644
>> --- a/drivers/dma-buf/udmabuf.c
>> +++ b/drivers/dma-buf/udmabuf.c
>> @@ -20,9 +20,9 @@ static int list_limit = 1024;
>> module_param(list_limit, int, 0644);
>> MODULE_PARM_DESC(list_limit, "udmabuf_create_list->count limit. Default is 1024.");
>>
>> -static int size_limit_mb = 64;
>> +static int size_limit_mb = INT_MAX;
> [Severity: High]
> Does this change allow an unprivileged user to exhaust kernel memory?
>
> Because the size limit is effectively removed, an unprivileged user can
> request an extremely large buffer size via /dev/udmabuf.
>
> Looking at udmabuf_create() and init_udmabuf(), the internal tracking
> arrays are allocated based on this requested size:
>
> drivers/dma-buf/udmabuf.c:udmabuf_create() {
> ...
> folios = kvmalloc_array(max_nr_folios, sizeof(*folios), GFP_KERNEL);
> ...
> }
>
> drivers/dma-buf/udmabuf.c:init_udmabuf() {
> ...
> ubuf->pages = kvmalloc_objs(*ubuf->pages, pgcnt);
> ...
> }
>
> Since these allocations use GFP_KERNEL without __GFP_ACCOUNT, they bypass
> memory cgroups. Could a large request trigger unbounded vmalloc allocations
> that consume gigabytes of memory per ioctl call, leading to an OOM condition?
As mentioned in the commit message and as discussed in the mentioned
links, this is a pre-existing issue as users could just allocate
multiple buffer, having the same effect as allocating a single big one.
> [Severity: High]
> This is a pre-existing issue, but does removing the size limit expose a
> page count overflow on 32-bit architectures?
>
> When a user requests a size of 4GB or larger, the pagecount exceeds
> 1048576. In export_udmabuf() and get_sg_table(), the size is calculated by
> shifting the page count:
The udmabuf interface works on pre-allocated system memory. On a 32-bit
architecture users can't allocate more than 4GB of memory - so the
described request should be impossible.
>
> drivers/dma-buf/udmabuf.c:export_udmabuf() {
> ...
> exp_info.size = ubuf->pagecount << PAGE_SHIFT;
> ...
> }
>
> drivers/dma-buf/udmabuf.c:get_sg_table() {
> ...
> ret = sg_alloc_table_from_pages(sg, ubuf->pages, ubuf->pagecount, 0,
> ubuf->pagecount << PAGE_SHIFT,
> GFP_KERNEL);
> ...
> }
>
> On 32-bit architectures, this 32-bit arithmetic wraps around to 0. Can
> this result in a truncated dma-buf size or an invalid SG table with
> 0-length elements, potentially causing a panic in IOMMU drivers?
>
>> 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 INT_MAX.");
>>
>> struct udmabuf {
>> pgoff_t pagecount;
--
Robert Mader
Consultant Software Developer
Collabora Ltd.
Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, UK
Registered in England & Wales, no. 5513718
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-07-22 11:38 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-22 11:01 [PATCH v2] dma-buf/udmabuf: Disable the size limit by default Robert Mader
2026-07-22 11:27 ` sashiko-bot
2026-07-22 11:38 ` Robert Mader
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.