Re: [PATCH v2 9/9] drm/i915: Use kmap_local_page() in gem/i915_gem_execbuffer.c

From: Fabio M. De Francesco
Date: Fri Mar 31 2023 - 11:32:29 EST


On venerdì 31 marzo 2023 13:30:20 CEST Tvrtko Ursulin wrote:
> On 31/03/2023 05:18, Ira Weiny wrote:
> > Zhao Liu wrote:
> >> From: Zhao Liu <zhao1.liu@xxxxxxxxx>
> >>
> >> The use of kmap_atomic() is being deprecated in favor of
> >> kmap_local_page()[1], and this patch converts the calls from
> >> kmap_atomic() to kmap_local_page().
> >>
> >> The main difference between atomic and local mappings is that local
> >> mappings doesn't disable page faults or preemption (the preemption is
> >> disabled for !PREEMPT_RT case, otherwise it only disables migration).
> >>
> >> With kmap_local_page(), we can avoid the often unwanted side effect of
> >> unnecessary page faults and preemption disables.
> >>
> >> In i915_gem_execbuffer.c, eb->reloc_cache.vaddr is mapped by
> >> kmap_atomic() in eb_relocate_entry(), and is unmapped by
> >> kunmap_atomic() in reloc_cache_reset().
> >
> > First off thanks for the series and sticking with this. That said this
> > patch kind of threw me for a loop because tracing the map/unmap calls did
> > not make sense to me. See below.
> >
> >> And this mapping/unmapping occurs in two places: one is in
> >> eb_relocate_vma(), and another is in eb_relocate_vma_slow().
> >>
> >> The function eb_relocate_vma() or eb_relocate_vma_slow() doesn't
> >> need to disable pagefaults and preemption during the above mapping/
> >> unmapping.
> >>
> >> So it can simply use kmap_local_page() / kunmap_local() that can
> >> instead do the mapping / unmapping regardless of the context.
> >>
> >> Convert the calls of kmap_atomic() / kunmap_atomic() to
> >> kmap_local_page() / kunmap_local().
> >>
> >> [1]:
> >> https://lore.kernel.org/all/20220813220034.806698-1-ira.weiny@xxxxxxxxx
> >>
> >> v2: No code change since v1. Added description of the motivation of
> >>
> >> using kmap_local_page() and "Suggested-by" tag of Fabio.
> >>
> >> Suggested-by: Ira Weiny <ira.weiny@xxxxxxxxx>
> >> Suggested-by: Fabio M. De Francesco <fmdefrancesco@xxxxxxxxx>
> >> Signed-off-by: Zhao Liu <zhao1.liu@xxxxxxxxx>
> >> ---
> >>
> >> Suggested by credits:
> >> Ira: Referred to his task document, review comments.
> >> Fabio: Referred to his boiler plate commit message and his description
> >>
> >> about why kmap_local_page() should be preferred.
> >>
> >> ---
> >>
> >> drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 10 +++++-----
> >> 1 file changed, 5 insertions(+), 5 deletions(-)
> >>

[snip]

> However I am unsure if disabling pagefaulting is needed or not. Thomas,
> Matt, being the last to touch this area, perhaps you could have a look?
> Because I notice we have a fallback iomap path which still uses
> io_mapping_map_atomic_wc. So if kmap_atomic to kmap_local conversion is
> safe, does the iomap side also needs converting to
> io_mapping_map_local_wc? Or they have separate requirements?

AFAIK, the requirements for io_mapping_map_local_wc() are the same as for
kmap_local_page(): the kernel virtual address is _only_ valid in the caller
context, and map/unmap nesting must be done in stack-based ordering (LIFO).

I think a follow up patch could safely switch to io_mapping_map_local_wc() /
io_mapping_unmap_local_wc since the address is local to context.

However, not being an expert, reading your note now I suspect that I'm missing
something. Can I ask why you think that page-faults disabling might be
necessary?

Thanks,

Fabio

> Regards,
>
> Tvrtko