Re: [PATCH 1/1] cpu_riscv64.c: add update() implementation

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

 





On 4/28/23 12:40, Andrea Bolognani wrote:
On Thu, Apr 27, 2023 at 06:04:10PM -0300, Daniel Henrique Barboza wrote:
At this moment it is not possible to launch a 'riscv64' domain of type
'qemu' (i.e. TCG) and machine 'virt' in a x86 host:

$ sudo ./run tools/virsh start riscv-virt1
error: Failed to start domain 'riscv-virt1'
error: this function is not supported by the connection driver:
        cannot update guest CPU for riscv64 architecture

I get a different error message, specifically

   unsupported configuration: CPU mode 'custom' for riscv64 qemu
   domain on x86_64 host is not supported by hypervisor


Ha, I believe the patch is still relevant but I did a serious mess in the commit
message :(

The difference between what we're seeing is that I used a QEMU from riscv-to-apply.next
from the maintainer tree [1] instead of master. That tree has the following patch:

commit c13dfff2ded9cf2098a07e2426ffcad674602030
Author: Daniel Henrique Barboza <dbarboza@xxxxxxxxxxxxxxxx>
Date:   Tue Apr 11 15:35:10 2023 -0300

    target/riscv: add query-cpy-definitions support


With this QEMU, two things you're not seeing will start to happen:


- virQEMUCapsGetMachineDefaultCPU() will return the 'rv64' CPU, and
qemuDomainDefSetDefaultCPU() will add the <cpu> element during PostParse()
time;

- the error you're seeing from virQEMUCapsIsCPUModeSupported() won't happen
because this:

        cpus = virQEMUCapsGetAccel(qemuCaps, type)->cpuModels;
        return cpus && cpus->ncpus > 0;

won't return NULL anymore. You'll error out in the same point I am right now,
in virCPUUpdate(), because there's no driver->update() for the RISC-V driver.



I apologize for the confusion. I'll re-send the patch with a proper description:
we need the update() implementation to support the <cpu> definition. I'll also
make sure to test with QEMU master this time.



Thanks,


Daniel


[1] https://github.com/alistair23/qemu/tree/riscv-to-apply.next


A guest CPU definition will be added if absent by
qemuDomainSetDefaultCPU():

No such function exists, did you mean qemuDomainDefSetDefaultCPU()?

   <cpu mode='custom' match='exact' check='none'>
     <model fallback='forbid'>rv64</model>
   </cpu>

Note that I only started seeing the error message mentioned above
after I manually added this snippet to my domain XML.

If I don't do that, the <cpu> element doesn't show up at all and the
VM can be started just fine.

  struct cpuArchDriver cpuDriverRiscv64 = {
      .name = "riscv64",
      .arch = archs,
@@ -54,6 +80,6 @@ struct cpuArchDriver cpuDriverRiscv64 = {
      .decode     = NULL,
      .encode     = NULL,
      .baseline   = NULL,
-    .update     = NULL,
+    .update     = virCPUriscvUpdate,
      .validateFeatures = virCPURiscv64ValidateFeatures,

You should follow the naming convention already established for the
file.

I have not actually looked at the code yet. In theory the changes
sound fine, but the current situation as you describe it differs
enough from what I'm seeing here that I want to make sure we're on
the same page before spending any time on that. Are you working off
master? Do you have additional patches applied locally?

The full XML for the VM that I'm using for testing is below.


----- 8< ----- 8< ----- 8< ----- 8< ----- 8< ----- 8< ----- 8< -----

<domain type='qemu'>
   <name>ubuntu-riscv</name>
   <uuid>586faf27-2bf8-49cb-9601-9a62fe3de28d</uuid>
   <memory unit='KiB'>4194304</memory>
   <currentMemory unit='KiB'>4194304</currentMemory>
   <vcpu placement='static'>8</vcpu>
   <os>
     <type arch='riscv64' machine='virt'>hvm</type>
     <kernel>/var/lib/libvirt/images/riscv.u-boot.bin</kernel>
     <boot dev='hd'/>
   </os>
   <clock offset='utc'/>
   <on_poweroff>destroy</on_poweroff>
   <on_reboot>restart</on_reboot>
   <on_crash>destroy</on_crash>
   <devices>
     <emulator>/usr/bin/qemu-system-riscv64</emulator>
     <disk type='file' device='disk'>
       <driver name='qemu' type='qcow2'/>
       <source file='/var/lib/libvirt/images/ubuntu-riscv.qcow2'/>
       <target dev='vda' bus='virtio'/>
       <address type='pci' domain='0x0000' bus='0x04' slot='0x00'
function='0x0'/>
     </disk>
     <controller type='usb' index='0' model='qemu-xhci'>
       <address type='pci' domain='0x0000' bus='0x02' slot='0x00'
function='0x0'/>
     </controller>
     <controller type='pci' index='0' model='pcie-root'/>
     <controller type='pci' index='1' model='pcie-root-port'>
       <model name='pcie-root-port'/>
       <target chassis='1' port='0x8'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x0' multifunction='on'/>
     </controller>
     <controller type='pci' index='2' model='pcie-root-port'>
       <model name='pcie-root-port'/>
       <target chassis='2' port='0x9'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x1'/>
     </controller>
     <controller type='pci' index='3' model='pcie-root-port'>
       <model name='pcie-root-port'/>
       <target chassis='3' port='0xa'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x2'/>
     </controller>
     <controller type='pci' index='4' model='pcie-root-port'>
       <model name='pcie-root-port'/>
       <target chassis='4' port='0xb'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x3'/>
     </controller>
     <controller type='pci' index='5' model='pcie-root-port'>
       <model name='pcie-root-port'/>
       <target chassis='5' port='0xc'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x4'/>
     </controller>
     <controller type='pci' index='6' model='pcie-root-port'>
       <model name='pcie-root-port'/>
       <target chassis='6' port='0xd'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x5'/>
     </controller>
     <controller type='pci' index='7' model='pcie-root-port'>
       <model name='pcie-root-port'/>
       <target chassis='7' port='0xe'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x6'/>
     </controller>
     <controller type='virtio-serial' index='0'>
       <address type='pci' domain='0x0000' bus='0x03' slot='0x00'
function='0x0'/>
     </controller>
     <interface type='network'>
       <mac address='52:54:00:30:b4:bd'/>
       <source network='default'/>
       <model type='virtio'/>
       <address type='pci' domain='0x0000' bus='0x01' slot='0x00'
function='0x0'/>
     </interface>
     <serial type='pty'>
       <target type='system-serial' port='0'>
         <model name='16550a'/>
       </target>
     </serial>
     <console type='pty'>
       <target type='serial' port='0'/>
     </console>
     <channel type='unix'>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
       <address type='virtio-serial' controller='0' bus='0' port='1'/>
     </channel>
     <audio id='1' type='none'/>
     <memballoon model='virtio'>
       <address type='pci' domain='0x0000' bus='0x05' slot='0x00'
function='0x0'/>
     </memballoon>
     <rng model='virtio'>
       <backend model='random'>/dev/urandom</backend>
       <address type='pci' domain='0x0000' bus='0x06' slot='0x00'
function='0x0'/>
     </rng>
   </devices>
</domain>





[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