From: Ira Weiny <ira.weiny@intel.com>
To: "Fabio M. De Francesco" <fmdefrancesco@gmail.com>
Cc: "Jani Nikula" <jani.nikula@linux.intel.com>,
"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Tvrtko Ursulin" <tvrtko.ursulin@linux.intel.com>,
"David Airlie" <airlied@gmail.com>,
"Daniel Vetter" <daniel@ffwll.ch>,
"Matthew Auld" <matthew.auld@intel.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"Nirmoy Das" <nirmoy.das@intel.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Chris Wilson" <chris@chris-wilson.co.uk>,
"Christian König" <christian.koenig@amd.com>,
intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org,
"Zhao Liu" <zhao1.liu@linux.intel.com>,
"Zhenyu Wang" <zhenyu.z.wang@intel.com>,
"Zhao Liu" <zhao1.liu@intel.com>,
"Dave Hansen" <dave.hansen@intel.com>
Subject: Re: [PATCH 1/9] drm/i915: Use kmap_local_page() in gem/i915_gem_object.c
Date: Thu, 3 Nov 2022 09:51:23 -0700 [thread overview]
Message-ID: <Y2Pxi9FsdeULhHKI@iweiny-desk3> (raw)
In-Reply-To: <2541717.Lt9SDvczpP@suse>
On Sat, Oct 29, 2022 at 01:17:03PM +0200, Fabio M. De Francesco wrote:
> On lunedì 17 ottobre 2022 11:37:17 CEST Zhao Liu wrote:
> > From: Zhao Liu <zhao1.liu@intel.com>
> >
> > The use of kmap_atomic() is being deprecated in favor of
> > kmap_local_page()[1].
> >
> > The main difference between atomic and local mappings is that local
> > mappings doesn't disable page faults or preemption.
>
> You are right about about page faults which are never disabled by
> kmap_local_page(). However kmap_atomic might not disable preemption. It
> depends on CONFIG_PREEMPT_RT.
>
> Please refer to how kmap_atomic_prot() works (this function is called by
> kmap_atomic() when kernels have HIGHMEM enabled).
>
> >
> > There're 2 reasons why i915_gem_object_read_from_page_kmap() doesn't
> > need to disable pagefaults and preemption for mapping:
> >
> > 1. The flush operation is safe for CPU hotplug when preemption is not
> > disabled.
>
> I'm confused here. Why are you talking about CPU hotplug?
I agree with Fabio here. I'm not making the connection between cpu hotplug and
this code path.
Ira
> In any case, developers should never rely on implicit calls of
> preempt_disable() for the reasons said above. Therefore, flush operations
> should be allowed regardless that kmap_atomic() potential side effect.
>
> > In drm/i915/gem/i915_gem_object.c, the function
> > i915_gem_object_read_from_page_kmap() calls drm_clflush_virt_range()
>
> If I recall correctly, drm_clflush_virt_range() can always be called with page
> faults and preemption enabled. If so, this is enough to say that the
> conversion is safe.
>
> Is this code explicitly related to flushing the cache lines before removing /
> adding CPUs? If I recall correctly, there are several other reasons behind the
> need to issue cache lines flushes. Am I wrong about this?
>
> Can you please say more about what I'm missing here?
>
> > to
> > use CLFLUSHOPT or WBINVD to flush. Since CLFLUSHOPT is global on x86
> > and WBINVD is called on each cpu in drm_clflush_virt_range(), the flush
> > operation is global and any issue with cpu's being added or removed
> > can be handled safely.
>
> Again your main concern is about CPU hotplug.
>
> Even if I'm missing something, do we really need all these details about the
> inner workings of drm_clflush_virt_range()?
>
> I'm not an expert, so may be that I'm wrong about all I wrote above.
>
> Therefore, can you please elaborate a little more for readers with very little
> knowledge of these kinds of things (like me and perhaps others)?
>
> > 2. Any context switch caused by preemption or sleep (pagefault may
> > cause sleep) doesn't affect the validity of local mapping.
>
> I'd replace "preemption or sleep" with "preemption and page faults" since
> yourself then added that page faults lead to tasks being put to sleep.
>
> > Therefore, i915_gem_object_read_from_page_kmap() is a function where
> > the use of kmap_local_page() in place of kmap_atomic() is correctly
> > suited.
> >
> > Convert the calls of kmap_atomic() / kunmap_atomic() to
> > kmap_local_page() / kunmap_local().
> >
> > And remove the redundant variable that stores the address of the mapped
> > page since kunmap_local() can accept any pointer within the page.
> >
> > [1]: https://lore.kernel.org/all/20220813220034.806698-1-ira.weiny@intel.com
> >
> > Suggested-by: Dave Hansen <dave.hansen@intel.com>
> > Suggested-by: Ira Weiny <ira.weiny@intel.com>
> > Suggested-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > ---
> > Suggested by credits:
> > Dave: Referred to his explanation about cache flush.
> > Ira: Referred to his task document, review comments and explanation about
> > cache flush.
> > Fabio: Referred to his boiler plate commit message.
> > ---
> > drivers/gpu/drm/i915/gem/i915_gem_object.c | 8 +++-----
> > 1 file changed, 3 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c
> > b/drivers/gpu/drm/i915/gem/i915_gem_object.c index
> 369006c5317f..a0072abed75e 100644
> > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
> > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> > @@ -413,17 +413,15 @@ void __i915_gem_object_invalidate_frontbuffer(struct
> > drm_i915_gem_object *obj, static void
> > i915_gem_object_read_from_page_kmap(struct drm_i915_gem_object *obj, u64
> offset, void
> > *dst, int size) {
> > - void *src_map;
> > void *src_ptr;
> >
> > - src_map = kmap_atomic(i915_gem_object_get_page(obj, offset >>
> PAGE_SHIFT));
> > -
> > - src_ptr = src_map + offset_in_page(offset);
> > + src_ptr = kmap_local_page(i915_gem_object_get_page(obj, offset >>
> PAGE_SHIFT))
> > + + offset_in_page(offset);
> > if (!(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ))
> > drm_clflush_virt_range(src_ptr, size);
> > memcpy(dst, src_ptr, size);
> >
> > - kunmap_atomic(src_map);
> > + kunmap_local(src_ptr);
> > }
> >
> > static void
>
> The changes look good, but I'd like to better understand the commit message.
>
> Thanks,
>
> Fabio
>
>
next prev parent reply other threads:[~2022-11-03 16:51 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-17 9:37 [PATCH 0/9] drm/i915: Replace kmap_atomic() with kmap_local_page() Zhao Liu
2022-10-17 9:37 ` [PATCH 1/9] drm/i915: Use kmap_local_page() in gem/i915_gem_object.c Zhao Liu
2022-10-29 11:17 ` Fabio M. De Francesco
2022-11-03 16:51 ` Ira Weiny [this message]
2022-11-03 19:22 ` Fabio M. De Francesco
2022-11-04 11:44 ` Zhao Liu
2022-11-04 11:35 ` Zhao Liu
2022-11-04 11:29 ` Zhao Liu
2022-10-17 9:37 ` [PATCH 2/9] drm/i915: Use kmap_local_page() in gem/i915_gem_pyhs.c Zhao Liu
2022-10-29 13:32 ` Fabio M. De Francesco
2022-11-04 12:15 ` Zhao Liu
2022-10-17 9:37 ` [PATCH 3/9] drm/i915: Use kmap_local_page() in gem/i915_gem_shmem.c Zhao Liu
2022-11-03 16:49 ` Ira Weiny
2022-11-03 22:22 ` Fabio M. De Francesco
2022-10-17 9:37 ` [PATCH 4/9] drm/i915: Use kmap_local_page() in gem/selftests/huge_pages.c Zhao Liu
2022-10-17 9:37 ` [PATCH 5/9] drm/i915: Use kmap_local_page() in gem/selftests/i915_gem_coherency.c Zhao Liu
2022-10-17 9:37 ` [PATCH 6/9] drm/i915: Use kmap_local_page() in gem/selftests/i915_gem_context.c Zhao Liu
2022-10-17 9:37 ` [PATCH 7/9] drm/i915: Use memcpy_from_page() in gt/uc/intel_uc_fw.c Zhao Liu
2022-11-03 19:03 ` Ira Weiny
2022-10-17 9:37 ` [PATCH 8/9] drm/i915: Use kmap_local_page() in i915_cmd_parser.c Zhao Liu
2022-10-17 9:37 ` [PATCH 9/9] drm/i915: Use kmap_local_page() in gem/i915_gem_execbuffer.c Zhao Liu
2022-10-17 9:37 ` [PATCH v3] x86/hyperv: Replace kmap() with kmap_local_page() Zhao Liu
2022-10-17 9:53 ` Zhao Liu
2022-10-29 7:12 ` [PATCH 0/9] drm/i915: Replace kmap_atomic() " Fabio M. De Francesco
2022-11-04 10:44 ` Zhao Liu
2023-02-15 4:25 ` Ira Weiny
2023-02-15 7:13 ` Zhao Liu
2023-02-16 17:24 ` Ira Weiny
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=Y2Pxi9FsdeULhHKI@iweiny-desk3 \
--to=ira.weiny@intel.com \
--cc=airlied@gmail.com \
--cc=chris@chris-wilson.co.uk \
--cc=christian.koenig@amd.com \
--cc=daniel@ffwll.ch \
--cc=dave.hansen@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=fmdefrancesco@gmail.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=joonas.lahtinen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matthew.auld@intel.com \
--cc=nirmoy.das@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=thomas.hellstrom@linux.intel.com \
--cc=tvrtko.ursulin@linux.intel.com \
--cc=zhao1.liu@intel.com \
--cc=zhao1.liu@linux.intel.com \
--cc=zhenyu.z.wang@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox