|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 7/9] vpci/msi: add MSI handlers
>>> On 08.08.17 at 17:44, <roger.pau@xxxxxxxxxx> wrote:
> On Wed, Aug 02, 2017 at 07:34:28AM -0600, Jan Beulich wrote:
>> >>> Roger Pau Monne <roger.pau@xxxxxxxxxx> 06/30/17 5:01 PM >>>
>> >+ /* Get a PIRQ. */
>> >+ rc = allocate_and_map_msi_pirq(pdev->domain, -1, &arch->pirq,
>> >+ MAP_PIRQ_TYPE_MULTI_MSI, &msi_info);
>> >+ if ( rc )
>> >+ {
>> >+ dprintk(XENLOG_ERR, "%04x:%02x:%02x.%u: failed to map PIRQ: %d\n",
>> >+ pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn),
>> >+ PCI_FUNC(pdev->devfn), rc);
>> >+ return rc;
>> >+ }
>> >+
>> >+ for ( i = 0; i < vectors; i++ )
>> >+ {
>> >+ xen_domctl_bind_pt_irq_t bind = {
>> >+ .machine_irq = arch->pirq + i,
>> >+ .irq_type = PT_IRQ_TYPE_MSI,
>> >+ .u.msi.gvec = msi_vector(data) + i,
>> >+ .u.msi.gflags = msi_flags(data, address),
>> >+ };
>> >+
>> >+ pcidevs_lock();
>> >+ rc = pt_irq_create_bind(pdev->domain, &bind);
>> >+ if ( rc )
>> >+ {
>> >+ dprintk(XENLOG_ERR,
>> >+ "%04x:%02x:%02x.%u: failed to bind PIRQ %u: %d\n",
>> >+ pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn),
>> >+ PCI_FUNC(pdev->devfn), arch->pirq + i, rc);
>> >+ spin_lock(&pdev->domain->event_lock);
>> >+ unmap_domain_pirq(pdev->domain, arch->pirq);
>>
>> Don't you also need to undo the pt_irq_create_bind() calls here for all prior
>> successful iterations?
>
> Yes, unmap_domain_pirq calls pirq_guest_force_unbind but better not
> resort to that.
I don't understand.
>> >+int vpci_msi_arch_disable(struct vpci_arch_msi *arch, struct pci_dev *pdev,
>> >+ unsigned int vectors)
>> >+{
>> >+ unsigned int i;
>> >+
>> >+ ASSERT(arch->pirq != -1);
>> >+
>> >+ for ( i = 0; i < vectors; i++ )
>> >+ {
>> >+ xen_domctl_bind_pt_irq_t bind = {
>> >+ .machine_irq = arch->pirq + i,
>> >+ .irq_type = PT_IRQ_TYPE_MSI,
>> >+ };
>> >+
>> >+ pcidevs_lock();
>> >+ pt_irq_destroy_bind(pdev->domain, &bind);
>>
>> While I agree that the loop should continue of this fails, I'm not convinced
>> you should entirely ignore the return value here.
>
> I've added a printk in order to aid debug.
I've actually tried to hint at you wanting to run the loop to
completion while returning to the caller the first error you've
encountered.
>> >+/* Handlers for the MSI control field (PCI_MSI_FLAGS). */
>> >+static void vpci_msi_control_read(struct pci_dev *pdev, unsigned int reg,
>> >+ union vpci_val *val, void *data)
>> >+{
>> >+ const struct vpci_msi *msi = data;
>> >+
>> >+ /* Set multiple message capable. */
>> >+ val->u16 = MASK_INSR(fls(msi->max_vectors) - 1, PCI_MSI_FLAGS_QMASK);
>>
>> The comment is somewhat misleading - whether the device is multi-message
>> capable depends on msi->max_vectors.
>
> Better "Set the number of supported messages"?
Yes.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |