From: Matthew Brost <matthew.brost@intel.com>
To: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
Cc: <intel-xe@lists.freedesktop.org>,
<dri-devel@lists.freedesktop.org>, <apopple@nvidia.com>,
<airlied@gmail.com>, <christian.koenig@amd.com>,
<simona.vetter@ffwll.ch>, <felix.kuehling@amd.com>,
<dakr@kernel.org>
Subject: Re: [PATCH v2 16/29] drm/xe: Add migrate layer functions for SVM support
Date: Tue, 19 Nov 2024 15:08:31 -0800 [thread overview]
Message-ID: <Zz0ab2pm5epu++Z3@lstrano-desk.jf.intel.com> (raw)
In-Reply-To: <ffaf905b4c8b6c408e036ea69dd7cbb51735619b.camel@linux.intel.com>
On Tue, Nov 19, 2024 at 05:45:27PM +0100, Thomas Hellström wrote:
> On Tue, 2024-10-15 at 20:25 -0700, Matthew Brost wrote:
> > Add functions which migrate to / from VRAM accepting a single DPA
> > argument (VRAM) and array of dma addresses (SRAM).
> >
> > v2:
> > - Don't unlock job_mutex in error path of xe_migrate_vram
> >
> > Signed-off-by: Oak Zeng <oak.zeng@intel.com>
> > Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_migrate.c | 149
> > ++++++++++++++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_migrate.h | 10 +++
> > 2 files changed, 159 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_migrate.c
> > b/drivers/gpu/drm/xe/xe_migrate.c
> > index cfd31ae49cc1..d7b6636286ae 100644
> > --- a/drivers/gpu/drm/xe/xe_migrate.c
> > +++ b/drivers/gpu/drm/xe/xe_migrate.c
> > @@ -1542,6 +1542,155 @@ void xe_migrate_wait(struct xe_migrate *m)
> > dma_fence_wait(m->fence, false);
> > }
> >
> > +static u32 pte_update_cmd_size(u64 size)
> > +{
> > + u32 dword;
>
> dwords or num_dword?
>
num_dword
> > + u64 entries = DIV_ROUND_UP(size, XE_PAGE_SIZE);
> > +
> > + XE_WARN_ON(size > MAX_PREEMPTDISABLE_TRANSFER);
> > + /*
> > + * MI_STORE_DATA_IMM command is used to update page table.
> > Each
> > + * instruction can update maximumly 0x1ff pte entries. To
> > update
> > + * n (n <= 0x1ff) pte entries, we need:
> > + * 1 dword for the MI_STORE_DATA_IMM command header (opcode
> > etc)
> > + * 2 dword for the page table's physical location
> > + * 2*n dword for value of pte to fill (each pte entry is 2
> > dwords)
> > + */
> > + dword = (1 + 2) * DIV_ROUND_UP(entries, 0x1ff);
> > + dword += entries * 2;
> > +
> > + return dword;
> > +}
> > +
> > +static void build_pt_update_batch_sram(struct xe_migrate *m,
> > + struct xe_bb *bb, u32
> > pt_offset,
> > + dma_addr_t *sram_addr, u32
> > size)
> > +{
> > + u16 pat_index = tile_to_xe(m->tile)->pat.idx[XE_CACHE_WB];
> > + u32 ptes;
> > + int i = 0;
> > +
> > + ptes = DIV_ROUND_UP(size, XE_PAGE_SIZE);
> > + while (ptes) {
> > + u32 chunk = min(0x1ffU, ptes);
> > +
> > + bb->cs[bb->len++] = MI_STORE_DATA_IMM |
> > MI_SDI_NUM_QW(chunk);
> > + bb->cs[bb->len++] = pt_offset;
> > + bb->cs[bb->len++] = 0;
> > +
> > + pt_offset += chunk * 8;
> > + ptes -= chunk;
> > +
> > + while (chunk--) {
> > + u64 addr = sram_addr[i++] & PAGE_MASK;
> > +
> > + xe_tile_assert(m->tile, addr);
> > + addr = m->q->vm->pt_ops->pte_encode_addr(m-
> > >tile->xe,
> > +
> > addr, pat_index,
> > + 0,
> > false, 0);
> > + bb->cs[bb->len++] = lower_32_bits(addr);
> > + bb->cs[bb->len++] = upper_32_bits(addr);
> > + }
> > + }
> > +}
> > +
> > +enum xe_migrate_copy_dir {
> > + XE_MIGRATE_COPY_TO_VRAM,
> > + XE_MIGRATE_COPY_TO_SRAM,
> > +};
> > +
> > +static struct dma_fence *xe_migrate_vram(struct xe_migrate *m,
> > + unsigned long npages,
> > + dma_addr_t *sram_addr, u64
> > vram_addr,
> > + const enum
> > xe_migrate_copy_dir dir)
> > +{
> > + struct xe_gt *gt = m->tile->primary_gt;
> > + struct xe_device *xe = gt_to_xe(gt);
> > + struct dma_fence *fence = NULL;
> > + u32 batch_size = 2;
> > + u64 src_L0_ofs, dst_L0_ofs;
> > + u64 round_update_size;
> > + struct xe_sched_job *job;
> > + struct xe_bb *bb;
> > + u32 update_idx, pt_slot = 0;
> > + int err;
> > +
> > + round_update_size = min_t(u64, npages * PAGE_SIZE,
> > + MAX_PREEMPTDISABLE_TRANSFER);
>
> Hm. How does the caller know how many pages were actually migrated?
>
This is an intermediate between migrate_vma_setup and
migrate_vma_pages/finalize. The number of pages here is based on mpfn
returned from migrate_vma_setup. The migration for individual pages may
still be aborted in migrate_vma_pages/finalize. In this case both the
old and new page have the same data, dso migrate_vma_pages/finalize can
pick either page.
> > + batch_size += pte_update_cmd_size(round_update_size);
> > + batch_size += EMIT_COPY_DW;
> > +
> > + bb = xe_bb_new(gt, batch_size, true);
> > + if (IS_ERR(bb)) {
> > + err = PTR_ERR(bb);
> > + return ERR_PTR(err);
> > + }
> > +
> > + build_pt_update_batch_sram(m, bb, pt_slot * XE_PAGE_SIZE,
> > + sram_addr, round_update_size);
> > +
> > + if (dir == XE_MIGRATE_COPY_TO_VRAM) {
> > + src_L0_ofs = xe_migrate_vm_addr(pt_slot, 0);
> > + dst_L0_ofs = xe_migrate_vram_ofs(xe, vram_addr,
> > false);
> > +
> > + } else {
> > + src_L0_ofs = xe_migrate_vram_ofs(xe, vram_addr,
> > false);
> > + dst_L0_ofs = xe_migrate_vm_addr(pt_slot, 0);
> > + }
> > +
> > + bb->cs[bb->len++] = MI_BATCH_BUFFER_END;
> > + update_idx = bb->len;
> > +
> > + emit_copy(gt, bb, src_L0_ofs, dst_L0_ofs, round_update_size,
> > + XE_PAGE_SIZE);
> > +
> > + job = xe_bb_create_migration_job(m->q, bb,
> > + xe_migrate_batch_base(m,
> > true),
> > + update_idx);
> > + if (IS_ERR(job)) {
> > + err = PTR_ERR(job);
> > + goto err;
> > + }
> > +
> > + xe_sched_job_add_migrate_flush(job, 0);
> > +
> > + mutex_lock(&m->job_mutex);
> > + xe_sched_job_arm(job);
> > + fence = dma_fence_get(&job->drm.s_fence->finished);
> > + xe_sched_job_push(job);
> > +
> > + dma_fence_put(m->fence);
> > + m->fence = dma_fence_get(fence);
> > + mutex_unlock(&m->job_mutex);
> > +
> > + xe_bb_free(bb, fence);
> > +
> > + return fence;
> > +
> > +err:
> > + xe_bb_free(bb, NULL);
> > +
> > + return ERR_PTR(err);
> > +}
> > +
> > +struct dma_fence *xe_migrate_to_vram(struct xe_migrate *m,
> > + unsigned long npages,
> > + dma_addr_t *src_addr,
> > + u64 dst_addr)
>
> Kerneldoc.
>
Yep.
> > +{
> > + return xe_migrate_vram(m, npages, src_addr, dst_addr,
> > + XE_MIGRATE_COPY_TO_VRAM);
> > +}
> > +
> > +struct dma_fence *xe_migrate_from_vram(struct xe_migrate *m,
> > + unsigned long npages,
> > + u64 src_addr,
> > + dma_addr_t *dst_addr)
>
> Kerneldoc.
>
Yep.
Matt
> > +{
> > + return xe_migrate_vram(m, npages, dst_addr, src_addr,
> > + XE_MIGRATE_COPY_TO_SRAM);
> > +}
> > +
> > #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
> > #include "tests/xe_migrate.c"
> > #endif
> > diff --git a/drivers/gpu/drm/xe/xe_migrate.h
> > b/drivers/gpu/drm/xe/xe_migrate.h
> > index 0109866e398a..6ff9a963425c 100644
> > --- a/drivers/gpu/drm/xe/xe_migrate.h
> > +++ b/drivers/gpu/drm/xe/xe_migrate.h
> > @@ -95,6 +95,16 @@ struct xe_migrate_pt_update {
> >
> > struct xe_migrate *xe_migrate_init(struct xe_tile *tile);
> >
> > +struct dma_fence *xe_migrate_to_vram(struct xe_migrate *m,
> > + unsigned long npages,
> > + dma_addr_t *src_addr,
> > + u64 dst_addr);
> > +
> > +struct dma_fence *xe_migrate_from_vram(struct xe_migrate *m,
> > + unsigned long npages,
> > + u64 src_addr,
> > + dma_addr_t *dst_addr);
> > +
> > struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
> > struct xe_bo *src_bo,
> > struct xe_bo *dst_bo,
>
next prev parent reply other threads:[~2024-11-19 23:08 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-16 3:24 [PATCH v2 00/29] Introduce GPU SVM and Xe SVM implementation Matthew Brost
2024-10-16 3:24 ` [PATCH v2 01/29] drm/xe: Retry BO allocation Matthew Brost
2024-10-16 3:24 ` [PATCH v2 02/29] mm/migrate: Add migrate_device_prepopulated_range Matthew Brost
2024-10-16 4:04 ` Alistair Popple
2024-10-16 4:46 ` Matthew Brost
2024-10-17 0:56 ` Matthew Brost
2024-10-17 1:49 ` Alistair Popple
2024-10-17 2:45 ` Matthew Brost
2024-10-17 3:21 ` Alistair Popple
2024-10-17 4:07 ` Matthew Brost
2024-10-17 5:49 ` Alistair Popple
2024-10-17 15:40 ` Matthew Brost
2024-10-17 21:58 ` Alistair Popple
2024-10-18 0:54 ` Matthew Brost
2024-10-18 5:59 ` Alistair Popple
2024-10-18 6:39 ` Mika Penttilä
2024-10-18 7:16 ` Matthew Brost
2024-10-18 7:33 ` Matthew Brost
2024-10-18 7:34 ` Alistair Popple
2024-10-18 7:57 ` Matthew Brost
2024-10-18 4:02 ` Mika Penttilä
2024-10-18 5:55 ` Alistair Popple
2024-10-16 3:24 ` [PATCH v2 03/29] mm/migrate: Trylock device page in do_swap_page Matthew Brost
2024-10-16 4:00 ` Alistair Popple
2024-10-16 4:41 ` Matthew Brost
2024-10-17 1:51 ` Alistair Popple
2024-10-25 0:31 ` Matthew Brost
2024-10-29 6:37 ` Alistair Popple
2024-11-01 17:19 ` Matthew Brost
2024-11-28 23:31 ` Alistair Popple
2024-12-13 22:16 ` Matthew Brost
2024-12-14 5:59 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 04/29] drm/pagemap: Add DRM pagemap Matthew Brost
2024-10-16 3:24 ` [PATCH v2 05/29] drm/gpusvm: Add support for GPU Shared Virtual Memory Matthew Brost
2024-10-31 18:58 ` Thomas Hellström
2024-11-04 22:53 ` Matthew Brost
2024-11-04 15:25 ` Thomas Hellström
2024-11-04 17:21 ` Matthew Brost
2024-11-04 18:59 ` Thomas Hellström
2024-11-04 23:07 ` Matthew Brost
2024-11-05 10:22 ` Thomas Hellström
2024-11-05 16:12 ` Matthew Brost
2024-11-05 16:28 ` Thomas Hellström
2024-11-05 14:48 ` Thomas Hellström
2024-11-05 16:32 ` Matthew Brost
2024-11-20 3:00 ` Gwan-gyeong Mun
2024-11-29 0:00 ` Alistair Popple
2024-12-14 1:16 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 06/29] drm/xe/uapi: Add DRM_XE_VM_BIND_FLAG_SYSTEM_ALLOCATON flag Matthew Brost
2024-11-18 13:44 ` Thomas Hellström
2024-11-19 16:01 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 07/29] drm/xe: Add SVM init / close / fini to faulting VMs Matthew Brost
2024-11-19 12:13 ` Thomas Hellström
2024-11-19 16:22 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 08/29] drm/xe: Add dma_addr res cursor Matthew Brost
2024-11-19 12:15 ` Thomas Hellström
2024-11-19 16:24 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 09/29] drm/xe: Add SVM range invalidation Matthew Brost
2024-11-19 13:56 ` Thomas Hellström
2024-12-11 19:01 ` Matthew Brost
2024-12-14 23:11 ` Matthew Brost
2024-12-16 10:01 ` Thomas Hellström
2024-12-16 16:09 ` Matthew Brost
2024-12-16 17:35 ` Thomas Hellström
2024-10-16 3:24 ` [PATCH v2 10/29] drm/gpuvm: Add DRM_GPUVA_OP_USER Matthew Brost
2024-11-19 13:57 ` Thomas Hellström
2024-11-19 16:26 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 11/29] drm/xe: Add (re)bind to SVM page fault handler Matthew Brost
2024-11-19 14:26 ` Thomas Hellström
2024-12-11 19:07 ` Matthew Brost
2024-12-16 10:03 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 12/29] drm/xe: Add SVM garbage collector Matthew Brost
2024-11-19 14:45 ` Thomas Hellström
2024-12-11 19:17 ` Matthew Brost
2024-12-16 10:36 ` Thomas Hellström
2024-12-16 23:46 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 13/29] drm/xe: Add unbind to " Matthew Brost
2024-11-19 15:31 ` Thomas Hellström
2024-11-19 23:44 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 14/29] drm/xe: Do not allow system allocator VMA unbind if the GPU has bindings Matthew Brost
2024-11-19 16:33 ` Thomas Hellström
2024-11-19 23:37 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 15/29] drm/xe: Enable system allocator uAPI Matthew Brost
2024-11-19 16:34 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 16/29] drm/xe: Add migrate layer functions for SVM support Matthew Brost
2024-11-19 16:45 ` Thomas Hellström
2024-11-19 23:08 ` Matthew Brost [this message]
2024-11-20 8:04 ` Thomas Hellström
2024-12-11 19:11 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 17/29] drm/xe: Add SVM device memory mirroring Matthew Brost
2024-11-19 16:50 ` Thomas Hellström
2024-11-20 3:05 ` Gwan-gyeong Mun
2024-12-11 19:44 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 18/29] drm/xe: Add drm_gpusvm_devmem to xe_bo Matthew Brost
2024-11-19 16:51 ` Thomas Hellström
2024-12-15 4:38 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 19/29] drm/xe: Add GPUSVM devic memory copy vfunc functions Matthew Brost
2024-12-02 10:13 ` Thomas Hellström
2024-12-12 3:59 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 20/29] drm/xe: Add drm_pagemap ops to SVM Matthew Brost
2024-10-16 3:25 ` [PATCH v2 21/29] drm/xe: Add Xe SVM populate_devmem_pfn vfunc Matthew Brost
2024-12-02 10:19 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 22/29] drm/xe: Add Xe SVM devmem_release vfunc Matthew Brost
2024-12-02 10:21 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 23/29] drm/xe: Add BO flags required for SVM Matthew Brost
2024-12-02 10:44 ` Thomas Hellström
2024-12-11 21:42 ` Matthew Brost
2024-12-16 10:44 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 24/29] drm/xe: Add SVM VRAM migration Matthew Brost
2024-12-02 12:06 ` Thomas Hellström
2024-12-11 20:17 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 25/29] drm/xe: Basic SVM BO eviction Matthew Brost
2024-12-02 12:27 ` Thomas Hellström
2024-12-11 19:47 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 26/29] drm/xe: Add SVM debug Matthew Brost
2024-12-02 12:33 ` Thomas Hellström
2024-12-17 1:05 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 27/29] drm/xe: Add modparam for SVM notifier size Matthew Brost
2024-12-02 12:37 ` Thomas Hellström
2024-12-11 19:50 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 28/29] drm/xe: Add always_migrate_to_vram modparam Matthew Brost
2024-12-02 12:40 ` Thomas Hellström
2024-12-11 19:51 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 29/29] drm/doc: gpusvm: Add GPU SVM documentation Matthew Brost
2024-12-02 13:00 ` Thomas Hellström
2024-12-17 23:14 ` Matthew Brost
2024-10-16 3:30 ` ✓ CI.Patch_applied: success for Introduce GPU SVM and Xe SVM implementation (rev2) Patchwork
2024-10-16 3:31 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-16 3:31 ` ✗ CI.KUnit: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zz0ab2pm5epu++Z3@lstrano-desk.jf.intel.com \
--to=matthew.brost@intel.com \
--cc=airlied@gmail.com \
--cc=apopple@nvidia.com \
--cc=christian.koenig@amd.com \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=felix.kuehling@amd.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=simona.vetter@ffwll.ch \
--cc=thomas.hellstrom@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.