On Mon, Apr 08, 2013 at 03:32:07PM -0400, Laine Stump wrote:
On 04/08/2013 12:48 PM, Daniel P. Berrange wrote:
> On Mon, Apr 08, 2013 at 12:37:49PM -0400, Laine Stump wrote:
>> I think we're starting to get closer to the concrete problem that's
>> bothering me. As I understand it (and again - "what I understand" has
>> repeatedly been shown to be incorrect in this thread :-):
>>
>> * Ihere are multiple different types of devices that provide a bus with
>> 1 or more "slots" that PCI devices (e.g., the virtio-net-pci device,
the
>> e1000 network device, etc) can be plugged into.
>>
>> * In the config for those devices, there is a required (auto-generated
>> if not explicitly provided) <address> element that indicates what
>> controller that device is plugged into e.g.:
>>
>> <interface type='direct'>
>> ...
>> <address type='pci' domain='0' bus='0'
slot='3' function='0'/>
>> ...
>> </interface>
>>
>> * domain is always hardcoded to 0, and in the past bus was also always
>> hardcoded to 0 because until now there has only been a single place
>> where PCI devices could be connected - the builtin pci.0 bus, which is a
>> part of the basic "pc" (and some others) virtual machine and provides
32
>> slots.
>>
>> * Now we are adding the ability to define new PCI buses, for now just a
>> single kind - a pci-bridge controller, which itself must connect to an
>> existing PCI slot, and provides 32 new PCI slots. But in the future
>> there will be more different types of controllers that provide one or
>> more PCI slots where PCI devices/controllers can be plugged in.
>>
>> * In these patches adding support for pci-bridge, we are making the
>> assumption that there is a 1:1 correspondence between the
"index='n'"
>> attribute of the pci-bridge controller and the "bus='n'"
attribute of
>> the <address> element in devices that will be plugged into that
>> controller. So for example if we have:
>>
>>
>> <controller type='pci-bridge' index='1'>
>> <address type='pci' domain='0' bus='0'
slot='10' function='0'/>
>> </controller>
>>
>> and then change the <interface> definition above to say
"bus='1'", that
>> interface device will plug into this new bus at slot 3.
>>
>> * So let's assume that we add a new controller called
"dmi-to-pci-bridge":
>>
>> <controller type='dmi-to-pci-bridge' index='0'/>
>>
>> Ignoring for now the question of what address we give in the definition
>> of *this* device (which is itself problematic - do we need a new
"pcie"
>> address type?), if some device is then defined with
>>
>>
>> <address type='pci bus='0' .../>
>>
>> How do we differentiate between that meaning "the pci-ptp controller
>> that is index='0'" and "the pci-bridge controller that is
index='0'"? Do
>> we need to expand our <address> element further? If, as I think you
>> suggest, we have multiple different kinds of controllers that provide
>> PCI slots, each with its own namespace, the current pci address element
>> is inadequate to unambiguously describe where a pci device should be
>> plugged in.
> Hmm yes, you're right - as long as we only have <adress
type='pci'>
> then all <controller> elements should use type='pci' too, and we
should
> just distinguish based on the model name of the controller. So ignore
> my previous suggestion to have 'pci-bridge' and 'pci-root' types,
we
> can only use type='pci' on <controller> elements.
Okay, so that means we preserve the correlation between
<controller type='pci' index='1'>
and
<address type='pci' bus='1' ..../>
Should the <controller> device use, e.g. <model type='pci-bridge'/>
for
the model, as is done for <interface> devices? One notable difference is
that in the case of <interface> (with the exception of "<model
type='virtio'/>"), the model isn't used for anything except passing
directly through to qemu (and very recently validating against a list of
known interface models), while in the case of controllers with
type='pci', different models will have different rules about what they
can connect to and what can connect to them, and they will affect what
is valid in other devices.
An example on a "pc" machinetype that has the builtin PCI bus, one extra
pci-pci bridge, and an interface device plugged into slot 3 of the
pci-bridge:
<controller type='pci' index='0'>
<model type='pci-root'/> <!-- builtin pci bus -->
</controller>
<controller type='pci' index='1'>
<model type='pci-bridge'/>
</controller>
<interface type='direct'>
...
<address type='pci' bus='1' slot='3'/>
</controller>
And for a q35 machinetype that has the root pcie, an i82801b11-bridge
connected to slot 1e of that, a pci bridge connected to slot 1 of the
i82801b11-bridge, and an interface plugged into slot 3 of the pci-bridge:
<controller type='pci' index='0'>
<model type='pcie-root'/>
</controller>
<controller type='pci' index='1'>
<model type='i82801b11-bridge'/> <!-- [*] -->
<address type='pci' bus='0' slot='0x1e'/>
</controller>
<controller type='pci' index='2'>
<model type='pci-bridge'/>
<address type='pci' bus='1' slot='1'/>
</controller>
<interface type='direct'>
...
<address type='pci' bus='2' slot='3'/>
</controller>
(note that controllers with model='(pci|pcie)-root' will not have any
<address> element, because they exist in the basic machine so we don't
need to connect them to anywhere.)
Actually I do wonder if we should reprent a PCI root as two
<controller> elements, one representing the actual PCI root
device, and the other representing the host bridge that is
built-in.
Also we should use the actual model names, not 'pci-root' or
'pcie-root' but rather i440FX for "pc" machine type, and whatever
the q35 model name is.
- One PCI root with built-in PCI bus (ie todays' setup)
<controller type="pci-root" index="0">
<model name="i440FX"/>
</controller>
<controller type="pci" index="0"> <!-- Host bridge -->
<address type='pci' domain='0' bus='0'
slot='0''/>
</controller>
<interface type='direct'>
...
<address type='pci' domain='0' bus='0'
slot='3'/>
</controller>
- One PCI root with built-in PCI bus and extra PCI bridge
<controller type="pci-root" index="0">
<model name="i440FX"/>
</controller>
<controller type="pci" index="0"> <!-- Host bridge -->
<address type='pci' domain='0' bus='0'
slot='0'/>
</controller>
<controller type="pci" index="1"> <!-- Additional bridge
-->
<address type='pci' domain='0' bus='0'
slot='1'/>
</controller>
<interface type='direct'>
...
<address type='pci' domain='0' bus='1'
slot='3'/>
</controller>
- One PCI root with built-in PCI bus, PCI-E bus and and extra PCI bridge
(ie possible q35 setup)
<controller type="pci-root" index="0">
<model name="i440FX"/>
</controller>
<controller type="pci" index="0"> <!-- Host bridge -->
<address type='pci' domain='0' bus='0'
slot='0'/>
</controller>
<controller type="pci" index="1"> <!-- Additional bridge
-->
<address type='pci' domain='0' bus='0'
slot='1'/>
</controller>
<controller type="pci" index="1"> <!-- Additional bridge
-->
<address type='pci' domain='0' bus='0'
slot='1'/>
</controller>
<interface type='direct'>
...
<address type='pci' domain='0' bus='1'
slot='3'/>
</controller>
So if we later allowed for mutiple PCI roots, then we'd have something
like
<controller type="pci-root" index="0">
<model name="i440FX"/>
</controller>
<controller type="pci-root" index="1">
<model name="i440FX"/>
</controller>
<controller type="pci" index="0"> <!-- Host bridge 1
-->
<address type='pci' domain='0' bus='0'
slot='0''/>
</controller>
<controller type="pci" index="0"> <!-- Host bridge 2
-->
<address type='pci' domain='1' bus='0'
slot='0''/>
</controller>
<interface type='direct'> <!-- NIC on host bridge 2 -->
...
<address type='pci' domain='1' bus='0'
slot='3'/>
</controller>
NB this means that 'index' values can be reused against the
<controller>, provided they are setup on different pci-roots.
(also note that it might happen that the bus number in libvirt's
config
will correspond to the bus numbering that shows up in the guest OS, but
that will just be a happy coincidence)
Does this make sense?
Yep, I think we're fairly close.
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|