<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;
        color:black;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext"> dri-devel [mailto:dri-devel-bounces@lists.freedesktop.org]
<b>On Behalf Of </b>Chunming Zhou<br>
<b>Sent:</b> Wednesday, November 22, 2017 2:02 PM<br>
<b>To:</b> dri-devel@lists.freedesktop.org<br>
<b>Subject:</b> Re: [PATCH 2/4] drm/ttm: add page order support in ttm_pages_put<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On 2017<span lang="ZH-CN" style="font-family:宋体">年</span>11<span lang="ZH-CN" style="font-family:宋体">月</span>22<span lang="ZH-CN" style="font-family:宋体">日</span> 13:36, Roger He wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>Change-Id: Ia55b206d95812c5afcfd6cec29f580758d1f50f0<o:p></o:p></pre>
<pre>Signed-off-by: Roger He <a href="mailto:Hongbo.He@amd.com"><Hongbo.He@amd.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> drivers/gpu/drm/ttm/ttm_page_alloc.c | 42 +++++++++++++++++++++++++++++-------<o:p></o:p></pre>
<pre> 1 file changed, 34 insertions(+), 8 deletions(-)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c<o:p></o:p></pre>
<pre>index 0a0c653..de64209 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c<o:p></o:p></pre>
<pre>@@ -285,13 +285,39 @@ static struct ttm_page_pool *ttm_get_pool(int flags, bool huge,<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /* set memory back to wb and free the pages. */<o:p></o:p></pre>
<pre>-static void ttm_pages_put(struct page *pages[], unsigned npages)<o:p></o:p></pre>
<pre>+static void ttm_pages_put(struct page *pages[], unsigned npages,<o:p></o:p></pre>
<pre>+        unsigned int order)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre>- unsigned i;<o:p></o:p></pre>
<pre>- if (set_pages_array_wb(pages, npages))<o:p></o:p></pre>
<pre>-        pr_err("Failed to set %d pages to wb!\n", npages);<o:p></o:p></pre>
<pre>- for (i = 0; i < npages; ++i)<o:p></o:p></pre>
<pre>-        __free_page(pages[i]);<o:p></o:p></pre>
<pre>+ struct page **pages_to_free = NULL;<o:p></o:p></pre>
<pre>+ struct page **pages_array;<o:p></o:p></pre>
<pre>+ struct page *p;<o:p></o:p></pre>
<pre>+ unsigned int i, j, pages_nr = (1 << order);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ if (order > 0) {<o:p></o:p></pre>
<pre>+        pages_to_free = kmalloc_array(pages_nr, sizeof(struct page *),<o:p></o:p></pre>
<pre>+                               GFP_KERNEL);<o:p></o:p></pre>
<pre>+        if (!pages_to_free) {<o:p></o:p></pre>
<pre>+                pr_err("Failed to allocate memory for ttm pages put operation\n");<o:p></o:p></pre>
<pre>+                return;<o:p></o:p></pre>
<pre>+        }<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ for (i = 0; i < npages; ++i) {<o:p></o:p></pre>
<pre><span style="color:red">+        if (order > 0) {<o:p></o:p></span></pre>
<pre><span style="color:red">+                p = pages[i];<o:p></o:p></span></pre>
<pre><span style="color:red">+                for (j = 0; j < pages_nr; ++j)<o:p></o:p></span></pre>
<pre><span style="color:red">+                        pages_to_free[j] = p++;<o:p></o:p></span></pre>
<pre><span style="color:red">+<o:p></o:p></span></pre>
<pre><span style="color:red">+                pages_array = pages_to_free;<o:p></o:p></span></pre>
<pre><span style="color:red">+        } else<o:p></o:p></span></pre>
<pre><span style="color:red">+                pages_array = pages;<o:p></o:p></span></pre>
<pre><span style="color:red">+<o:p></o:p></span></pre>
<pre><span style="color:red">+        if (set_pages_array_wb(pages_array, pages_nr))</span><o:p></o:p></pre>
</blockquote>
<p class="MsoNormal">you can use set_pages_wb(pages[i], 1 << order) to instead of creating page array marked red, this way, you will not need to kmalloc and patch#3.<br>
<br>
and more, if you select set_pages_wb, you also need to clone it in TTM like set_pages_array_wb for non-x86 case.<br>
<br>
<span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">good idea, going to refine code.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Thanks<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Roger(Hongbo.He)</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><br>
Regards,<br>
David Zhou<br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+                pr_err("Failed to set %d pages to wb!\n", pages_nr);<o:p></o:p></pre>
<pre>+        __free_pages(pages[i], order);<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ kfree(pages_to_free);<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static void ttm_pool_update_free_locked(struct ttm_page_pool *pool,<o:p></o:p></pre>
<pre>@@ -354,7 +380,7 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free,<o:p></o:p></pre>
<pre>                  */<o:p></o:p></pre>
<pre>                 spin_unlock_irqrestore(&pool->lock, irq_flags);<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-                ttm_pages_put(pages_to_free, freed_pages);<o:p></o:p></pre>
<pre>+                ttm_pages_put(pages_to_free, freed_pages, pool->order);<o:p></o:p></pre>
<pre>                 if (likely(nr_free != FREE_ALL_PAGES))<o:p></o:p></pre>
<pre>                         nr_free -= freed_pages;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>@@ -389,7 +415,7 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free,<o:p></o:p></pre>
<pre>  spin_unlock_irqrestore(&pool->lock, irq_flags);<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>  if (freed_pages)<o:p></o:p></pre>
<pre>-        ttm_pages_put(pages_to_free, freed_pages);<o:p></o:p></pre>
<pre>+        ttm_pages_put(pages_to_free, freed_pages, pool->order);<o:p></o:p></pre>
<pre> out:<o:p></o:p></pre>
<pre>  if (pages_to_free != static_buf)<o:p></o:p></pre>
<pre>         kfree(pages_to_free);<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>