From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Cc: Hans de Goede <hansg@kernel.org>,
platform-driver-x86@vger.kernel.org,
LKML <linux-kernel@vger.kernel.org>,
Stable@vger.kernel.org
Subject: Re: [PATCH 3/3] platform/x86/intel/tpmi/plr: Prevent fault during unbind
Date: Thu, 30 Apr 2026 13:24:03 +0300 (EEST) [thread overview]
Message-ID: <ef77dd1d-57bf-073d-4ef6-54cf70ddd12f@linux.intel.com> (raw)
In-Reply-To: <20260429195214.1532711-4-srinivas.pandruvada@linux.intel.com>
On Wed, 29 Apr 2026, Srinivas Pandruvada wrote:
> This driver faults when intel vsec driver unbound from PCI driver
> interface. For example:
>
> echo 0000:00:03.1 > /sys/bus/pci/drivers/intel_vsec/unbind
>
> This is caused by accessing plr->dbgfs_dir after vsec_tpmi driver is
> removed. Here vsec_tpmi driver is the parent. On unbind, the parent
> device remove callback is called first which here will remove debugfs
> interface. Hence plr->dbgfs_dir is no longer valid.
>
> Register notifier for TPMI_CORE_EXIT and make this pointer to NULL,
> so that debugfs_remove_recursive() is not called with bad plr->dbgfs_dir
> pointer.
>
> After notifier is returned the vsec_tpmi driver will call remove debugfs
> by calling debugfs_remove_recursive().
>
> Fixes: 811f67c51636 ("platform/x86/intel/tpmi: Add new auxiliary driver for performance limits")
> Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> Cc: <Stable@vger.kernel.org>
> ---
> drivers/platform/x86/intel/plr_tpmi.c | 43 +++++++++++++++++++++++++--
> 1 file changed, 41 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/platform/x86/intel/plr_tpmi.c b/drivers/platform/x86/intel/plr_tpmi.c
> index 05727169f49c..644df673896b 100644
> --- a/drivers/platform/x86/intel/plr_tpmi.c
> +++ b/drivers/platform/x86/intel/plr_tpmi.c
> @@ -22,6 +22,7 @@
> #include <linux/module.h>
> #include <linux/mod_devicetable.h>
> #include <linux/mutex.h>
> +#include <linux/notifier.h>
> #include <linux/seq_file.h>
> #include <linux/sprintf.h>
> #include <linux/types.h>
> @@ -60,6 +61,8 @@ struct tpmi_plr {
> struct tpmi_plr_die *die_info;
> int num_dies;
> struct auxiliary_device *auxdev;
> + struct notifier_block nb;
> + struct mutex lock; /* Protect access to dbgfs_dir */
Extra whitespace.
Move the comment slightly more right as there's place.
> };
>
> static const char * const plr_coarse_reasons[] = {
> @@ -255,6 +258,30 @@ static ssize_t plr_status_write(struct file *filp, const char __user *ubuf,
> }
> DEFINE_SHOW_STORE_ATTRIBUTE(plr_status);
>
> +static int intel_plr_notify(struct notifier_block *self, unsigned long action, void *data)
> +{
> + struct tpmi_plr *plr = container_of(self, struct tpmi_plr, nb);
> +
> + if (action == TPMI_CORE_EXIT) {
> + guard(mutex)(&plr->lock);
> + plr->dbgfs_dir = NULL;
> + }
> +
> + return NOTIFY_DONE;
> +}
> +
> +static int intel_plr_register_notifier(struct notifier_block *nb)
> +{
> + nb->notifier_call = intel_plr_notify;
> + nb->priority = 0;
> + return tpmi_register_notifier(nb);
> +}
> +
> +static void intel_plr_unregister_notifier(struct notifier_block *nb)
> +{
> + tpmi_unregister_notifier(nb);
> +}
> +
> static int intel_plr_probe(struct auxiliary_device *auxdev, const struct auxiliary_device_id *id)
> {
> struct oobmsm_plat_info *plat_info;
> @@ -282,10 +309,16 @@ static int intel_plr_probe(struct auxiliary_device *auxdev, const struct auxilia
> if (!plr)
> return -ENOMEM;
>
> + mutex_init(&plr->lock);
This lacks pairing destroy, but you can probably use devm_mutex_init() as
there's devm_*() below.
> +
> + intel_plr_register_notifier(&plr->nb);
> +
> plr->die_info = devm_kcalloc(&auxdev->dev, num_resources, sizeof(*plr->die_info),
> GFP_KERNEL);
> - if (!plr->die_info)
> - return -ENOMEM;
> + if (!plr->die_info) {
> + err = -ENOMEM;
> + goto err_notify;
> + }
>
> plr->num_dies = num_resources;
> plr->dbgfs_dir = debugfs_create_dir("plr", dentry);
> @@ -326,6 +359,9 @@ static int intel_plr_probe(struct auxiliary_device *auxdev, const struct auxilia
>
> err:
> debugfs_remove_recursive(plr->dbgfs_dir);
> +err_notify:
> + intel_plr_unregister_notifier(&plr->nb);
> +
> return err;
> }
>
> @@ -333,6 +369,9 @@ static void intel_plr_remove(struct auxiliary_device *auxdev)
> {
> struct tpmi_plr *plr = auxiliary_get_drvdata(auxdev);
>
> + intel_plr_unregister_notifier(&plr->nb);
> +
> + guard(mutex)(&plr->lock);
> debugfs_remove_recursive(plr->dbgfs_dir);
> }
>
>
--
i.
prev parent reply other threads:[~2026-04-30 10:24 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-29 19:52 [PATCH 0/3] platform/x86: intel: TPMI/PLR PCI unbind issue Srinivas Pandruvada
2026-04-29 19:52 ` [PATCH 1/3] platform/x86: intel: Move debugfs register before creating devices Srinivas Pandruvada
2026-04-29 19:52 ` [PATCH 2/3] platform/x86: intel: Add notifiers support Srinivas Pandruvada
2026-04-29 19:52 ` [PATCH 3/3] platform/x86/intel/tpmi/plr: Prevent fault during unbind Srinivas Pandruvada
2026-04-30 10:24 ` Ilpo Järvinen [this message]
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=ef77dd1d-57bf-073d-4ef6-54cf70ddd12f@linux.intel.com \
--to=ilpo.jarvinen@linux.intel.com \
--cc=Stable@vger.kernel.org \
--cc=hansg@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=platform-driver-x86@vger.kernel.org \
--cc=srinivas.pandruvada@linux.intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox