Megha,

On Fri, 21 Jun 2019, Megha Dey wrote:
> +static int free_msi_irqs_grp(struct pci_dev *dev, int group_id)
> +{

> +
> +     for_each_pci_msi_entry(entry, dev) {
> +             if (entry->group_id == group_id && entry->irq)
> +                     for (i = 0; i < entry->nvec_used; i++)
> +                             BUG_ON(irq_has_action(entry->irq + i));

BUG_ON is wrong here. This can and must be handled gracefully.

> +     }
> +
> +     pci_msi_teardown_msi_irqs_grp(dev, group_id);
> +
> +     list_for_each_entry_safe(entry, tmp, msi_list, list) {
> +             if (entry->group_id == group_id) {
> +                     clear_bit(entry->msi_attrib.entry_nr, dev->entry);
> +                     list_del(&entry->list);
> +                     free_msi_entry(entry);
> +             }
> +     }
> +
> +     list_for_each_entry_safe(msix_sysfs_entry, tmp_msix, pci_msix, list) {
> +             if (msix_sysfs_entry->group_id == group_id) {

Again. Proper group management makes all of that just straight forward and
not yet another special case.

> +                     msi_attrs = msix_sysfs_entry->msi_irq_group->attrs;
>  
> +static void pci_msix_shutdown_grp(struct pci_dev *dev, int group_id)
> +{
> +     struct msi_desc *entry;
> +     int grp_present = 0;
> +
> +     if (pci_dev_is_disconnected(dev)) {
> +             dev->msix_enabled = 0;

Huch? What's that? I can't figure out why this is needed and of course it
completely lacks a comment explaining this. 

> +             return;
> +     }
> +
> +     /* Return the device with MSI-X masked as initial states */
> +     for_each_pci_msi_entry(entry, dev) {
> +             if (entry->group_id == group_id) {
> +                     /* Keep cached states to be restored */
> +                     __pci_msix_desc_mask_irq(entry, 1);
> +                     grp_present = 1;
> +             }
> +     }
> +
> +     if (!grp_present) {
> +             pci_err(dev, "Group to be disabled not present\n");
> +             return;

So you print an error and silently return

> +     }
> +}
> +
> +int pci_disable_msix_grp(struct pci_dev *dev, int group_id)
> +{
> +     int num_vecs;
> +
> +     if (!pci_msi_enable || !dev)
> +             return -EINVAL;
> +
> +     pci_msix_shutdown_grp(dev, group_id);
> +     num_vecs = free_msi_irqs_grp(dev, group_id);

just to call in another function which has to do the same group_id lookup
muck again.

> +
> +     return num_vecs;
> +}
> +EXPORT_SYMBOL(pci_disable_msix_grp);

Why is this exposed ?

Thanks,

        tglx

Reply via email to