Hi,
On Mon, Oct 23, 2023 at 10:25:50AM -0700, Doug Anderson wrote:
> On Mon, Oct 23, 2023 at 9:31 AM Yuran Pereira <yuran.pereira(a)hotmail.com> wrote:
> >
> > Since "Clean up checks for already prepared/enabled in panels" has
> > already been done and merged [1], I think there is no longer a need
> > for this item to be in the gpu TODO.
> >
> > [1] https://patchwork.freedesktop.org/patch/551421/
> >
> > Signed-off-by: Yuran Pereira <yuran.pereira(a)hotmail.com>
> > ---
> > Documentation/gpu/todo.rst | 25 -------------------------
> > 1 file changed, 25 deletions(-)
>
> It's not actually all done. It's in a bit of a limbo state right now,
> unfortunately. I landed all of the "simple" cases where panels were
> needlessly tracking prepare/enable, but the less simple cases are
> still outstanding.
>
> Specifically the issue is that many panels have code to properly power
> cycle themselves off at shutdown time and in order to do that they
> need to keep track of the prepare/enable state. After a big, long
> discussion [1] it was decided that we could get rid of all the panel
> code handling shutdown if only all relevant DRM KMS drivers would
> properly call drm_atomic_helper_shutdown().
>
> I made an attempt to get DRM KMS drivers to call
> drm_atomic_helper_shutdown() [2] [3] [4]. I was able to land the
> patches that went through drm-misc, but currently many of the
> non-drm-misc ones are blocked waiting for attention.
>
> ...so things that could be done to help out:
>
> a) Could review patches that haven't landed in [4]. Maybe adding a
> Reviewed-by tag would help wake up maintainers?
>
> b) Could see if you can identify panels that are exclusively used w/
> DRM drivers that have already been converted and then we could post
> patches for just those panels. I have no idea how easy this task would
> be. Is it enough to look at upstream dts files by "compatible" string?
I think it is, yes.
Maxime
Hi Praan,
On 30/07/2026 23:55, Pranjal Shrivastava wrote:
> On Wed, Jul 15, 2026 at 06:47:26PM +0100, Matt Evans wrote:
>> Add vfio_pci_dma_buf_find_pfn(), which a VMA fault handler can use to
>> find a PFN.
>>
>> This supports multi-range DMABUFs, which typically would be used to
>> represent scattered spans but might even represent overlapping or
>> aliasing spans of PFNs.
>>
>> Because this is intended to be used in vfio_pci_core.c, we also need
>> to expose the struct vfio_pci_dma_buf in the vfio_pci_priv.h header.
>>
>> Signed-off-by: Matt Evans <matt(a)ozlabs.org>
>> ---
>> drivers/vfio/pci/vfio_pci_dmabuf.c | 153 ++++++++++++++++++++++++++---
>> drivers/vfio/pci/vfio_pci_priv.h | 20 ++++
>> 2 files changed, 160 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/vfio/pci/vfio_pci_dmabuf.c b/drivers/vfio/pci/vfio_pci_dmabuf.c
>> index c16f460c01d6..7c047400dfd1 100644
>> --- a/drivers/vfio/pci/vfio_pci_dmabuf.c
>> +++ b/drivers/vfio/pci/vfio_pci_dmabuf.c
>> @@ -9,19 +9,6 @@
>>
>> MODULE_IMPORT_NS("DMA_BUF");
>>
>> -struct vfio_pci_dma_buf {
>> - struct dma_buf *dmabuf;
>> - struct vfio_pci_core_device *vdev;
>> - struct list_head dmabufs_elm;
>> - size_t size;
>> - struct phys_vec *phys_vec;
>> - struct p2pdma_provider *provider;
>> - u32 nr_ranges;
>> - struct kref kref;
>> - struct completion comp;
>> - u8 revoked : 1;
>> -};
>> -
>> static int vfio_pci_dma_buf_attach(struct dma_buf *dmabuf,
>> struct dma_buf_attachment *attachment)
>> {
>> @@ -106,6 +93,146 @@ static const struct dma_buf_ops vfio_pci_dmabuf_ops = {
>> .release = vfio_pci_dma_buf_release,
>> };
>>
>> +int vfio_pci_dma_buf_find_pfn(struct vfio_pci_dma_buf *priv,
>> + struct vm_area_struct *vma,
>> + unsigned long fault_addr,
>> + unsigned int order,
>> + unsigned long *out_pfn)
>> +{
>> + /*
>> + * Given a VMA (start, end, pgoffs) and a fault address,
>> + * search the corresponding DMABUF's phys_vec[] to find the
>> + * range representing the address's offset into the VMA, and
>> + * its PFN.
>> + *
>> + * The phys_vec[] ranges represent contiguous spans of VAs
>> + * upwards from the buffer offset 0; the actual PFNs might be
>> + * in any order, overlap/alias, etc. Calculate an offset of
>> + * the desired page given VMA start/pgoff and address, then
>> + * search upwards from 0 to find which span contains it.
>> + *
>> + * On success, a valid PFN for a page sized by 'order' is
>> + * returned into out_pfn.
>> + *
>> + * Failure occurs if:
>> + * - A hugepage would cross the edge of the VMA,
>> + * - A hugepage isn't entirely contained within a range
>> + * (including where it straddles the boundary between
>> + * ranges),
>> + * - We find a range, but the final PFN isn't aligned to the
>> + * requested order.
>> + *
>> + * Upon failure, -EAGAIN is returned and the caller is
>> + * expected to try again with a smaller order, which will
>> + * eventually succeed (order=0 will always work).
>> + *
>> + * It's suboptimal if DMABUFs are created with neighbouring
>> + * ranges that are physically contiguous, since hugepages
>> + * can't straddle range boundaries. (The construction of the
>> + * ranges should merge them in this case.)
>> + *
>> + * Finally, vma_pgoff_adjust is used with a DMABUF created for
>> + * a VFIO BAR mmap: a BAR mapped with vm_pgoff > 0 creates a
>> + * DMABUF such that byte 0 of the VMA corresponds to byte 0 of
>> + * the DMABUF and byte 'vm_pgoff << PAGE_SHIFT' into the BAR.
>> + * To avoid double-offsetting in this scenario, subtracting
>> + * vma_pgoff_adjust from this (non-zero) vm_pgoff generates
>> + * the effective offset.
>> + */
>> +
>> + const unsigned long pagesize = PAGE_SIZE << order;
>> + unsigned long vma_off = ((vma->vm_pgoff - priv->vma_pgoff_adjust) <<
>> + PAGE_SHIFT) & VFIO_PCI_OFFSET_MASK;
>
> Maybe I'm getting ahead of myself here.. but it seems like this
> restricts us to only mapping DMABUFs at offsets < 1TB due to the
> VFIO_PCI_OFFSET_MASK (since we have HBMs on PCI devices now, hitting 1TB
> may not be a very distant future).
This is a really good question, thanks for raisiing it. It is not too
forward-thinking at all.
> While I understand this mask is needed to drop the BAR encoding in the
> high bits.
>
> My worry is, if in the future a user were to export a massive
> contiguous DMABUF (e.g., >1TB of aggregated HBM) and tried to mmap deep
> into it (passing an offset >= 1TB), this bitwise AND would silently drop
> the high bits, leading to silent data corruption.
One of the big advantages of DMABUF export was that the range could be
huge and unencumbered by the VFIO_PCI_OFFSET_SHIFT of the traditional
mmap() interface. It's a way to mmap huge BARs without having to change
the user-visible shift). So definitely this is a relevant concern.
> I think we should explicitly reject such an mmap with -EINVAL like:
>
> +const unsigned long pagesize = PAGE_SIZE << order;
> +unsigned long vma_off = (vma->vm_pgoff - priv->vma_pgoff_adjust) << PAGE_SHIFT;
>
> +/*
> + * Prevent silent wrap-around if the user mmaps a DMABUF at an
> + * offset greater than the VFIO index mask allows.
> + */
> +if (unlikely(vma_off > VFIO_PCI_OFFSET_MASK))
> + return -EINVAL;
>
> +vma_off &= VFIO_PCI_OFFSET_MASK;
Agreed, for now this absolutely should not silently wrap if the offset
is > 1TB, and we live with the restriction that a DMABUF sized >1TB
can't be mapped with such an offset. (We can still, say, map all of a
16TB DMABUF with offset=0, which is good.). I'll add a check, thanks
for pointing this out.
I suggest as something to revisit later, we flag for a DMABUF (maybe an
evolution of vma_pgoff_adjust) to differentiate whether this masking
needs to be applied (traditional mmap() path) or not (DMABUF mmap()),
and then offsets can be arbitrarily large.
Cheers,
Matt
>> + unsigned long rounded_page_addr = ALIGN_DOWN(fault_addr, pagesize);
>> + unsigned long rounded_page_end = rounded_page_addr + pagesize;
>> + unsigned long fault_offset;
>> + unsigned long fault_offset_end;
>> + unsigned long range_start_offset = 0;
>> + unsigned int i;
>> + int ret;
>> +
>
>
> Thanks,
> Praan
> Subject: Re: [PATCH v2] dma-buf/udmabuf: Disable the size limit by
> default
>
> On 28.07.26 22:20, Kasireddy, Vivek wrote:
> > Hi Robert,
> >
> >> Subject: [PATCH v2] dma-buf/udmabuf: Disable the size limit by
> default
> >>
> >> 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(a)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(a)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(a)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.");
> > Acked-by: Vivek Kasireddy <vivek.kasireddy(a)intel.com>
> >
> > If there are no further concerns/questions from anyone, I'll push it to
> > drm-misc-next soon.
>
> FTR., we already have a first duplicate :P
>
> https://lore.kernel.org/dri-devel/20260803144120.11524-1-
> xaver.hugl(a)kde.org/
Yeah, looks like this change seems to be desirable in many use-cases.
I have pushed it to drm-misc-next today.
Thanks,
Vivek
>
> >
> > Thanks,
> > Vivek
> >> struct udmabuf {
> >> pgoff_t pagecount;
> >> --
> >> 2.55.0
>
> --
> Robert Mader
> Consultant Software Developer
>
> Collabora Ltd.
> Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, UK
> Registered in England & Wales, no. 5513718