Re: FreeBSD guest with VTD NIC not passing traffic

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

 



On 2012-01-13 22:05, Alex Williamson wrote:
> On Fri, 2012-01-13 at 22:00 +0100, Jan Kiszka wrote:
>> On 2012-01-04 04:21, Alex Williamson wrote:
>>> On Mon, 2011-12-19 at 19:49 +0530, Shashidhar Patil wrote:
>>>> Hi,
>>>>        I am running Ubuntu 10.10 (amd64) on a 2 socket  nehalem based
>>>> server with IOH 5520. 5520 supports VTD.
>>>> I enabled DMAR with intel_iommu=on. The box has intel 82599 adapter
>>>> which I assigned through VT-D to FreeBSD 8.2 running
>>>> as guest os. The ixgbe driver detects the device and the driver
>>>> successfully configures the device. But the link
>>>> never comes up. It looks like link up/down interrupts are not
>>>> delivered. Then I checked kvm interrupt assignment and as expected
>>>> kvm could not make MSI-X entries for the VT-d guest. So no output from
>>>> "grep kvm /proc/interrupt". By enabling some debugs in the
>>>> qemu-kvm I figured out that the MSI-x updates are not received
>>>> properly. It does look like Linux updates MSI-X table in a batch
>>>> fashion
>>>> which qemu-kvm gets in  one shot and every thing works fine in case of
>>>> linux. In case of FreeBSD PCIE updates come /MSI-X entry
>>>> which qemu-kvm can't make use.
>>>
>>> That's right, Linux and Windows both seem to setup the MSI-X table then
>>> enable it in one shot, so we only trigger the interrupt programming when
>>> the enable bit is set.  We don't trigger changes on writes to the MSI-X
>>> table... not very accurate emulation of mask bits.
>>
>> According to the PCI spec, updates that happen while a vector is
>> unmasked, need not be considered by the hardware (thus the hypervisor
>> here). Is that the scenario here?
> 
> I'm assuming the vector is masked in the MSI-X table.  So Linux/Windows
> do:
> 
> a) program MSI-X table
> b) enable MSI-X in capability register
> 
> Whereas FreeBSD does:
> 
> a) enable MSI-X in capability register (vectors masked in table)
> b) program and unmask individual vectors

That should work with the current code. It checks the number of vectors
on each config write, iterates the whole table, and then updates the
kernel configuration accordingly. It even requires the enable bit in the
cap register to be set before doing this.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux