On Wed, Jun 03, 2026 at 02:56:19PM +0800, Honglei Huang wrote: > From: Honglei Huang <[email protected]> > > Since the pages the physical pages and MM VA range has been abstractly > separated. Unbinding a single form of physical page from the MM VA > range, brings flexibility to the drm gpu SVM framework, transfer the > way of management of MM and device physical pages to the driver layer. > > framework's range embedded pages object and its range level wrappers > have no users left. Remove the following: > > - Drop pages in drm_gpusvm_range. > - Drop drm_gpusvm_range_pages_valid(), drm_gpusvm_range_get_pages() > and drm_gpusvm_range_unmap_pages(); drivers should use the > drm_gpusvm_pages helpers (drm_gpusvm_pages_valid, > drm_gpusvm_get_pages, drm_gpusvm_unmap_pages) directly on a > pages object they own. > - Drop the notifier_seq seeding in drm_gpusvm_range_alloc(); > drivers initialise notifier_seq on their own pages object. >
The patch looks good, but I think the kernel documentation at the top of drm_gpusvm.c should be updated—particularly the examples. It may also be worth updating the section explaining how pages are embedded in driver-side ranges, including the options for one-to-one or many-to-one mappings and the implications of each choice. Matt > Suggested-by: Matthew Brost <[email protected]> > Signed-off-by: Honglei Huang <[email protected]> > --- > drivers/gpu/drm/drm_gpusvm.c | 68 ------------------------------------ > include/drm/drm_gpusvm.h | 13 ------- > 2 files changed, 81 deletions(-) > > diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c > index a4b56cefeb2..55515390c53 100644 > --- a/drivers/gpu/drm/drm_gpusvm.c > +++ b/drivers/gpu/drm/drm_gpusvm.c > @@ -640,7 +640,6 @@ drm_gpusvm_range_alloc(struct drm_gpusvm *gpusvm, > range->itree.start = ALIGN_DOWN(fault_addr, chunk_size); > range->itree.last = ALIGN(fault_addr + 1, chunk_size) - 1; > INIT_LIST_HEAD(&range->entry); > - range->pages.notifier_seq = LONG_MAX; > range->flags.migrate_devmem = migrate_devmem ? 1 : 0; > > return range; > @@ -1329,27 +1328,6 @@ bool drm_gpusvm_pages_valid(struct drm_gpusvm *gpusvm, > } > EXPORT_SYMBOL_GPL(drm_gpusvm_pages_valid); > > -/** > - * drm_gpusvm_range_pages_valid() - GPU SVM range pages valid > - * @gpusvm: Pointer to the GPU SVM structure > - * @range: Pointer to the GPU SVM range structure > - * > - * This function determines if a GPU SVM range pages are valid. Expected be > - * called holding gpusvm->notifier_lock and as the last step before > committing a > - * GPU binding. This is akin to a notifier seqno check in the HMM > documentation > - * but due to wider notifiers (i.e., notifiers which span multiple ranges) > this > - * function is required for finer grained checking (i.e., per range) if pages > - * are valid. > - * > - * Return: True if GPU SVM range has valid pages, False otherwise > - */ > -bool drm_gpusvm_range_pages_valid(struct drm_gpusvm *gpusvm, > - struct drm_gpusvm_range *range) > -{ > - return drm_gpusvm_pages_valid(gpusvm, &range->pages); > -} > -EXPORT_SYMBOL_GPL(drm_gpusvm_range_pages_valid); > - > /** > * drm_gpusvm_pages_valid_unlocked() - GPU SVM pages valid unlocked > * @gpusvm: Pointer to the GPU SVM structure > @@ -1633,29 +1611,6 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm, > } > EXPORT_SYMBOL_GPL(drm_gpusvm_get_pages); > > -/** > - * drm_gpusvm_range_get_pages() - Get pages for a GPU SVM range > - * @gpusvm: Pointer to the GPU SVM structure > - * @range: Pointer to the GPU SVM range structure > - * @ctx: GPU SVM context > - * > - * This function gets pages for a GPU SVM range and ensures they are mapped > for > - * DMA access. > - * > - * Return: 0 on success, negative error code on failure. > - */ > -int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm, > - struct drm_gpusvm_range *range, > - const struct drm_gpusvm_ctx *ctx) > -{ > - return drm_gpusvm_get_pages(gpusvm, &range->pages, gpusvm->drm, > - gpusvm->mm, > - &range->notifier->notifier, > - drm_gpusvm_range_start(range), > - drm_gpusvm_range_end(range), ctx); > -} > -EXPORT_SYMBOL_GPL(drm_gpusvm_range_get_pages); > - > /** > * drm_gpusvm_unmap_pages() - Unmap GPU svm pages > * @gpusvm: Pointer to the GPU SVM structure > @@ -1686,29 +1641,6 @@ void drm_gpusvm_unmap_pages(struct drm_gpusvm *gpusvm, > } > EXPORT_SYMBOL_GPL(drm_gpusvm_unmap_pages); > > -/** > - * drm_gpusvm_range_unmap_pages() - Unmap pages associated with a GPU SVM > range > - * @gpusvm: Pointer to the GPU SVM structure > - * @range: Pointer to the GPU SVM range structure > - * @ctx: GPU SVM context > - * > - * This function unmaps pages associated with a GPU SVM range. If > @in_notifier > - * is set, it is assumed that gpusvm->notifier_lock is held in write mode; > if it > - * is clear, it acquires gpusvm->notifier_lock in read mode. Must be called > on > - * each GPU SVM range attached to notifier in gpusvm->ops->invalidate for > IOMMU > - * security model. > - */ > -void drm_gpusvm_range_unmap_pages(struct drm_gpusvm *gpusvm, > - struct drm_gpusvm_range *range, > - const struct drm_gpusvm_ctx *ctx) > -{ > - unsigned long npages = npages_in_range(drm_gpusvm_range_start(range), > - drm_gpusvm_range_end(range)); > - > - return drm_gpusvm_unmap_pages(gpusvm, &range->pages, npages, ctx); > -} > -EXPORT_SYMBOL_GPL(drm_gpusvm_range_unmap_pages); > - > /** > * drm_gpusvm_range_evict() - Evict GPU SVM range > * @gpusvm: Pointer to the GPU SVM structure > diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h > index 21baf91ec7e..250c59f0930 100644 > --- a/include/drm/drm_gpusvm.h > +++ b/include/drm/drm_gpusvm.h > @@ -173,7 +173,6 @@ struct drm_gpusvm_range_flags { > * @refcount: Reference count for the range > * @itree: Interval tree node for the range (inserted in GPU SVM notifier) > * @entry: List entry to fast interval tree traversal > - * @pages: The pages for this range. > * @flags: Flags for range see &struct drm_gpusvm_range_flags > * > * This structure represents a GPU SVM range used for tracking memory ranges > @@ -185,7 +184,6 @@ struct drm_gpusvm_range { > struct kref refcount; > struct interval_tree_node itree; > struct list_head entry; > - struct drm_gpusvm_pages pages; > struct drm_gpusvm_range_flags flags; > }; > > @@ -303,20 +301,9 @@ drm_gpusvm_range_get(struct drm_gpusvm_range *range); > > void drm_gpusvm_range_put(struct drm_gpusvm_range *range); > > -bool drm_gpusvm_range_pages_valid(struct drm_gpusvm *gpusvm, > - struct drm_gpusvm_range *range); > - > bool drm_gpusvm_pages_valid(struct drm_gpusvm *gpusvm, > struct drm_gpusvm_pages *svm_pages); > > -int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm, > - struct drm_gpusvm_range *range, > - const struct drm_gpusvm_ctx *ctx); > - > -void drm_gpusvm_range_unmap_pages(struct drm_gpusvm *gpusvm, > - struct drm_gpusvm_range *range, > - const struct drm_gpusvm_ctx *ctx); > - > bool drm_gpusvm_has_mapping(struct drm_gpusvm *gpusvm, unsigned long start, > unsigned long end); > > -- > 2.34.1 >
