<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:10.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle19
        {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"><span style="font-size:11.0pt">On 6/1/22, 11:37 PM, "Michal Prívozník" <mprivozn@redhat.com> wrote:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> Worst case scenario we can do a version check. It's very suboptimal<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> because if somebody backports your patches in QEMU, libvirt will stop<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> working despite having the version check.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> Therefore, I'm more inclined to just use the newest API and well, 6.2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> won't work. In the long run - it's just one release that has the feature<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> but libvirt can't use it versus plenty of releases (that come after 7.0)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> which have the feature and libvirt can use it. If we go this way then<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> we'll still need version check, but the other way round:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>     if (qemuCaps->version < 7000000)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         virQEMUCapsClear(qemuCaps, QEMU_CAPS_SGX_EPC);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> Or just exit early and don't even bother detecting SGX when version is<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> not 7.0.0:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>     if (qemuCaps->version < 7000000)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         return 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> This has the downside that when somebody backports QEMU patches to 6.2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> to match the QAPI of 7.0 libvirt would still refuse to use the feature.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> But one can argue that at that point the maintainer should also patch<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> libvirt (very trivial patch to remove these two lines of condition).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> This is the reason we like QEMU to make features introspectable - we<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> could avoid all of this if we were able to detect .node attribute :-(<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> Now that I look at the output of query-qmp-schema command I see that 6.2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> returns:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>     {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       "name": "237",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       "members": [<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "sgx",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "sgx1",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "sgx2",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "flc",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "section-size",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "int"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       ],<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       "meta-type": "object"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>     },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> while 7.0 returns:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       "name": "237",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       "members": [<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "sgx",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "sgx1",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "sgx2",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "flc",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "bool"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "section-size",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "int",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "features": [<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>             "deprecated"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           ]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "name": "sections",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>           "type": "[454]"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>         }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       ],<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>       "meta-type": "object"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">>     }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> So maybe in the end libvirt CAN know the difference without having to do<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> any version check. We have a "dialect" of XPATH that we use to traverse<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> the QMP schema: look at the comment above virQEMUQAPISchemaPathGet().<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">This is awesome! Thank you so much for this very informative explanation.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">QEMU 7.0.0 provides more NUMA info in SGX part, so if we see "sections" in<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">QAPI schema, we can assume .node attribute is required.
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Let me try this solution at first. We can support both QEMU 6.2.0 and 7.0.0 in<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">V13 patches if it is doable.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Lin.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
</body>
</html>