<html 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=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">On 6/2/22, 11:28 AM, "Yang, Lin A" <lin.a.yang@intel.com> wrote:<o:p></o:p></p>
<p class="MsoNormal">> On 6/1/22, 11:37 PM, "Michal Prívozník" <<u>mprivozn@redhat.com</u>> wrote:<o:p></o:p></p>
<p class="MsoNormal">> > Worst case scenario we can do a version check. It's very suboptimal<o:p></o:p></p>
<p class="MsoNormal">> > because if somebody backports your patches in QEMU, libvirt will stop<o:p></o:p></p>
<p class="MsoNormal">> > working despite having the version check.<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > Therefore, I'm more inclined to just use the newest API and well, 6.2<o:p></o:p></p>
<p class="MsoNormal">> > won't work. In the long run - it's just one release that has the feature<o:p></o:p></p>
<p class="MsoNormal">> > but libvirt can't use it versus plenty of releases (that come after 7.0)<o:p></o:p></p>
<p class="MsoNormal">> > which have the feature and libvirt can use it. If we go this way then<o:p></o:p></p>
<p class="MsoNormal">> > we'll still need version check, but the other way round:<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> >     if (qemuCaps->version < 7000000)<o:p></o:p></p>
<p class="MsoNormal">> >         virQEMUCapsClear(qemuCaps, QEMU_CAPS_SGX_EPC);<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > Or just exit early and don't even bother detecting SGX when version is<o:p></o:p></p>
<p class="MsoNormal">> > not 7.0.0:<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> >     if (qemuCaps->version < 7000000)<o:p></o:p></p>
<p class="MsoNormal">> >         return 0;<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > This has the downside that when somebody backports QEMU patches to 6.2<o:p></o:p></p>
<p class="MsoNormal">> > to match the QAPI of 7.0 libvirt would still refuse to use the feature.<o:p></o:p></p>
<p class="MsoNormal">> > But one can argue that at that point the maintainer should also patch<o:p></o:p></p>
<p class="MsoNormal">> > libvirt (very trivial patch to remove these two lines of condition).<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > This is the reason we like QEMU to make features introspectable - we<o:p></o:p></p>
<p class="MsoNormal">> > could avoid all of this if we were able to detect .node attribute :-(<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > Now that I look at the output of query-qmp-schema command I see that 6.2<o:p></o:p></p>
<p class="MsoNormal">> > returns:<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> >     {<o:p></o:p></p>
<p class="MsoNormal">> >       "name": "237",<o:p></o:p></p>
<p class="MsoNormal">> >       "members": [<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "sgx",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "sgx1",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "sgx2",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "flc",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "section-size",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "int"<o:p></o:p></p>
<p class="MsoNormal">> >         }<o:p></o:p></p>
<p class="MsoNormal">> >       ],<o:p></o:p></p>
<p class="MsoNormal">> >       "meta-type": "object"<o:p></o:p></p>
<p class="MsoNormal">> >     },<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > while 7.0 returns:<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > {<o:p></o:p></p>
<p class="MsoNormal">> >       "name": "237",<o:p></o:p></p>
<p class="MsoNormal">> >       "members": [<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "sgx",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "sgx1",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "sgx2",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "flc",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "bool"<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "section-size",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "int",<o:p></o:p></p>
<p class="MsoNormal">> >           "features": [<o:p></o:p></p>
<p class="MsoNormal">> >             "deprecated"<o:p></o:p></p>
<p class="MsoNormal">> >           ]<o:p></o:p></p>
<p class="MsoNormal">> >         },<o:p></o:p></p>
<p class="MsoNormal">> >         {<o:p></o:p></p>
<p class="MsoNormal">> >           "name": "sections",<o:p></o:p></p>
<p class="MsoNormal">> >           "type": "[454]"<o:p></o:p></p>
<p class="MsoNormal">> >         }<o:p></o:p></p>
<p class="MsoNormal">> >       ],<o:p></o:p></p>
<p class="MsoNormal">> >       "meta-type": "object"<o:p></o:p></p>
<p class="MsoNormal">> >     }<o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > <o:p></o:p></p>
<p class="MsoNormal">> > So maybe in the end libvirt CAN know the difference without having to do<o:p></o:p></p>
<p class="MsoNormal">> > any version check. We have a "dialect" of XPATH that we use to traverse<o:p></o:p></p>
<p class="MsoNormal">> > the QMP schema: look at the comment above virQEMUQAPISchemaPathGet().<o:p></o:p></p>
<p class="MsoNormal">>  <o:p></o:p></p>
<p class="MsoNormal">> This is awesome! Thank you so much for this very informative explanation.<o:p></o:p></p>
<p class="MsoNormal">> QEMU 7.0.0 provides more NUMA info in SGX part, so if we see "sections" in<o:p></o:p></p>
<p class="MsoNormal">> QAPI schema, we can assume .node attribute is required. <o:p>
</o:p></p>
<p class="MsoNormal">>  <o:p></o:p></p>
<p class="MsoNormal">> Let me try this solution at first. We can support both QEMU 6.2.0 and 7.0.0 in<o:p></o:p></p>
<p class="MsoNormal">> V13 patches if it is doable.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Sorry for multiple emails here.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Since these patches here have been review several times, and support 7.0.0 will bring<o:p></o:p></p>
<p class="MsoNormal">some new commits. Each update to new commit will require git rebase and resolve<o:p></o:p></p>
<p class="MsoNormal">conflict for old commits. Is it possible that we add the feature to compare QAPI schema<o:p></o:p></p>
<p class="MsoNormal">and detect .node, but only work with 6.2.0 in this patch and return error message for<o:p></o:p></p>
<p class="MsoNormal">7.0.0. After finishing this thread, we can start a new thread to support NUMA for qemu<o:p></o:p></p>
<p class="MsoNormal">7.0.0. Any preference?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal">Lin.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>