On 02/21/2012 11:34 AM, Michael S. Tsirkin wrote:
> On Tue, Feb 21, 2012 at 11:27:15AM +0100, Hannes Reinecke wrote:
>> On 02/21/2012 12:04 AM, Michael S. Tsirkin wrote:
>>> On Mon, Feb 20, 2012 at 04:17:05PM +0100, Alexander Graf wrote:
>>>>
>>>> On 20.02.2012, at 16:16, Hannes Reinecke wrote:
>>>>
>>>>> On 02/20/2012 04:13 PM, Alexander Graf wrote:
>>>>>>
>>>>>> On 20.02.2012, at 16:11, Hannes Reinecke wrote:
>>>>>>
>>>>>>> This patch adds an emulation for the LSI Megaraid SAS 8708EM2 HBA.
>>>>>>> I've tested it to work with Linux, Windows Vista, and Windows7.
>>>>>>>
>>>>>>> Changes since v12:
>>>>>>> - Fixup flag setting via properties
>>>>>>> - Disable MSI-X per default
>>>>>>> - Fixup MSI-X handling
>>>>>>
>>>>>> If MSI-X works again, why disable it? :o Does it break in other cases?
>>>>>>
>>>>> It doesn't. No idea why.
>>>>> That's why I disabled it :-)
>>>>>
>>>>> The MSI-X vector is signalled, but nothing on the OS side appear to
>>>>> receive it.
>>>>> If you got any idea on how to debug it I'm all ears ...
>>>>
>>>> Michael, any ideas? IIRC MSI-X used to work in earlier versions, so 
>>>> something recent must've broken it.
>>>>
>>>>
>>>> Alex
>>>
>>> Hmm, there were's any recent changes I'm aware of.
>>> Try to check that MSIX vector as qemu sees it
>>> matches the value that the guest set.
>>> If using kvm, compare against kernel as well.
>>> Endian-ness issue somehow?
>>> Are you testing on x86?
>>>
>> Testing on x86_64.
>> But apparently the (linux) driver doesn't activate MSI-X.
>> So either I didn't set it up properly in the HBA emulation
>> or something else went wrong.
>>
>> Cheers,
>>
>> Hannes
> 
> Ah, the driver doesn't enable msix? Your earlier comment
> made me think the driver did enable it, and you
> send the interrupt but guest does not get it...
> 
It looks as if the HBA emulation sets up the BARs
correctly:

# lspci -s 00:04.0 -vv
00:04.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 1078
        Subsystem: LSI Logic / Symbios Logic Device 1013
        Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop-
ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast
>TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 11
        Region 0: Memory at febd8000 (32-bit, non-prefetchable)
[size=16K]
        Region 2: I/O ports at c000 [size=256]
        Region 3: Memory at feb40000 (32-bit, non-prefetchable)
[size=256K]
        Expansion ROM at febd0000 [disabled] [size=32K]
        Capabilities: [40] MSI-X: Enable- Mask- TabSize=15
                Vector table: BAR=0 offset=00002000
                PBA: BAR=0 offset=00002800
        Kernel modules: megaraid_sas

(The only difference here being that the memory regions are actually
64-bit, but for some reason qemu refuse to do so and set it to
32-bit always).

But when loading the Linux driver from the guest it for some reason
does _not_ enable MSI-X properly.

The emulation has this:

            if (msix_enabled(&s->dev)) {
                msix_notify(&s->dev, 0);
            } else {
                qemu_irq_raise(s->dev.irq[0]);
            }

and guest is stuck just after the msix_notify().
So I would assume that the (linux) driver did setup MSI-X,
otherwise 'msix_enabled()' should return false.

But still the Linux driver doesn't receive any MSI-X interrupts.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                   zSeries & Storage
h...@suse.de                          +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)

Reply via email to