Re: [PATCH v3 1/1] qemu: Add support for RAPL MSRs feature

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Peter,

Peter Krempa, Feb 12, 2025 at 17:17:
> On Wed, Feb 12, 2025 at 16:36:48 +0100, Anthony Harivel wrote:
>> Add the support in libvirt to activate the RAPL feature in QEMU.
>> 
>> This feature is activated with -accel kvm,rapl=true,path=/path/sock.sock
>> in QEMU.
>> 
>> The feature is activated in libvirt with the following XML
>> configuration:
>> 
>> <kvm>
>>   [...]
>>   <rapl state ='on' socket='/run/qemu-vmsr-helper.sock'/>
>>   [...]
>> </kvm>
>> 
>> See: https://gitlab.com/qemu-project/qemu/-/commit/0418f90809aea5b375c859e744c8e8610e9be446
>
> So what are the plans regarding the managed mode here?
>

I think I will go first, the way Paolo suggested, deliver the helper 
thought a RPM, i.e unmanaged by libvirt.
I did not find any relevant justification for this simple stateless helper
to be managed by libvirt.
Technically, the helper could also be distributed as a container. 
But I guess mixing RPM & container for an install is not very 
appreciated.
At the moment it comes with qemu RPM. The systemd files are included as 
well. 

> I don't necessarily need you to commit to anything but if libvirt is
> ever expected to support the managed mode we should at least have a
> strategy how to integrate that and document that only non-managed mode
> is supported.
>
> E.g. prepare for
>
>   <rapl state ='on' mode='unmanaged' socket='/run/qemu-vmsr-helper.sock'/>
>
> Or at least imply in the documentation that if socket is provided we
> expect an manually managed daemon to listen there.
>
>
>> Signed-off-by: Anthony Harivel <aharivel@xxxxxxxxxx>
>> ---
>>  docs/formatdomain.rst                          |  2 ++
>>  src/conf/domain_conf.c                         | 18 ++++++++++++++++++
>>  src/conf/domain_conf.h                         |  2 ++
>>  src/conf/schemas/domaincommon.rng              | 10 ++++++++++
>>  src/qemu/qemu_command.c                        | 12 ++++++++++++
>>  tests/qemuxmlconfdata/kvm-features-off.xml     |  1 +
>>  .../kvm-features.x86_64-latest.args            |  2 +-
>>  tests/qemuxmlconfdata/kvm-features.xml         |  1 +
>>  8 files changed, 47 insertions(+), 1 deletion(-)
>> 
>> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
>> index 83aeaa32c296..eceee1531085 100644
>> --- a/docs/formatdomain.rst
>> +++ b/docs/formatdomain.rst
>> @@ -2016,6 +2016,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off.
>>         <poll-control state='on'/>
>>         <pv-ipi state='off'/>
>>         <dirty-ring state='on' size='4096'/>
>> +       <rapl state ='on' socket='/run/qemu-vmsr-helper.sock'/>
>>       </kvm>
>>       <xen>
>>         <e820_host state='on'/>
>> @@ -2135,6 +2136,7 @@ are:
>>     poll-control   Decrease IO completion latency by introducing a grace period of busy waiting on, off                                                :since:`6.10.0 (QEMU 4.2)`
>>     pv-ipi         Paravirtualized send IPIs                                                    on, off                                                :since:`7.10.0 (QEMU 3.1)`
>>     dirty-ring     Enable dirty ring feature                                                    on, off; size - must be power of 2, range [1024,65536] :since:`8.0.0 (QEMU 6.1)`
>> +   rapl           Enable rapl feature                                                          on, off; socket - rapl helper socket                   :since:`10.8.0 (QEMU 9.1)`
>>     ============== ============================================================================ ====================================================== ============================
>
> The libvirt version here will need updating.
>
> Since this works only on intel:
>
>  $ qemu-system-x86_64 --accel kvm,rapl=true
> qemu-system-x86_64: --accel kvm,rapl=true: The RAPL feature can only be enabled on hosts with Intel CPU models
> qemu-system-x86_64: --accel kvm,rapl=true: kvm : error RAPL feature requirement not met
>
> you should document that. I don't think we need a specific CPU check for
> this niche feature.
>
>> @@ -16837,6 +16838,11 @@ virDomainFeaturesKVMDefParse(virDomainDef *def,
>>                  return -1;
>>              }
>>          }
>> +
>> +        /* rapl feature should parse socket property */
>> +        if (feature == VIR_DOMAIN_KVM_RAPL && value == VIR_TRISTATE_SWITCH_ON) {
>> +            def->kvm_features->rapl_helper_socket = virXMLPropString(feat, "socket");
>> +        }
>>      }
>
> Qemu will fail without a socket.
>
>   $ qemu-system-x86_64 --accel kvm,rapl=true
>   qemu-system-x86_64: --accel kvm,rapl=true: vmsr socket opening failed
>
> If you make the socket mandatory the presence of the socket could later
> be used to mean un-managed mode.
>
>
>>  
>>      def->features[VIR_DOMAIN_FEATURE_KVM] = VIR_TRISTATE_SWITCH_ON;
>> @@ -21308,6 +21314,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src,
>>              case VIR_DOMAIN_KVM_POLLCONTROL:
>>              case VIR_DOMAIN_KVM_PVIPI:
>>              case VIR_DOMAIN_KVM_DIRTY_RING:
>> +            case VIR_DOMAIN_KVM_RAPL:
>>                  if (src->kvm_features->features[i] != dst->kvm_features->features[i]) {
>>                      virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>>                                     _("State of KVM feature '%1$s' differs: source: '%2$s', destination: '%3$s'"),
>> @@ -28107,6 +28114,17 @@ virDomainDefFormatFeatures(virBuffer *buf,
>
> [...]
>
>>  typedef struct _virDomainFeatureTCG virDomainFeatureTCG;
>> diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
>> index 96cedb85e867..c910df8c75a0 100644
>> --- a/src/conf/schemas/domaincommon.rng
>> +++ b/src/conf/schemas/domaincommon.rng
>> @@ -8143,6 +8143,16 @@
>>              </optional>
>>            </element>
>>          </optional>
>> +        <optional>
>> +          <element name="rapl">
>> +            <ref name="featurestate"/>
>> +            <optional>
>> +              <attribute name="socket">
>> +                <ref name="absFilePath"/>
>> +              </attribute>
>> +            </optional>
>> +          </element>
>> +        </optional>
>>        </interleave>
>>      </element>
>>    </define>
>
> [...]
>
>> @@ -7062,6 +7065,15 @@ qemuBuildAccelCommandLine(virCommand *cmd,
>>              def->kvm_features->features[VIR_DOMAIN_KVM_DIRTY_RING] == VIR_TRISTATE_SWITCH_ON) {
>>              virBufferAsprintf(&buf, ",dirty-ring-size=%d", def->kvm_features->dirty_ring_size);
>>          }
>> +
>> +        if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON &&
>> +            def->kvm_features->features[VIR_DOMAIN_KVM_RAPL] == VIR_TRISTATE_SWITCH_ON) {
>> +            virBufferAddLit(&buf, ",rapl=true");
>> +
>> +            if (def->kvm_features->rapl_helper_socket != NULL) {
>> +                virBufferAsprintf(&buf, ",rapl-helper-socket=%s", def->kvm_features->rapl_helper_socket);
>> +            }
>
> As noted above; qemu makes the socket mandatory so the check doesn't
> make much sense.
>
> Also we'll most likely need to use virQEMUBuildBufferEscapeComma here to
> properly format paths with a comma since they are user-provided.
>
>> +        }
>>          break;
>>  
>>      case VIR_DOMAIN_VIRT_HVF:
>
> The code doesn't also do any security labelling of the socket. That
> means that the socket needs to be properly labelled manually. I think
> that should be documetned as well, so that there's no expectation of
> libvirt to do this.

Thanks for all your feedback. I've added all in my todo list for 
my next sprint. I understand that it needs way more documentation !

Anthony




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux