<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:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" 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=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:SimSun;
        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:SimSun;
        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:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 129.75pt 1.0in 129.7pt;}
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 lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoPlainText"><a name="_MailEndCompose">Hi Christian,<o:p></o:p></a></p>
<p class="MsoPlainText">For the extra IO accesses for duplicated library, I plan to introduce the CopyFileOnChange() function to solve it. Below is the CopyFileOnChange() BZ, and I haven’t sent its patch yet. The CopyFileOnChange() will ensure only once IO
 store/restore access for each library. To avoid duplicated library access is critical not only for the performance, but also for the writing data race in multi-threads.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Basetool need CopyFileOnChange function to avoid cache file writing race in multi-thread build<o:p></o:p></p>
<p class="MsoPlainText"><a href="https://bugzilla.tianocore.org/show_bug.cgi?id=1894">https://bugzilla.tianocore.org/show_bug.cgi?id=1894</a>
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Thanks<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Steven Shi<o:p></o:p></p>
<p class="MsoPlainText">Intel\SSG\FID\Firmware Infrastructure<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><a name="_____replyseparator"></a>> -----Original Message-----</p>
<p class="MsoPlainText">> From: Rodriguez, Christian</p>
<p class="MsoPlainText">> Sent: Tuesday, June 11, 2019 11:41 PM</p>
<p class="MsoPlainText">> To: Shi, Steven <steven.shi@intel.com>; devel@edk2.groups.io</p>
<p class="MsoPlainText">> Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C <bob.c.feng@intel.com></p>
<p class="MsoPlainText">> Subject: RE: [PATCH] BaseTools: Cannot store library cache of different arch</p>
<p class="MsoPlainText">> together</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> The change looks good overall, but I'm concerned about the performance if</p>
<p class="MsoPlainText">> there are multiple of the same library used by different modules. In this case</p>
<p class="MsoPlainText">> the library will be copied once per arch per module. I'm not sure if it would</p>
<p class="MsoPlainText">> make a giant impact, but just something to think about because you would be</p>
<p class="MsoPlainText">> doing extra IO accesses for each duplicate library autogen.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> Possible suggestion:</p>
<p class="MsoPlainText">> Is it possible to change the hash to include the arch? Or you can store a</p>
<p class="MsoPlainText">> unique tuple pair like (lib.arch, lib) in the set to reduce the libraries being</p>
<p class="MsoPlainText">> copied to a unique subset.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> Thanks,</p>
<p class="MsoPlainText">> Christian</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> >-----Original Message-----</p>
<p class="MsoPlainText">> >From: Shi, Steven</p>
<p class="MsoPlainText">> >Sent: Monday, June 10, 2019 10:53 PM</p>
<p class="MsoPlainText">> >To: <a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a></p>
<p class="MsoPlainText">> >Cc: Gao, Liming <<a href="mailto:liming.gao@intel.com"><span style="color:windowtext;text-decoration:none">liming.gao@intel.com</span></a>>; Feng, Bob C</p>
<p class="MsoPlainText">> ><<a href="mailto:bob.c.feng@intel.com"><span style="color:windowtext;text-decoration:none">bob.c.feng@intel.com</span></a>>; Rodriguez, Christian</p>
<p class="MsoPlainText">> ><<a href="mailto:christian.rodriguez@intel.com"><span style="color:windowtext;text-decoration:none">christian.rodriguez@intel.com</span></a>></p>
<p class="MsoPlainText">> >Subject: [PATCH] BaseTools: Cannot store library cache of different arch</p>
<p class="MsoPlainText">> >together</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ><a href="https://bugzilla.tianocore.org/show_bug.cgi?id=1895"><span style="color:windowtext;text-decoration:none">https://bugzilla.tianocore.org/show_bug.cgi?id=1895</span></a></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> >Build cache cannot store cache for the same library modules in different arch</p>
<p class="MsoPlainText">> >together. E.g. Both the below IA32 and X64 arch BaseLib caches should exist</p>
<p class="MsoPlainText">> >after build Ovmf3264, but now only the one in X64 arch exist.</p>
<p class="MsoPlainText">> >The reason is the current Basetool use a set() to same all library AutoGen</p>
<p class="MsoPlainText">> >objects, but the different arch lib AutoGen objects have same __hash_ value</p>
<p class="MsoPlainText">> >which comes from the lib MetaFile(The path of module file):</p>
<p class="MsoPlainText">> >    def __hash__(self):</p>
<p class="MsoPlainText">> >        return hash(self.MetaFile)</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> >So the different arch lib AutoGen objects are duplicated one to the set() and</p>
<p class="MsoPlainText">> >only one can exist. This is why the Basetool can only store one arch cache for</p>
<p class="MsoPlainText">> >library.</p>
<p class="MsoPlainText">> >This patch avoid to use the set() as the container to save the library and</p>
<p class="MsoPlainText">> >module objects because the objects might have same __hash__ value.</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> >Cc: Liming Gao <<a href="mailto:liming.gao@intel.com"><span style="color:windowtext;text-decoration:none">liming.gao@intel.com</span></a>></p>
<p class="MsoPlainText">> >Cc: Bob Feng <<a href="mailto:bob.c.feng@intel.com"><span style="color:windowtext;text-decoration:none">bob.c.feng@intel.com</span></a>></p>
<p class="MsoPlainText">> >Cc: Christian Rodriguez <<a href="mailto:christian.rodriguez@intel.com"><span style="color:windowtext;text-decoration:none">christian.rodriguez@intel.com</span></a>></p>
<p class="MsoPlainText">> >Signed-off-by: Steven Shi <<a href="mailto:steven.shi@intel.com"><span style="color:windowtext;text-decoration:none">steven.shi@intel.com</span></a>></p>
<p class="MsoPlainText">> >---</p>
<p class="MsoPlainText">> > BaseTools/Source/Python/build/build.py | 13 +++----------</p>
<p class="MsoPlainText">> > 1 file changed, 3 insertions(+), 10 deletions(-)</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> >diff --git a/BaseTools/Source/Python/build/build.py</p>
<p class="MsoPlainText">> >b/BaseTools/Source/Python/build/build.py</p>
<p class="MsoPlainText">> >index 0855d4561c..f7a79cbbab 100644</p>
<p class="MsoPlainText">> >--- a/BaseTools/Source/Python/build/build.py</p>
<p class="MsoPlainText">> >+++ b/BaseTools/Source/Python/build/build.py</p>
<p class="MsoPlainText">> >@@ -2203,21 +2203,14 @@ class Build():</p>
<p class="MsoPlainText">> >             RemoveDirectory(os.path.dirname(GlobalData.gDatabasePath), True)</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> >     def CreateAsBuiltInf(self):</p>
<p class="MsoPlainText">> >-        all_lib_set = set()</p>
<p class="MsoPlainText">> >-        all_mod_set = set()</p>
<p class="MsoPlainText">> >         for Module in self.BuildModules:</p>
<p class="MsoPlainText">> >             Module.CreateAsBuiltInf()</p>
<p class="MsoPlainText">> >-            all_mod_set.add(Module)</p>
<p class="MsoPlainText">> >+            for lib in Module.LibraryAutoGenList:</p>
<p class="MsoPlainText">> >+                lib.CreateAsBuiltInf(True)</p>
<p class="MsoPlainText">> >         for Module in self.HashSkipModules:</p>
<p class="MsoPlainText">> >             Module.CreateAsBuiltInf(True)</p>
<p class="MsoPlainText">> >-            all_mod_set.add(Module)</p>
<p class="MsoPlainText">> >-        for Module in all_mod_set:</p>
<p class="MsoPlainText">> >             for lib in Module.LibraryAutoGenList:</p>
<p class="MsoPlainText">> >-                all_lib_set.add(lib)</p>
<p class="MsoPlainText">> >-        for lib in all_lib_set:</p>
<p class="MsoPlainText">> >-            lib.CreateAsBuiltInf(True)</p>
<p class="MsoPlainText">> >-        all_lib_set.clear()</p>
<p class="MsoPlainText">> >-        all_mod_set.clear()</p>
<p class="MsoPlainText">> >+                lib.CreateAsBuiltInf(True)</p>
<p class="MsoPlainText">> >         self.BuildModules = []</p>
<p class="MsoPlainText">> >         self.HashSkipModules = []</p>
<p class="MsoPlainText">> >     ## Do some clean-up works when error occurred</p>
<p class="MsoPlainText">> >--</p>
<p class="MsoPlainText">> >2.17.1.windows.2</p>
<p class="MsoPlainText"><o:p> </o:p></p>
</div>
</body>
</html>

<div width="1" style="color:white;clear:both">_._,_._,_</div>
<hr>
Groups.io Links:<p>

You receive all messages sent to this group.


<p>

<a target="_blank" href="https://edk2.groups.io/g/devel/message/42244">View/Reply Online (#42244)</a> |


  


|


  
    <a target="_blank" href="https://groups.io/mt/32013233/1813853">Mute This Topic</a>
  

| <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>



<br>

<a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> |
<a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |

<a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>

 [edk2-devel-archive@redhat.com]<br>
<div width="1" style="color:white;clear:both">_._,_._,_</div>