From: Ye Xiaolong <xiaolong.ye@intel.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: dev@dpdk.org, Ferruh Yigit <ferruh.yigit@intel.com>
Subject: Re: [dpdk-dev] [PATCH v2] igb_uio: remove out-of-date comment
Date: Tue, 22 Jan 2019 09:52:19 +0800 [thread overview]
Message-ID: <20190122015219.GA88690@intel.com> (raw)
In-Reply-To: <20190117021354.GA47093@intel.com>
Hi, Stephen
On 01/17, Ye Xiaolong wrote:
>On 01/16, Stephen Hemminger wrote:
>>On Wed, 16 Jan 2019 15:48:36 +0800
>>Ye Xiaolong <xiaolong.ye@intel.com> wrote:
>>
>>> Hi, Stephen
>>>
>>> On 01/15, Stephen Hemminger wrote:
>>> >On Wed, 16 Jan 2019 08:34:52 +0800
>>> >Xiaolong Ye <xiaolong.ye@intel.com> wrote:
>>> >
>>> >> The comment for igbuio_pci_irqhandler is out of date as the code evolves,
>>> >> remove it to avoid misleading.
>>> >>
>>> >> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
>>> >> ---
>>> >> kernel/linux/igb_uio/igb_uio.c | 4 ----
>>> >> 1 file changed, 4 deletions(-)
>>> >>
>>> >> diff --git a/kernel/linux/igb_uio/igb_uio.c b/kernel/linux/igb_uio/igb_uio.c
>>> >> index 3cf394bdf..d6ac51e79 100644
>>> >> --- a/kernel/linux/igb_uio/igb_uio.c
>>> >> +++ b/kernel/linux/igb_uio/igb_uio.c
>>> >> @@ -185,10 +185,6 @@ igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state)
>>> >> return 0;
>>> >> }
>>> >>
>>> >> -/**
>>> >> - * This is interrupt handler which will check if the interrupt is for the right device.
>>> >> - * If yes, disable it here and will be enable later.
>>> >> - */
>>> >> static irqreturn_t
>>> >> igbuio_pci_irqhandler(int irq, void *dev_id)
>>> >> {
>>> >
>>> >The comment is partially correct; if you look at the legacy case.
>>> >
>>> >Maybe better to move the comment to pci_check_and_mask_intx in compat.h?
>>> >I see there is another incorrect comment there.
>>> >
>>>
>>> As I tried to understand pci_check_and_mask_intx behavior, I noticed that it
>>> was introduced by commit 399a3f0d ("igb_uio: fix IRQ mode handling"), and it
>>> was derived from igbuio_set_interrupt_mask, however there were two parameters
>>> in igbuio_set_interrupt_mask as below:
>>>
>>> static int
>>> igbuio_set_interrupt_mask(struct rte_uio_pci_dev *udev, int32_t state)
>>>
>>> while the pci_check_and_mask_intx only has 1 parameter,
>>>
>>> static bool pci_check_and_mask_intx(struct pci_dev *pdev)
>>>
>>> but in its function body it still use the "state" accorrding to commit 399a3f0d
>>>
>>> +static bool pci_check_and_mask_intx(struct pci_dev *pdev)
>>> {
>>> - /* Some function names changes between 3.2.0 and 3.3.0... */
>>> -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
>>> - pci_unblock_user_cfg_access(pdev);
>>> -#else
>>> - pci_cfg_access_unlock(pdev);
>>> -#endif
>>> + bool pending;
>>> + uint32_t status;
>>> +
>>> + pci_block_user_cfg_access(dev);
>>> + pci_read_config_dword(pdev, PCI_COMMAND, &status);
>>> +
>>> + /* interrupt is not ours, goes to out */
>>> + pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0);
>>> + if (pending) {
>>> + uint16_t old, new;
>>> +
>>> + old = status;
>>> + if (state != 0) <=========================== state still in use
>>> + new = old & (~PCI_COMMAND_INTX_DISABLE);
>>> + else
>>> + new = old | PCI_COMMAND_INTX_DISABLE;
>>> +
>>> + if (old != new)
>>> + pci_write_config_word(pdev, PCI_COMMAND, new);
>>> + }
>>> + pci_unblock_user_cfg_access(dev);
>>> +
>>> + return pending;
>>>
>>> and later this was fixed as a typo in commit 5b2f8137 ("igb_uio: fix typos for
>>> kernel older than 3.3") which seems not correct.
>>>
>>> old = status;
>>> - if (state != 0)
>>> + if (status != 0)
>>>
>>> I feel like that pci_check_and_mask_intx still needs two parameters from code
>>> point of view, please correct me if I was wrong or miss anything, or you think
>>> it's sensible, I'll cook a patch for it.
>>>
>>> Thanks,
>>> Xiaolong
>>
>>This code is copy of upstream kernel function, you should look at that.
>
>Thanks, just checked the kernel version of pci_check_and_mask_intx, and it is a
>wrap of pci_check_and_set_intx_mask(pdev, true).
>
>
> bool pci_check_and_mask_intx(struct pci_dev *dev)
> {
> return pci_check_and_set_intx_mask(dev, true);
> }
>
>
> static bool pci_check_and_set_intx_mask(struct pci_dev *dev, bool mask)
> {
> struct pci_bus *bus = dev->bus;
> ...
> origcmd = cmd_status_dword;
> newcmd = origcmd & ~PCI_COMMAND_INTX_DISABLE;
> if (mask)
> newcmd |= PCI_COMMAND_INTX_DISABLE;
> if (newcmd != origcmd)
> bus->ops->write(bus, dev->devfn, PCI_COMMAND, 2, newcmd);
>
> done:
> raw_spin_unlock_irqrestore(&pci_lock, flags);
>
> return mask_updated;
> }
>
>if mask is set to ture, PCI_COMMAND_INTX_DISABLE will be set in newcmd.
>
>And current dpdk version doesn't align with it:
>
> static bool pci_check_and_mask_intx(struct pci_dev *pdev)
> {
> bool pending;
> uint32_t status;
>
> pci_block_user_cfg_access(pdev);
> pci_read_config_dword(pdev, PCI_COMMAND, &status);
>
> /* interrupt is not ours, goes to out */
> pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0);
> if (pending) {
> uint16_t old, new;
>
> old = status;
> if (status != 0)
> new = old & (~PCI_COMMAND_INTX_DISABLE);
> else
> new = old | PCI_COMMAND_INTX_DISABLE;
>
> if (old != new)
> pci_write_config_word(pdev, PCI_COMMAND, new);
> }
> pci_unblock_user_cfg_access(pdev);
>
> return pending;
> }
>
>In this code, if the interrupt is triggered by this device, both pending and
>status will not be 0, so the PCI_COMMAND_INTX_DISABLE will be cleared for new.
>
>To align the behavior with upstream kernel, we may need change like:
>
>diff --git a/kernel/linux/igb_uio/compat.h b/kernel/linux/igb_uio/compat.h
>index 8dbb896ae..a78c97f91 100644
>--- a/kernel/linux/igb_uio/compat.h
>+++ b/kernel/linux/igb_uio/compat.h
>@@ -107,10 +107,7 @@ static bool pci_check_and_mask_intx(struct pci_dev *pdev)
> uint16_t old, new;
>
> old = status;
>- if (status != 0)
>- new = old & (~PCI_COMMAND_INTX_DISABLE);
>- else
>- new = old | PCI_COMMAND_INTX_DISABLE;
>+ new = old | PCI_COMMAND_INTX_DISABLE;
>
> if (old != new)
> pci_write_config_word(pdev, PCI_COMMAND, new);
>
>
>Please correct me if I was wrong.
Does my above fix make any sense?
Thanks,
Xiaolong
>
>Thanks,
>Xiaolong
next prev parent reply other threads:[~2019-01-22 1:52 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-15 15:46 [dpdk-dev] [PATCH] " Xiaolong Ye
2019-01-15 16:08 ` Burakov, Anatoly
2019-01-15 23:54 ` Ye Xiaolong
2019-01-16 0:34 ` [dpdk-dev] [PATCH v2] " Xiaolong Ye
2019-01-16 1:38 ` Stephen Hemminger
2019-01-16 5:17 ` Ye Xiaolong
2019-01-16 7:48 ` Ye Xiaolong
2019-01-16 18:55 ` Stephen Hemminger
2019-01-17 2:13 ` Ye Xiaolong
2019-01-22 1:52 ` Ye Xiaolong [this message]
2019-01-29 12:49 ` Ferruh Yigit
2019-01-31 8:13 ` Ye Xiaolong
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=20190122015219.GA88690@intel.com \
--to=xiaolong.ye@intel.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@intel.com \
--cc=stephen@networkplumber.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).