[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] [IOEMU] Fix wrong INTx for pass-through device
Hi, Just tested your patch (without my patch), and it works. So, now the question is, which approach is better and why? i think your approach in the patch sounds a little bit better, but i am not sure why (other than reflecting IntA for multi-function devs). Can u please explain why? Tom On Tue, Dec 29, 2009 at 10:59 AM, Zhai, Edwin <edwin.zhai@xxxxxxxxx> wrote: > > > Tom Rotenberg wrote: >> >> Well, i don't think that your patch will work for all of the cases, as >> some platforms boot with non multi-function devices using interrupt >> pin other than INTA... i myself encountered 2 such Lenovo platforms. >> > > In general single function device should be linked to INTA, although most of > OS can handle otherwise:) > > Back to the issue, even this abnormal machine can work with my patch, as our > policy is handling _virtual_ INTx and providing consistent values to guest > and xen, and physical INTx doesn't matter here. > > Could you pls. test my patch without yours to see if it can work? > Thanks, > > >> So, i think we will need to use both patches together. What do u say? >> >> On Tue, Dec 29, 2009 at 4:01 AM, Simon Horman <horms@xxxxxxxxxxxx> wrote: >> >>> >>> On Tue, Dec 29, 2009 at 08:22:35AM +0800, Zhai, Edwin wrote: >>> >>>> >>>> Your patch can also fix this issue, as using physical pin info for >>>> both guest and xen. >>>> Only potential issue is that guest will see a single function device >>>> is not linked to INTA, say assign 00:1a.7 to guest as 00:4.0. It >>>> should work, but seems doesn't comply with PCI spec. >>>> >>> >>> I had a vague memory that was the case, >>> I have been meaning to check the spec. >>> >>> >>>> >>>> We have 2 options here: >>>> 1. always use INTA >>>> 2. Use INTA for virtual function 0, and physical value for others. >>>> Options 2 is more friendly to multiple-function device assignment, >>>> and is current used. >>>> >>> >>> 2 seems to be a much better solution to me. >>> >>> Tom, could you see if Edwin's patch, without your patch, resolves >>> the problem that you were seeing? >>> >>> >>>> >>>> Tom Rotenberg wrote: >>>> >>>>> >>>>> Hi, >>>>> >>>>> I ran into similar problems last week, and i tried the following fix, >>>>> which looks like it kind-of fixed it, does this do the same fix as >>>>> your patch? >>>>> >>>>> Here is the patch i used: >>>>> >>>>> --- a/tools/ioemu/hw/pass-through.c Sun Dec 27 11:56:08 2009 +0200 >>>>> +++ b/tools/ioemu/hw/pass-through.c Sun Dec 27 11:56:08 2009 +0200 >>>>> @@ -4209,8 +4209,14 @@ >>>>> */ >>>>> uint8_t pci_intx(struct pt_dev *ptdev) >>>>> { >>>>> +#if 0 /* FIX */ >>>>> if (!PCI_FUNC(ptdev->dev.devfn)) >>>>> return 0; >>>>> +#endif /* FIX */ >>>>> + >>>>> return pci_read_intx(ptdev); >>>>> } >>>>> >>>>> Tom >>>>> >>>>> On Mon, Dec 28, 2009 at 9:04 AM, Zhai, Edwin <edwin.zhai@xxxxxxxxx> >>>>> wrote: >>>>> >>>>>> >>>>>> Simon, >>>>>> For the pass-through device's INTx emulation, we follow the policy: if >>>>>> virtual function 0, use INTA#, otherwise use hardware value. However, >>>>>> this >>>>>> policy only apply when bind_pt_pci_irq to xen, and always use physical >>>>>> value >>>>>> when exporting to guest. This discrepancy cause different INTx, thus >>>>>> different GSI in xen and guest, so that interrupts never got injected >>>>>> to >>>>>> guest. E.g. when assigning a USB controller with non-zero >>>>>> function(00:1d.2) >>>>>> to guest as 00:4.0, xen will see INTA#, while guest see INTC#. >>>>>> >>>>>> This simple patch can fix it. Could you pls. review it? >>>>>> >>>>>> Thanks, >>>>>> >>>>>> -- >>>>>> best rgds, >>>>>> edwin >>>>>> >>>>>> >>>>>> Signed-Off-By: Zhai Edwin <edwin.zhai@xxxxxxxxx> >>>>>> >>>>>> diff --git a/hw/pass-through.c b/hw/pass-through.c >>>>>> index e7bd386..a08c0bf 100644 >>>>>> --- a/hw/pass-through.c >>>>>> +++ b/hw/pass-through.c >>>>>> @@ -2710,7 +2710,8 @@ static uint32_t pt_status_reg_init(struct pt_dev >>>>>> *ptdev, >>>>>> static uint32_t pt_irqpin_reg_init(struct pt_dev *ptdev, >>>>>> struct pt_reg_info_tbl *reg, uint32_t real_offset) >>>>>> { >>>>>> - return ptdev->dev.config[real_offset]; >>>>>> + /* Translate xen INTx value to hw */ >>>>>> + return pci_intx(ptdev) + 1; >>>>>> } >>>>>> >>>>>> /* initialize BAR */ >>>>>> >>>>>> _______________________________________________ >>>>>> Xen-devel mailing list >>>>>> Xen-devel@xxxxxxxxxxxxxxxxxxx >>>>>> http://lists.xensource.com/xen-devel >>>>>> >>>>>> >>>>>> >>>> >>>> -- >>>> best rgds, >>>> edwin >>>> >> >> > > -- > best rgds, > edwin > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |