From: "Kalra, Ashish" <ashish.kalra@amd.com>
To: Philipp Stanner <pstanner@redhat.com>
Cc: airlied@gmail.com, bhelgaas@google.com, dakr@redhat.com,
daniel@ffwll.ch, dri-devel@lists.freedesktop.org,
hdegoede@redhat.com, linux-kernel@vger.kernel.org,
linux-pci@vger.kernel.org, maarten.lankhorst@linux.intel.com,
mripard@kernel.org, sam@ravnborg.org, tzimmermann@suse.de,
thomas.lendacky@amd.com, mario.limonciello@amd.com
Subject: Re: [PATCH v9 10/13] PCI: Give pci_intx() its own devres callback
Date: Tue, 9 Jul 2024 13:46:20 -0500 [thread overview]
Message-ID: <8c4634e9-4f02-4c54-9c89-d75e2f4bf026@amd.com> (raw)
In-Reply-To: <426645d40776198e0fcc942f4a6cac4433c7a9aa.camel@redhat.com>
Hello Philipp,
I have reviewed and tested this patch, looks to be working fine and fixes the issue.
Thanks, Ashish
On 7/9/2024 3:56 AM, Philipp Stanner wrote:
> From c24bd5b66e798a341caf183fb7cdbdf235502d90 Mon Sep 17 00:00:00 2001
> From: Philipp Stanner <pstanner@redhat.com>
> Date: Tue, 9 Jul 2024 09:45:48 +0200
> Subject: [PATCH] PCI: Fix pcim_intx() recursive calls
>
> pci_intx() calls into pcim_intx() in managed mode, i.e., when
> pcim_enable_device() had been called. This recursive call causes a bug
> by re-registering the device resource in the release callback.
>
> This is the same phenomenon that made it necessary to implement some
> functionality a second time, see __pcim_request_region().
>
> Implement __pcim_intx() to bypass the hybrid nature of pci_intx() on
> driver detach.
>
> Fixes: https://lore.kernel.org/all/20240708214656.4721-1-Ashish.Kalra@amd.com/
> Reported-by: Ashish Kalra <Ashish.Kalra@amd.com>
> Signed-off-by: Philipp Stanner <pstanner@redhat.com>
> ---
> Hi Ashish,
> I hacked down this fix that should be applyable on top.
> Could you maybe have a first quick look whether this fixes the issue?
> ---
> drivers/pci/devres.c | 33 +++++++++++++++++++++------------
> 1 file changed, 21 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/pci/devres.c b/drivers/pci/devres.c
> index 2f0379a4e58f..dcef049b72fe 100644
> --- a/drivers/pci/devres.c
> +++ b/drivers/pci/devres.c
> @@ -408,12 +408,31 @@ static inline bool mask_contains_bar(int mask, int bar)
> return mask & BIT(bar);
> }
>
> +/*
> + * This is a copy of pci_intx() used to bypass the problem of occuring
> + * recursive function calls due to the hybrid nature of pci_intx().
> + */
> +static void __pcim_intx(struct pci_dev *pdev, int enable)
> +{
> + u16 pci_command, new;
> +
> + pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
> +
> + if (enable)
> + new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
> + else
> + new = pci_command | PCI_COMMAND_INTX_DISABLE;
> +
> + if (new != pci_command)
> + pci_write_config_word(pdev, PCI_COMMAND, new);
> +}
> +
> static void pcim_intx_restore(struct device *dev, void *data)
> {
> struct pci_dev *pdev = to_pci_dev(dev);
> struct pcim_intx_devres *res = data;
>
> - pci_intx(pdev, res->orig_intx);
> + __pcim_intx(pdev, res->orig_intx);
> }
>
> static struct pcim_intx_devres *get_or_create_intx_devres(struct device *dev)
> @@ -443,7 +462,6 @@ static struct pcim_intx_devres *get_or_create_intx_devres(struct device *dev)
> */
> int pcim_intx(struct pci_dev *pdev, int enable)
> {
> - u16 pci_command, new;
> struct pcim_intx_devres *res;
>
> res = get_or_create_intx_devres(&pdev->dev);
> @@ -451,16 +469,7 @@ int pcim_intx(struct pci_dev *pdev, int enable)
> return -ENOMEM;
>
> res->orig_intx = !enable;
> -
> - pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
> -
> - if (enable)
> - new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
> - else
> - new = pci_command | PCI_COMMAND_INTX_DISABLE;
> -
> - if (new != pci_command)
> - pci_write_config_word(pdev, PCI_COMMAND, new);
> + __pcim_intx(pdev, enable);
>
> return 0;
> }
Tested-by: Ashish Kalra <Ashish.Kalra@amd.com>
next prev parent reply other threads:[~2024-07-09 18:46 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-13 11:50 [PATCH v9 00/13] Make PCI's devres API more consistent Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 01/13] PCI: Add and use devres helper for bit masks Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 02/13] PCI: Add devres helpers for iomap table Philipp Stanner
2025-11-23 16:42 ` [PATCH v9 02/13] PCI: Add devres helpers for iomap table [resulting in backtraces on HPPA] Guenter Roeck
2025-11-25 15:48 ` Philipp Stanner
2025-11-25 16:12 ` Guenter Roeck
2025-11-25 16:28 ` Philipp Stanner
2025-11-25 18:49 ` Guenter Roeck
2024-06-13 11:50 ` [PATCH v9 03/13] PCI: Add partial-BAR devres support Philipp Stanner
2024-06-13 21:28 ` Bjorn Helgaas
2024-06-14 8:01 ` Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 04/13] PCI: Deprecate two surplus devres functions Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 05/13] PCI: Make devres region requests consistent Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 06/13] PCI: Warn users about complicated devres nature Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 07/13] PCI: Remove enabled status bit from pci_devres Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 08/13] PCI: Move pinned status bit to struct pci_dev Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 09/13] PCI: Give pcim_set_mwi() its own devres callback Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 10/13] PCI: Give pci_intx() " Philipp Stanner
2024-06-13 21:06 ` Bjorn Helgaas
2024-06-14 8:09 ` Philipp Stanner
2024-06-14 16:14 ` Bjorn Helgaas
2024-06-17 8:21 ` Philipp Stanner
2024-06-17 16:46 ` Bjorn Helgaas
2024-06-18 7:56 ` Philipp Stanner
2024-07-08 21:46 ` Ashish Kalra
2024-07-09 7:21 ` Philipp Stanner
2024-07-09 8:12 ` Kalra, Ashish
2024-07-09 8:56 ` Philipp Stanner
2024-07-09 18:46 ` Kalra, Ashish [this message]
2024-07-10 4:08 ` Krzysztof Wilczyński
2024-07-10 4:43 ` Krzysztof Wilczyński
2024-06-13 11:50 ` [PATCH v9 11/13] PCI: Remove legacy pcim_release() Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 12/13] PCI: Add pcim_iomap_range() Philipp Stanner
2024-06-13 11:50 ` [PATCH v9 13/13] drm/vboxvideo: fix mapping leaks Philipp Stanner
2024-06-13 21:57 ` [PATCH v9 00/13] Make PCI's devres API more consistent Bjorn Helgaas
2024-06-14 11:38 ` Philipp Stanner
2024-06-14 16:16 ` Bjorn Helgaas
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=8c4634e9-4f02-4c54-9c89-d75e2f4bf026@amd.com \
--to=ashish.kalra@amd.com \
--cc=airlied@gmail.com \
--cc=bhelgaas@google.com \
--cc=dakr@redhat.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=hdegoede@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mario.limonciello@amd.com \
--cc=mripard@kernel.org \
--cc=pstanner@redhat.com \
--cc=sam@ravnborg.org \
--cc=thomas.lendacky@amd.com \
--cc=tzimmermann@suse.de \
/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