<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 8/21/2024 10:08 AM, Thomas Hellström
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:3f2c8223b92facfa99c760dacd116fa93afada53.camel@linux.intel.com">
      <pre wrap="" class="moz-quote-pre">On Wed, 2024-08-21 at 09:47 +0200, Christian König wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="" class="moz-quote-pre">Am 20.08.24 um 18:46 schrieb Nirmoy Das:
</pre>
        <blockquote type="cite">
          <pre wrap="" class="moz-quote-pre">Hi Thomas, Christian,

On 8/20/2024 5:47 PM, Christian König wrote:
</pre>
          <blockquote type="cite">
            <pre wrap="" class="moz-quote-pre">Am 20.08.24 um 17:45 schrieb Thomas Hellström:
</pre>
            <blockquote type="cite">
              <pre wrap="" class="moz-quote-pre">On Tue, 2024-08-20 at 17:30 +0200, Christian König wrote:
</pre>
              <blockquote type="cite">
                <pre wrap="" class="moz-quote-pre">Am 20.08.24 um 15:33 schrieb Thomas Hellström:
</pre>
                <blockquote type="cite">
                  <pre wrap="" class="moz-quote-pre">Hi, Nirmoy, Christian

On Fri, 2024-08-16 at 15:51 +0200, Nirmoy Das wrote:
</pre>
                  <blockquote type="cite">
                    <pre wrap="" class="moz-quote-pre">Add TTM_TT_FLAG_CLEARED_ON_FREE, which DRM drivers can
set before
releasing backing stores if they want to skip clear-on-
free.

Cc: Matthew Auld <a class="moz-txt-link-rfc2396E" href="mailto:matthew.auld@intel.com"><matthew.auld@intel.com></a>
Cc: Thomas Hellström <a class="moz-txt-link-rfc2396E" href="mailto:thomas.hellstrom@linux.intel.com"><thomas.hellstrom@linux.intel.com></a>
Suggested-by: Christian König <a class="moz-txt-link-rfc2396E" href="mailto:christian.koenig@amd.com"><christian.koenig@amd.com></a>
Signed-off-by: Nirmoy Das <a class="moz-txt-link-rfc2396E" href="mailto:nirmoy.das@intel.com"><nirmoy.das@intel.com></a>
Reviewed-by: Christian König <a class="moz-txt-link-rfc2396E" href="mailto:christian.koenig@amd.com"><christian.koenig@amd.com></a>
</pre>
                  </blockquote>
                  <pre wrap="" class="moz-quote-pre">What happens if two devices share the same global TTM pool
   type and one that does its own clearing. Wouldn't there
be a
pretty
high chance that the the device that doesn't clear its own
pages
allocate non-cleared memory from the pool?
</pre>
                </blockquote>
                <pre wrap="" class="moz-quote-pre">That's completely unproblematic. The flag indicates that the
released
pages are already cleared, if that isn't the case then the
flag
shouldn't be set on the TT object.
</pre>
              </blockquote>
              <pre wrap="" class="moz-quote-pre">Yeah, this patch is OK, but the way the follow-up xe patch uses
it is
problematic since, AFAICT, xe dma clears on alloc, meaning the
pool
pages are not cleared after use.
</pre>
            </blockquote>
            <pre wrap="" class="moz-quote-pre">
Yeah that is clearly invalid behavior.
</pre>
          </blockquote>
          <pre wrap="" class="moz-quote-pre">

I was only thinking about one device use-case which won't leak any 
data though I am now miss-using the flag.

If I skip dma clear for pooled BO then this flag  is not really 
needed. Shall I revert the this and usage of
TTM_TT_FLAG_CLEARED_ON_FREE

and re-introduce it after I get a working clear on free
implementation 
for XE?
</pre>
        </blockquote>
        <pre wrap="" class="moz-quote-pre">
Yes absolutely.

I though that I made it clear that the handling should be that the 
driver clears the pages and *then* sets the
TTM_TT_FLAG_CLEARED_ON_FREE 
flag.

So if you don't have the handling implemented like that then that's 
clearly invalid behavior.

Regards,
Christian.
</pre>
      </blockquote>
      <pre wrap="" class="moz-quote-pre">
I agree.
Revert and re-introduce as needed, and obtain an ack from Christian to
merge through drm-xe-next before re-introduction so that it doesn't
clash with anything planned elsewhere.</pre>
    </blockquote>
    <p><br>
    </p>
    <p>Sent a series to revert the usages <span style="white-space: pre-wrap">TTM_TT_FLAG_CLEARED_ON_FREE.  </span></p>
    <p><span style="white-space: pre-wrap">Thanks both of you for your time and patience,</span></p>
    <p><span style="white-space: pre-wrap">Nirmoy
</span></p>
    <blockquote type="cite" cite="mid:3f2c8223b92facfa99c760dacd116fa93afada53.camel@linux.intel.com">
      <pre wrap="" class="moz-quote-pre">

Thanks,
Thomas



</pre>
      <blockquote type="cite">
        <pre wrap="" class="moz-quote-pre">
</pre>
        <blockquote type="cite">
          <pre wrap="" class="moz-quote-pre">

Regards,

Nirmoy


</pre>
          <blockquote type="cite">
            <pre wrap="" class="moz-quote-pre">
Regards,
Christian.

</pre>
            <blockquote type="cite">
              <pre wrap="" class="moz-quote-pre">
/Thomas

</pre>
              <blockquote type="cite">
                <pre wrap="" class="moz-quote-pre">If one device clear it's pages and another device doesn't
clear it's
pages then we would just clear the pages of the device which
doesn't
do
it with a hardware DMA.

Regards,
Christian.

</pre>
                <blockquote type="cite">
                  <pre wrap="" class="moz-quote-pre">/Thomas

</pre>
                  <blockquote type="cite">
                    <pre wrap="" class="moz-quote-pre">---
   drivers/gpu/drm/ttm/ttm_pool.c | 18 +++++++++++-------
   include/drm/ttm/ttm_tt.h       |  6 +++++-
   2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
b/drivers/gpu/drm/ttm/ttm_pool.c
index 8504dbe19c1a..935ab3cfd046 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -222,15 +222,18 @@ static void ttm_pool_unmap(struct
ttm_pool
*pool, dma_addr_t dma_addr,
   }
      /* Give pages into a specific pool_type */
-static void ttm_pool_type_give(struct ttm_pool_type *pt,
struct
page
*p)
+static void ttm_pool_type_give(struct ttm_pool_type *pt,
struct
page
*p,
+                   bool cleared)
   {
       unsigned int i, num_pages = 1 << pt->order;
   -    for (i = 0; i < num_pages; ++i) {
-        if (PageHighMem(p))
-            clear_highpage(p + i);
-        else
-            clear_page(page_address(p + i));
+    if (!cleared) {
+        for (i = 0; i < num_pages; ++i) {
+            if (PageHighMem(p))
+                clear_highpage(p + i);
+            else
+                clear_page(page_address(p + i));
+        }
       }
          spin_lock(&pt->lock);
@@ -394,6 +397,7 @@ static void
ttm_pool_free_range(struct
ttm_pool
*pool, struct ttm_tt *tt,
                   pgoff_t start_page, pgoff_t
end_page)
   {
       struct page **pages = &tt->pages[start_page];
+    bool cleared = tt->page_flags &
TTM_TT_FLAG_CLEARED_ON_FREE;
       unsigned int order;
       pgoff_t i, nr;
   @@ -407,7 +411,7 @@ static void
ttm_pool_free_range(struct
ttm_pool
*pool, struct ttm_tt *tt,
              pt = ttm_pool_select_type(pool, caching,
order);
           if (pt)
-            ttm_pool_type_give(pt, *pages);
+            ttm_pool_type_give(pt, *pages, cleared);
           else
               ttm_pool_free_page(pool, caching, order,
*pages);
       }
diff --git a/include/drm/ttm/ttm_tt.h
b/include/drm/ttm/ttm_tt.h
index 2b9d856ff388..cfaf49de2419 100644
--- a/include/drm/ttm/ttm_tt.h
+++ b/include/drm/ttm/ttm_tt.h
@@ -85,6 +85,9 @@ struct ttm_tt {
        * fault handling abuses the DMA api a bit and
dma_map_attrs
can't be
        * used to assure pgprot always matches.
        *
+     * TTM_TT_FLAG_CLEARED_ON_FREE: Set this if a drm
driver
handles
+     * clearing backing store
+     *
        * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only.
DO NOT
USE. This is
        * set by TTM after ttm_tt_populate() has
successfully
returned, and is
        * then unset when TTM calls ttm_tt_unpopulate().
@@ -94,8 +97,9 @@ struct ttm_tt {
   #define TTM_TT_FLAG_EXTERNAL        BIT(2)
   #define TTM_TT_FLAG_EXTERNAL_MAPPABLE    BIT(3)
   #define TTM_TT_FLAG_DECRYPTED        BIT(4)
+#define TTM_TT_FLAG_CLEARED_ON_FREE    BIT(5)
   -#define TTM_TT_FLAG_PRIV_POPULATED    BIT(5)
+#define TTM_TT_FLAG_PRIV_POPULATED    BIT(6)
       uint32_t page_flags;
       /** @num_pages: Number of pages in the page array.
*/
       uint32_t num_pages;
</pre>
                  </blockquote>
                </blockquote>
              </blockquote>
            </blockquote>
            <pre wrap="" class="moz-quote-pre">
</pre>
          </blockquote>
        </blockquote>
        <pre wrap="" class="moz-quote-pre">
</pre>
      </blockquote>
      <pre wrap="" class="moz-quote-pre">
</pre>
    </blockquote>
  </body>
</html>