mirror of https://gitee.com/openkylin/libvirt.git
docs: Convert 'pci-hotplug' page to rST
One internal reference was modified to work properly. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
b4ae5dbe4a
commit
1824ed94f7
|
@ -51,7 +51,6 @@ docs_html_in_files = [
|
|||
'internals',
|
||||
'java',
|
||||
'logging',
|
||||
'pci-hotplug',
|
||||
'php',
|
||||
'python',
|
||||
'remote',
|
||||
|
@ -104,6 +103,7 @@ docs_rst_files = [
|
|||
'newreposetup',
|
||||
'nss',
|
||||
'pci-addresses',
|
||||
'pci-hotplug',
|
||||
'platforms',
|
||||
'programming-languages',
|
||||
'securityprocess',
|
||||
|
|
|
@ -1,185 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>PCI topology and hotplug</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
Perhaps surprisingly, most libvirt guests support only limited PCI
|
||||
device hotplug out of the box, or even none at all.
|
||||
</p>
|
||||
<p>
|
||||
The reason for this apparent limitation is the fact that each
|
||||
hotplugged PCI device might require additional PCI controllers to
|
||||
be added to the guest. Since most PCI controllers can't be
|
||||
hotplugged, they need to be added before the guest is started;
|
||||
however, libvirt has no way of knowing in advance how many devices
|
||||
will be hotplugged during the guest's lifetime, thus making it
|
||||
impossible to automatically provide the right amount of PCI
|
||||
controllers: any arbitrary number would end up being too big
|
||||
for some users, and too small for others.
|
||||
</p>
|
||||
<p>
|
||||
Ultimately, the user is the only one who knows how much the guest
|
||||
will need to grow dynamically, so the responsibility of planning
|
||||
a suitable PCI topology in advance falls on them.
|
||||
</p>
|
||||
<p>
|
||||
This document aims at providing all the information needed to
|
||||
successfully plan the PCI topology of a guest. Note that the
|
||||
details can vary a lot between architectures and even machine
|
||||
types, hence the way it's organized.
|
||||
</p>
|
||||
|
||||
<h2><a id="x86_64">x86_64 architecture</a></h2>
|
||||
|
||||
<h3><a id="x86_64-q35">q35 machine type</a></h3>
|
||||
|
||||
<p>
|
||||
This is a PCI Express native machine type. The default PCI topology
|
||||
looks like
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<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='0x10'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
||||
</controller></pre>
|
||||
|
||||
<p>
|
||||
and supports hotplugging a single PCI Express device, either
|
||||
emulated or assigned from the host.
|
||||
</p>
|
||||
<p>
|
||||
If you have a very specific use case, such as the appliances
|
||||
used by <a href="https://libguestfs.org/">libguestfs</a> behind
|
||||
the scenes to access disk images, and this automatically-added
|
||||
<code>pcie-root-port</code> controller ends up being a nuisance,
|
||||
you can prevent libvirt from adding it by manually managing PCI
|
||||
controllers and addresses according to your needs.
|
||||
</p>
|
||||
<p>
|
||||
Slots on the <code>pcie-root</code> controller do not support
|
||||
hotplug, so the device will be hotplugged into the
|
||||
<code>pcie-root-port</code> controller. If you plan to hotplug
|
||||
more than a single PCI Express device, you should add a suitable
|
||||
number of <code>pcie-root-port</code> controllers when defining
|
||||
the guest: for example, add
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<controller type='pci' model='pcie-root'/>
|
||||
<controller type='pci' model='pcie-root-port'/>
|
||||
<controller type='pci' model='pcie-root-port'/>
|
||||
<controller type='pci' model='pcie-root-port'/></pre>
|
||||
|
||||
<p>
|
||||
if you expect to hotplug up to three PCI Express devices,
|
||||
either emulated or assigned from the host. That's all the
|
||||
information you need to provide: libvirt will fill in the
|
||||
remaining details automatically. Note that you need to add
|
||||
the <code>pcie-root</code> controller along with the
|
||||
<code>pcie-root-port</code> controllers or you will get an
|
||||
error.
|
||||
</p>
|
||||
<p>
|
||||
Note that if you're adding PCI controllers to a guest and at
|
||||
the same time you're also adding PCI devices, some of the
|
||||
controllers will be used for the newly-added devices and won't
|
||||
be available for hotplug once the guest has been started.
|
||||
</p>
|
||||
<p>
|
||||
If you expect to hotplug legacy PCI devices, then you will need
|
||||
specialized controllers, since all those mentioned above are
|
||||
intended for PCI Express devices only: add
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<controller type='pci' model='pcie-to-pci-bridge'/></pre>
|
||||
|
||||
<p>
|
||||
and you'll be able to hotplug up to 31 legacy PCI devices,
|
||||
either emulated or assigned from the host, in the slots
|
||||
from 0x01 to 0x1f of the <code>pcie-to-pci-bridge</code> controller.
|
||||
</p>
|
||||
|
||||
<h3><a id="x86_64-i440fx">i440fx (pc) machine type</a></h3>
|
||||
|
||||
<p>
|
||||
This is a legacy PCI native machine type. The default PCI
|
||||
topology looks like
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<controller type='pci' index='0' model='pci-root'/></pre>
|
||||
|
||||
<p>
|
||||
where each of the 31 slots (from 0x01 to 0x1f) on the
|
||||
<code>pci-root</code> controller is hotplug capable and
|
||||
can accept a legacy PCI device, either emulated or
|
||||
assigned from the guest.
|
||||
</p>
|
||||
|
||||
<h2><a id="ppc64">ppc64 architecture</a></h2>
|
||||
|
||||
<h3><a id="ppc64-pseries">pseries machine type</a></h3>
|
||||
|
||||
<p>
|
||||
The default PCI topology for the <code>pseries</code> machine
|
||||
type looks like
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<controller type='pci' index='0' model='pci-root'>
|
||||
<model name='spapr-pci-host-bridge'/>
|
||||
<target index='0'/>
|
||||
</controller></pre>
|
||||
|
||||
<p>
|
||||
The 31 slots, from 0x01 to 0x1f, on a <code>pci-root</code>
|
||||
controller are all hotplug capable and, despite the name
|
||||
suggesting otherwise, starting with QEMU 2.9 all of them
|
||||
can accept PCI Express devices in addition to legacy PCI
|
||||
devices; however, libvirt will only place emulated devices
|
||||
on the default <code>pci-root</code> controller.
|
||||
</p>
|
||||
<p>
|
||||
In order to take advantage of improved error reporting and
|
||||
recovering capabilities, PCI devices assigned from the
|
||||
host need to be isolated by placing each on a separate
|
||||
<code>pci-root</code> controller, which has to be prepared
|
||||
in advance for hotplug to work: for example, add
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<controller type='pci' model='pci-root'/>
|
||||
<controller type='pci' model='pci-root'/>
|
||||
<controller type='pci' model='pci-root'/></pre>
|
||||
|
||||
<p>
|
||||
if you expect to hotplug up to three PCI devices assigned
|
||||
from the host.
|
||||
</p>
|
||||
|
||||
<h2><a id="aarch64">aarch64 architecture</a></h2>
|
||||
|
||||
<h3><a id="aarch64-virt">mach-virt (virt) machine type</a></h3>
|
||||
|
||||
<p>
|
||||
This machine type mostly behaves the same as the
|
||||
<a href="#x86_64-q35">q35 machine type</a>, so you can just
|
||||
refer to that section for information.
|
||||
</p>
|
||||
<p>
|
||||
The only difference worth mentioning is that using legacy
|
||||
PCI for <code>mach-virt</code> guests is extremely uncommon,
|
||||
so you'll probably never need to add controllers other than
|
||||
<code>pcie-root-port</code>.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,146 @@
|
|||
========================
|
||||
PCI topology and hotplug
|
||||
========================
|
||||
|
||||
.. contents::
|
||||
|
||||
Perhaps surprisingly, most libvirt guests support only limited PCI device
|
||||
hotplug out of the box, or even none at all.
|
||||
|
||||
The reason for this apparent limitation is the fact that each hotplugged PCI
|
||||
device might require additional PCI controllers to be added to the guest. Since
|
||||
most PCI controllers can't be hotplugged, they need to be added before the guest
|
||||
is started; however, libvirt has no way of knowing in advance how many devices
|
||||
will be hotplugged during the guest's lifetime, thus making it impossible to
|
||||
automatically provide the right amount of PCI controllers: any arbitrary number
|
||||
would end up being too big for some users, and too small for others.
|
||||
|
||||
Ultimately, the user is the only one who knows how much the guest will need to
|
||||
grow dynamically, so the responsibility of planning a suitable PCI topology in
|
||||
advance falls on them.
|
||||
|
||||
This document aims at providing all the information needed to successfully plan
|
||||
the PCI topology of a guest. Note that the details can vary a lot between
|
||||
architectures and even machine types, hence the way it's organized.
|
||||
|
||||
x86_64 architecture
|
||||
-------------------
|
||||
|
||||
q35 machine type
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
This is a PCI Express native machine type. The default PCI topology looks like
|
||||
|
||||
::
|
||||
|
||||
<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='0x10'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
||||
</controller>
|
||||
|
||||
and supports hotplugging a single PCI Express device, either emulated or
|
||||
assigned from the host.
|
||||
|
||||
If you have a very specific use case, such as the appliances used by
|
||||
`libguestfs <https://libguestfs.org/>`__ behind the scenes to access disk
|
||||
images, and this automatically-added ``pcie-root-port`` controller ends up being
|
||||
a nuisance, you can prevent libvirt from adding it by manually managing PCI
|
||||
controllers and addresses according to your needs.
|
||||
|
||||
Slots on the ``pcie-root`` controller do not support hotplug, so the device will
|
||||
be hotplugged into the ``pcie-root-port`` controller. If you plan to hotplug
|
||||
more than a single PCI Express device, you should add a suitable number of
|
||||
``pcie-root-port`` controllers when defining the guest: for example, add
|
||||
|
||||
::
|
||||
|
||||
<controller type='pci' model='pcie-root'/>
|
||||
<controller type='pci' model='pcie-root-port'/>
|
||||
<controller type='pci' model='pcie-root-port'/>
|
||||
<controller type='pci' model='pcie-root-port'/>
|
||||
|
||||
if you expect to hotplug up to three PCI Express devices, either emulated or
|
||||
assigned from the host. That's all the information you need to provide: libvirt
|
||||
will fill in the remaining details automatically. Note that you need to add the
|
||||
``pcie-root`` controller along with the ``pcie-root-port`` controllers or you
|
||||
will get an error.
|
||||
|
||||
Note that if you're adding PCI controllers to a guest and at the same time
|
||||
you're also adding PCI devices, some of the controllers will be used for the
|
||||
newly-added devices and won't be available for hotplug once the guest has been
|
||||
started.
|
||||
|
||||
If you expect to hotplug legacy PCI devices, then you will need specialized
|
||||
controllers, since all those mentioned above are intended for PCI Express
|
||||
devices only: add
|
||||
|
||||
::
|
||||
|
||||
<controller type='pci' model='pcie-to-pci-bridge'/>
|
||||
|
||||
and you'll be able to hotplug up to 31 legacy PCI devices, either emulated or
|
||||
assigned from the host, in the slots from 0x01 to 0x1f of the
|
||||
``pcie-to-pci-bridge`` controller.
|
||||
|
||||
i440fx (pc) machine type
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is a legacy PCI native machine type. The default PCI topology looks like
|
||||
|
||||
::
|
||||
|
||||
<controller type='pci' index='0' model='pci-root'/>
|
||||
|
||||
where each of the 31 slots (from 0x01 to 0x1f) on the ``pci-root`` controller is
|
||||
hotplug capable and can accept a legacy PCI device, either emulated or assigned
|
||||
from the guest.
|
||||
|
||||
ppc64 architecture
|
||||
------------------
|
||||
|
||||
pseries machine type
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The default PCI topology for the ``pseries`` machine type looks like
|
||||
|
||||
::
|
||||
|
||||
<controller type='pci' index='0' model='pci-root'>
|
||||
<model name='spapr-pci-host-bridge'/>
|
||||
<target index='0'/>
|
||||
</controller>
|
||||
|
||||
The 31 slots, from 0x01 to 0x1f, on a ``pci-root`` controller are all hotplug
|
||||
capable and, despite the name suggesting otherwise, starting with QEMU 2.9 all
|
||||
of them can accept PCI Express devices in addition to legacy PCI devices;
|
||||
however, libvirt will only place emulated devices on the default ``pci-root``
|
||||
controller.
|
||||
|
||||
In order to take advantage of improved error reporting and recovering
|
||||
capabilities, PCI devices assigned from the host need to be isolated by placing
|
||||
each on a separate ``pci-root`` controller, which has to be prepared in advance
|
||||
for hotplug to work: for example, add
|
||||
|
||||
::
|
||||
|
||||
<controller type='pci' model='pci-root'/>
|
||||
<controller type='pci' model='pci-root'/>
|
||||
<controller type='pci' model='pci-root'/>
|
||||
|
||||
if you expect to hotplug up to three PCI devices assigned from the host.
|
||||
|
||||
aarch64 architecture
|
||||
--------------------
|
||||
|
||||
mach-virt (virt) machine type
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This machine type mostly behaves the same as the `q35 machine
|
||||
type <#q35-machine-type>`__, so you can just refer to that section for
|
||||
information.
|
||||
|
||||
The only difference worth mentioning is that using legacy PCI for ``mach-virt``
|
||||
guests is extremely uncommon, so you'll probably never need to add controllers
|
||||
other than ``pcie-root-port``.
|
Loading…
Reference in New Issue