|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PVH]: Help: msi.c
>>> On 17.12.12 at 13:42, Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
wrote:
> On Fri, 14 Dec 2012, Mukesh Rathor wrote:
>> On Thu, 13 Dec 2012 14:25:16 +0000
>> Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> wrote:
>>
>> > On Thu, 13 Dec 2012, Jan Beulich wrote:
>> > > >>> On 13.12.12 at 13:19, Stefano Stabellini
>> > > >>> <stefano.stabellini@xxxxxxxxxxxxx>
>> > > wrote:
>> > > > On Thu, 13 Dec 2012, Jan Beulich wrote:
>> > > >> >>> On 13.12.12 at 02:43, Mukesh Rathor
>> > > >> >>> <mukesh.rathor@xxxxxxxxxx> wrote:
>> >
>> > Actually I think that you might be right: just looking at the code it
>> > seems that the mask bits get written to the table once as part of the
>> > initialization process:
>> >
>> > pci_enable_msix -> msix_capability_init -> msix_program_entries
>> >
>> > Unfortunately msix_program_entries is called few lines after
>> > arch_setup_msi_irqs, where we call PHYSDEVOP_map_pirq to map the MSI
>> > as a pirq.
>> > However after that is done, all the masking/unmask is done via
>> > irq_mask that we handle properly masking/unmasking the corresponding
>> > event channels.
>> >
>> >
>> > Possible solutions on top of my head:
>> >
>> > - in msix_program_entries instead of writing to the table directly
>> > (__msix_mask_irq), call desc->irq_data.chip->irq_mask();
>> >
>> > - replace msix_program_entries with arch_msix_program_entries, but it
>> > would probably be unpopular.
>>
>>
>> Can you or Jan or somebody please take that over? I can focus on other
>> PVH things then and try to get a patch in asap.
>
> The following patch moves the MSI-X masking before arch_setup_msi_irqs,
> that is when Linux calls PHYSDEVOP_map_pirq that is the hypercall that
> causes Xen to execute msix_capability_init.
And in what way would that help?
Jan
> I don't have access to a machine with an MSI-X device right now so I
> have only tested the appended patch with MSI.
>
> ---
>
>
>
> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index a825d78..ef73e80 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -652,11 +652,22 @@ static void msix_program_entries(struct pci_dev *dev,
> int i = 0;
>
> list_for_each_entry(entry, &dev->msi_list, list) {
> + entries[i].vector = entry->irq;
> + irq_set_msi_desc(entry->irq, entry);
> + i++;
> + }
> +}
> +
> +static void msix_mask_entries(struct pci_dev *dev,
> + struct msix_entry *entries)
> +{
> + struct msi_desc *entry;
> + int i = 0;
> +
> + list_for_each_entry(entry, &dev->msi_list, list) {
> int offset = entries[i].entry * PCI_MSIX_ENTRY_SIZE +
> PCI_MSIX_ENTRY_VECTOR_CTRL;
>
> - entries[i].vector = entry->irq;
> - irq_set_msi_desc(entry->irq, entry);
> entry->masked = readl(entry->mask_base + offset);
> msix_mask_irq(entry, 1);
> i++;
> @@ -696,6 +707,8 @@ static int msix_capability_init(struct pci_dev *dev,
> if (ret)
> return ret;
>
> + msix_mask_entries(dev, entries);
> +
> ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
> if (ret)
> goto error;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |