From: Bjorn Helgaas <bhelgaas@google.com>
To: Yijing Wang <wangyijing@huawei.com>
Cc: linux-pci@vger.kernel.org, Wuyun <wuyun.wu@huawei.com>,
Xinwei Hu <huxinwei@huawei.com>
Subject: Re: [PATCH 4/5] PCI/MSI: MSI cleanup, msi_setup_entry()
Date: Thu, 3 Jul 2014 17:39:52 -0600 [thread overview]
Message-ID: <20140703233952.GB25980@google.com> (raw)
In-Reply-To: <1403166648-7932-1-git-send-email-wangyijing@huawei.com>
On Thu, Jun 19, 2014 at 04:30:48PM +0800, Yijing Wang wrote:
> Move MSI entry stuff to a new function
> msi_setup_entry(), simplify msi_capability_init()
> code like MSI-X do.
I like this in general, but ...
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> ---
> drivers/pci/msi.c | 71 +++++++++++++++++++++++++++++++---------------------
> 1 files changed, 42 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index d8e431d..8e17446 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -582,6 +582,35 @@ error_attrs:
> return ret;
> }
>
> +static int msi_setup_entry(struct pci_dev *dev)
> +{
> + u16 control;
> + struct msi_desc *entry;
> +
> + entry = alloc_msi_entry(dev);
> + if (!entry)
> + return -ENOMEM;
> +
> + pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
> +
> + entry->msi_attrib.is_msix = 0;
> + entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
> + entry->msi_attrib.entry_nr = 0;
> + entry->msi_attrib.maskbit = !!(control & PCI_MSI_FLAGS_MASKBIT);
> + entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
> + entry->msi_attrib.pos = dev->msi_cap;
> + entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1;
> +
> + if (control & PCI_MSI_FLAGS_64BIT)
> + entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64;
> + else
> + entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_32;
> +
> +
> + list_add_tail(&entry->list, &dev->msi_list);
> + return 0;
Why don't you just return "entry" here (and NULL for the failure above)?
> +}
> +
> /**
> * msi_capability_init - configure device's MSI capability structure
> * @dev: pointer to the pci_dev data structure of MSI device function
> @@ -597,51 +626,30 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
> {
> struct msi_desc *entry;
> int ret;
> - u16 control;
> unsigned mask;
>
> msi_set_enable(dev, 0); /* Disable MSI during set up */
>
> - pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
> /* MSI Entry Initialization */
> - entry = alloc_msi_entry(dev);
> - if (!entry)
> - return -ENOMEM;
> -
> - entry->msi_attrib.is_msix = 0;
> - entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
> - entry->msi_attrib.entry_nr = 0;
> - entry->msi_attrib.maskbit = !!(control & PCI_MSI_FLAGS_MASKBIT);
> - entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
> - entry->msi_attrib.pos = dev->msi_cap;
> - entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1;
> + ret = msi_setup_entry(dev);
> + if (ret)
> + return ret;
>
> - if (control & PCI_MSI_FLAGS_64BIT)
> - entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64;
> - else
> - entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_32;
> + entry = list_first_entry(&dev->msi_list, struct msi_desc, list);
> /* All MSIs are unmasked by default, Mask them all */
> if (entry->msi_attrib.maskbit)
> pci_read_config_dword(dev, entry->mask_pos, &entry->masked);
> mask = msi_mask(entry->msi_attrib.multi_cap);
> msi_mask_irq(entry, mask, mask);
>
> - list_add_tail(&entry->list, &dev->msi_list);
And keep the list_add_tail() here. Then you don't have the awkwardness of
pulling the entry off the list after calling msi_setup_entry().
That also means the MSIs can be masked before putting the entry on
dev->msi_list, as they were before. It *might* be safe to change the order
as you did, but it definitely takes some analysis to prove it, especially
since pci_enable_msi_range() only WARNs but doesn't bail out if
dev->msi_enabled already.
> /* Configure MSI capability structure */
> ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
> - if (ret) {
> - msi_mask_irq(entry, mask, ~mask);
> - free_msi_irqs(dev);
> - return ret;
> - }
> + if (ret)
> + goto err;
>
> ret = populate_msi_sysfs(dev);
> - if (ret) {
> - msi_mask_irq(entry, mask, ~mask);
> - free_msi_irqs(dev);
> - return ret;
> - }
> + if (ret)
> + goto err;
>
> /* Set MSI enabled bits */
> pci_intx_for_msi(dev, 0);
> @@ -650,6 +658,11 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
>
> dev->irq = entry->irq;
> return 0;
> +
> +err:
> + msi_mask_irq(entry, mask, ~mask);
> + free_msi_irqs(dev);
> + return ret;
> }
>
> static void __iomem *msix_map_region(struct pci_dev *dev, unsigned nr_entries)
> --
> 1.7.1
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-07-03 23:39 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-19 8:30 [PATCH 4/5] PCI/MSI: MSI cleanup, msi_setup_entry() Yijing Wang
2014-07-03 23:39 ` Bjorn Helgaas [this message]
2014-07-04 1:57 ` Yijing Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140703233952.GB25980@google.com \
--to=bhelgaas@google.com \
--cc=huxinwei@huawei.com \
--cc=linux-pci@vger.kernel.org \
--cc=wangyijing@huawei.com \
--cc=wuyun.wu@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.