On 08.12.2016 15:35, Mehdi Abaakouk wrote:
>> - if (ret == 0)
>> - ret = virNetInterfaceStats(path, stats);
>> - else
>> + if (net) {
>> + if (net->type == VIR_DOMAIN_NET_TYPE_VHOSTUSER) {
>> + ret = virNetDevOpenvswitchInterfaceStats(path, stats);
>> + } else {
>> + ret = virNetInterfaceStats(path, stats);
>> + }
>> + } else {
>> virReportError(VIR_ERR_INVALID_ARG,
>> _("invalid path, '%s' is not a known
>> interface"), path);
>> + }
>>
>
> Oh my. Not your fault but this looks ugly. It has even before you've
> touched it.
>
> BTW: maybe I am misreading something but my understanding of vhost-user
> is that it can be plugged into any type of bridge (e.g. snabb). How does
> this work then if we run ovs-vsctl then?
I don't think you misreading, vhostuser can be created by anything it's
just a unix-socket in this end. And libvirt only known the location of
this socket and not how it have been created.
libvirt was already guessing at getting the statistics, by 'trying' with
/proc/net/dev even that doesn't make any sense for vhostuser interface.
Now I
just 'try' with ovs-vsctl but perhaps that doesn't make sense too if the
unix-socket have not been created by openvswitch.
Since libvirt have no real control of how a (host) network interface is
created. It can only guess the statistics location. My change just adds
a new
way/tool to guess that.
Fair enough.
> Do you perhaps have a set of
> steps how can I test this feature? Because so far I've used
> vhost-user-bridge helper from qemu repo but this will not work with it.
About testing, my setup looks like:
I install the dpdk variant of openvswitch and dpdk tools
I enable dpdk support in ovs with:
(This can be a bit different depending on OS and openvswitch version)
$ ovs-vsctl set Open_vSwitch . "other_config:dpdk-init=true"
$ ovs-vsctl set Open_vSwitch . "other_config:dpdk-alloc-mem=2048"
$ ovs-vsctl set Open_vSwitch . "other_config:dpdk-extra=--vhost-owner
libvirt-qemu:kvm --vhost-perm 0666"
$ systemctl restart openvswitch-switch
I unbind a network card (virtio network card work well with recent dpdk)
on my
host with command like:
$ dpdk-devbind -u 0000:00:04.0
(previously called dpdk_nic_bind, too)
I create a bridge with two interfaces. dpdk0 is the first unbind
interface. dpdkvhostuser0 is
a vhostuser unix-socket located /var/run/openvswitch/dpdkvhostuser0
$ ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
$ ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
$ ovs-vsctl add-port br0 dpdkvhostuser0 -- set Interface dpdkvhostuser0
type=dpdkvhostuser
And I allow packets to pass from/to each interfaces
$ ovs-ofctl del-flows br0
$ ovs-ofctl add-flow br0 in_port=1,action=output:2
$ ovs-ofctl add-flow br0 in_port=2,action=output:1
Then I create a VM with a network interface that looks like:
<interface type='vhostuser'>
<target dev='dpdkvhostuser0'/>
<mac address='52:54:00:3b:83:1b'/>
<source type='unix' path='/var/run/openvswitch/dpdkvhostuser0'
mode='client'/>
<model type='virtio'/>
<driver queues='2'>
<host mrg_rxbuf='off'/>
</driver>
</interface>
I do some ping command to make statistics filled
Test with:
$ ovs-vsctl get Interface dpdkvhostuser0 statistics
$ virsh domifstat <vmname> dpdkvhostuser0
Cheers,
Awesome. This is working for me.
Therefore I went ahead, fixed all the small nits raised during review
and pushed patches 1-3. As discussed in patch 4, we probably want
different approach anyway so I have not pushed that one.
Congratulations on your first libvirt contribution!
Michal