Re: Issue about domU missing interrupt

G.R.
Wed, 05 Dec 2012 12:58:53 -0000

On Tue, Dec 4, 2012 at 11:20 PM, G.R.
<firemeteor@users.sourceforge.net>wrote:

> On Tue, Dec 4, 2012 at 7:01 PM, Pasi Kärkkäinen <pasik@iki.fi> wrote:
>
>> On Tue, Dec 04, 2012 at 10:15:58AM +0000, Jan Beulich wrote:
>> > >>> On 04.12.12 at 04:07, "G.R."
<firemeteor@users.sourceforge.net>
>> wrote:
>> > >>  I had a quick look, and it doesn''t look that
hard to backport that
>> patch.
>> > >
>> > > Thanks, Mat.
>> > > I''m glad to report that the patch do fix my problem.
>> > >
>> > > And yest it is really easy to port since the code did not
change
>> across the
>> > > two release.
>> > > The only change would be line numbers (3841 vs 3803) and one
extra
>> comments
>> > > before this line:
>> > >
>> > >  static int pt_msix_update_one(struct pt_dev *dev, int
entry_nr)
>> > >
>> > > I''m not sure if you are going to release another
maintenance version
>> that
>> > > include this patch,
>> > > but I''ll report this to Debain maintainer since
it''s about to freeze
>> for
>> > > v7.0 release and v4.2.0 will not make it.
>> >
>> > Any thoughts on backporting this to 4.1.x, now or after 4.1.4 is
>> > out?
>> >
>>
>> It''s already in Xen 4.2, it''s confirmed to fix a bug
in Xen 4.1,
>> so I''d say it should be a candidate for Xen 4.1.4.
>>
>>
> Hi, it seems that the patch has some side effect on pure HVM guest.
> For openelec 2.0 guest, which is based on linux 3.2.x with PVOP disabled,
> I see such syndrome in qemu-dm-xxx.log:
>
> pt_msgaddr64_reg_write: Error: why comes to Upper Address without 64 bit
> support??
> pt_pci_write_config: Internal error: Invalid write emulation return
> value[-1]. I/O emulator exit.
>
> The guest dies immediately after the log, I have no way to check guest
> kernel log.
> Without the patch, this guest can boot without obvious error log even the
> VGA passthrough does not quite work.
> I''ll check the code to see what does these log mean...
>

I did some analysis and it really looks like a bug to me.
Since this is a patch back-ported from 4.2.0, I would like to ask is there
any follow up patch that would fix this issue?
Please see my analysis below:

Here is part of the qemu-dm log, with debug log enabled at compile time:

dm-command: hot insert pass-through pci dev
register_real_device: Assigning real physical device 00:1b.0 ...
pt_iomul_init: Error: pt_iomul_init can''t open file /dev/xen/pci_iomul:
No
such file or directory: 0x0:0x1b.0x0
pt_register_regions: IO region registered (size=0x00004000
base_addr=0xf7c10004)
pt_msi_setup: msi mapped with pirq 36
pci_intx: intx=1
register_real_device: Real physical device 00:1b.0 registered successfuly!
IRQ type = MSI-INTx
...
pt_pci_read_config: [00:06.0]: address=0000 val=0x0000*8086* len=2
pt_pci_read_config: [00:06.0]: address=0002 val=0x0000*1e20* len=2
...
*pt_pci_write_config: [00:06.0]: address=0068* val=0x00000000 len=4
...
pt_pci_write_config: [00:06.0]: address=0062 val=0x00000081 len=2
*pt_msgctrl_reg_write: guest enabling MSI, disable MSI-INTx translation*
pci_intx: intx=1
*pt_msi_disable: Unmap msi with pirq 36*
pt_msgctrl_reg_write: setup msi for dev 30
pt_msi_setup: msi mapped with pirq 36
pt_msi_update: Update msi with pirq 36 gvec 51 gflags 1303
pt_pci_read_config: [00:06.0]: address=0062 val=0x00000081 len=2
pt_pci_write_config: [00:06.0]: address=0062 val=0x00000081 len=2
pt_pci_write_config: [00:06.0]: address=0064 val=0xfee0300c len=4
*pt_pci_write_config: [00:06.0]: address=0068* val=0x00000000 len=4
pt_msgaddr64_reg_write: Error: why comes to Upper Address without 64 bit
support??
pt_pci_write_config: Internal error: Invalid write emulation return
value[-1]. I/O emulator exit.


Here the device in question should is the audio controller, 00:1b.0 in the
host, which is 64 bit capable:
00:1b.0 Audio device: Intel Corporation 7 Series/C210 Series Chipset Family
High Definition Audio Controller (rev 04)
    Capabilities: [60] MSI: Enable+ Count=1/1 Maskable- 64bit+
        Address: 00000000fee00378  Data: 0000

And there is also a successful write to offset 0x68 above, while the second
write fails the I/O emulator.

pt_disable_msi_translate is called after the pt_msgctrl_reg_write log above:
            PT_LOG("guest enabling MSI-X, disable MSI-INTx
translation\n");
            pt_disable_msi_translate(ptdev);


The patch added pt_msi_disable() call into this function, And the
pt_msi_disable function has these lines:
out:
    /* clear msi info */
    dev->msi->flags = 0;
    dev->msi->pirq = -1;
    dev->msi_trans_en = 0;

As a result, the flags are cleared -- this is new to the patch.
And I believe this change caused the failure in pt_msgaddr64_write():

3882     /* check whether the type is 64 bit or not */
3883     if (!(ptdev->msi->flags & PCI_MSI_FLAGS_64BIT))
3884     {
3885         /* exit I/O emulator */
3886         PT_LOG("Error: why comes to Upper Address without 64 bit
support??\n");
3887         return -1;
3888     }


I only see flags setup in  pt_msgctrl_reg_init() function. I guess this is
not called this time.

Thanks,
Timothy


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org