Re: [PATCH 2/3] drm/xe/oa: Use drm_gem_mmap_obj for OA buffer mmap

Umesh Nerlige Ramappa
2026-04-07T22:52:18Z

On Mon, Apr 06, 2026 at 08:02:18PM -0700, Ashutosh Dixit wrote:
>OA buffer mmap can currently only mmap OA buffer in system memory. CRI
>MERTOA buffer can be located in device memory. Switch OA buffer mmap to
>using drm_gem_mmap_obj, which can handle mmap's of both system and device
>memory buffers.
>
>Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>

If it works for both types of memory, then this looks better than
before,

Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>

Thanks,
Umesh
>---
> drivers/gpu/drm/xe/xe_oa.c | 19 +++----------------
> 1 file changed, 3 insertions(+), 16 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_oa.c b/drivers/gpu/drm/xe/xe_oa.c
>index dfd3b6a789cc3..0e65141e57ee8 100644
>--- a/drivers/gpu/drm/xe/xe_oa.c
>+++ b/drivers/gpu/drm/xe/xe_oa.c
>@@ -9,6 +9,7 @@
> #include <linux/poll.h>
>
> #include <drm/drm_drv.h>
>+#include <drm/drm_gem.h>
> #include <drm/drm_managed.h>
> #include <drm/drm_syncobj.h>
> #include <uapi/drm/xe_drm.h>
>@@ -900,8 +901,6 @@ static int xe_oa_alloc_oa_buffer(struct xe_oa_stream *stream, size_t size)
> return PTR_ERR(bo);
>
> stream->oa_buffer.bo = bo;
>- /* mmap implementation requires OA buffer to be in system memory */
>- xe_assert(stream->oa->xe, bo->vmap.is_iomem == 0);
> return 0;
> }
>
>@@ -1683,8 +1682,6 @@ static int xe_oa_mmap(struct file *file, struct vm_area_struct *vma)
> {
> struct xe_oa_stream *stream = file->private_data;
> struct xe_bo *bo = stream->oa_buffer.bo;
>- unsigned long start = vma->vm_start;
>- int i, ret;
>
> if (xe_observation_paranoid && !perfmon_capable()) {
> drm_dbg(&stream->oa->xe->drm, "Insufficient privilege to map OA buffer\n");
>@@ -1692,7 +1689,7 @@ static int xe_oa_mmap(struct file *file, struct vm_area_struct *vma)
> }
>
> /* Can mmap the entire OA buffer or nothing (no partial OA buffer mmaps) */
>- if (vma->vm_end - vma->vm_start != xe_bo_size(stream->oa_buffer.bo)) {
>+ if (vma->vm_end - vma->vm_start != xe_bo_size(bo)) {
> drm_dbg(&stream->oa->xe->drm, "Wrong mmap size, must be OA buffer size\n");
> return -EINVAL;
> }
>@@ -1708,17 +1705,7 @@ static int xe_oa_mmap(struct file *file, struct vm_area_struct *vma)
> vm_flags_mod(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP | VM_DONTCOPY,
> VM_MAYWRITE | VM_MAYEXEC);
>
>- xe_assert(stream->oa->xe, bo->ttm.ttm->num_pages == vma_pages(vma));
>- for (i = 0; i < bo->ttm.ttm->num_pages; i++) {
>- ret = remap_pfn_range(vma, start, page_to_pfn(bo->ttm.ttm->pages[i]),
>- PAGE_SIZE, vma->vm_page_prot);
>- if (ret)
>- break;
>-
>- start += PAGE_SIZE;
>- }
>-
>- return ret;
>+ return drm_gem_mmap_obj(&bo->ttm.base, xe_bo_size(bo), vma);
> }
>
> static const struct file_operations xe_oa_fops = {
>--
>2.48.1
>