[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 04/11] vpci/msix: add teardown cleanup
>>> On 17.07.18 at 11:48, <roger.pau@xxxxxxxxxx> wrote: > --- a/xen/drivers/vpci/msix.c > +++ b/xen/drivers/vpci/msix.c > @@ -436,11 +436,6 @@ static int init_msix(struct pci_dev *pdev) > vpci_msix_arch_init_entry(&pdev->vpci->msix->entries[i]); > } > > - rc = vpci_add_register(pdev->vpci, control_read, control_write, > - msix_control_reg(msix_offset), 2, > pdev->vpci->msix); > - if ( rc ) > - return rc; > - > write_lock(&d->arch.hvm_domain.msix_lock); > if ( list_empty(&d->arch.hvm_domain.msix_tables) ) > register_mmio_handler(d, &vpci_msix_table_ops); > @@ -448,9 +443,57 @@ static int init_msix(struct pci_dev *pdev) > list_add(&pdev->vpci->msix->next, &d->arch.hvm_domain.msix_tables); > write_unlock(&d->arch.hvm_domain.msix_lock); > > + rc = vpci_add_register(pdev->vpci, control_read, control_write, > + msix_control_reg(msix_offset), 2, > pdev->vpci->msix); Without the description saying why, I can't figure or guess why this wants/needs moving. > + if ( rc ) > + /* The teardown function will free the msix struct. */ > + return rc; > + > return 0; This can be a single return statement now, without even a need for going through rc. > +static void teardown_msix(struct pci_dev *pdev) > +{ > + struct vpci_msix *msix = pdev->vpci->msix; > + unsigned int i, pos; > + uint16_t control; > + > + if ( !msix ) > + return; > + > + write_lock(&pdev->domain->arch.hvm_domain.msix_lock); > + list_del(&pdev->vpci->msix->next); > + write_unlock(&pdev->domain->arch.hvm_domain.msix_lock); > + > + if ( !msix->enabled ) > + goto out; > + > + /* Disable MSIX. */ > + pos = pci_find_cap_offset(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), > + PCI_FUNC(pdev->devfn), PCI_CAP_ID_MSIX); > + ASSERT(pos); > + control = pci_conf_read16(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), > + PCI_FUNC(pdev->devfn), msix_control_reg(pos)); > + pci_conf_write16(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), > + PCI_FUNC(pdev->devfn), msix_control_reg(pos), > + (control & ~PCI_MSIX_FLAGS_ENABLE)); To avoid subsequent surprises, perhaps better also clear PCI_MSIX_FLAGS_MASKALL? > + for ( i = 0; i < msix->max_entries; i++ ) > + { > + int rc = vpci_msix_arch_disable_entry(&msix->entries[i], pdev); > + > + if ( rc && rc != -ENOENT ) > + gprintk(XENLOG_WARNING, > + "%04x:%02x:%02x.%u: unable to disable MSIX entry %u: > %d\n", > + pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), > + PCI_FUNC(pdev->devfn), i, rc); > + } > + > +out: Labels indented by at least one blank please. > + xfree(msix); > + pdev->vpci->msix = NULL; Perhaps better to zap the field before freeing the structure? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |