From: joeyli <jlee@suse.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: linux-nvdimm@lists.01.org, vishal.l.verma@intel.com,
linux-acpi@vger.kernel.org
Subject: Re: [PATCH 2/2] nfit, tools/testing/nvdimm/: unify shutdown paths
Date: Fri, 22 Jul 2016 20:41:41 +0800 [thread overview]
Message-ID: <20160722124141.GI12939@linux-rxt1.site> (raw)
In-Reply-To: <146915794992.7201.150642033798020654.stgit@dwillia2-desk3.amr.corp.intel.com>
Hi Dan,
On Thu, Jul 21, 2016 at 08:25:50PM -0700, Dan Williams wrote:
> While testing the new on-demand ARS patches we discovered that
> differences between the nfit_test and normal nfit driver shutdown paths
> can leak resources. Unify the shutdown paths to trigger via a devm_
> callback when the acpi_desc->dev is unbound from its driver.
>
> Reported-by: Vishal Verma <vishal.l.verma@intel.com>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Lee, Chun-Yi <jlee@suse.com>
Thanks a lot!
Joey Lee
> ---
> drivers/acpi/nfit.c | 36 ++++++++++++++++++++++--------------
> tools/testing/nvdimm/test/nfit.c | 16 ++--------------
> 2 files changed, 24 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c
> index e7eb3b6f1514..be7c2fde16e7 100644
> --- a/drivers/acpi/nfit.c
> +++ b/drivers/acpi/nfit.c
> @@ -2291,6 +2291,16 @@ static int acpi_nfit_check_deletions(struct acpi_nfit_desc *acpi_desc,
> return 0;
> }
>
> +static void acpi_nfit_destruct(void *data)
> +{
> + struct acpi_nfit_desc *acpi_desc = data;
> +
> + acpi_desc->cancel = 1;
> + flush_workqueue(nfit_wq);
> + nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + acpi_desc->nvdimm_bus = NULL;
> +}
> +
> int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *data, acpi_size sz)
> {
> struct device *dev = acpi_desc->dev;
> @@ -2298,6 +2308,17 @@ int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *data, acpi_size sz)
> const void *end;
> int rc;
>
> + if (!acpi_desc->nvdimm_bus) {
> + acpi_desc->nvdimm_bus = nvdimm_bus_register(dev,
> + &acpi_desc->nd_desc);
> + if (!acpi_desc->nvdimm_bus)
> + return -ENOMEM;
> + rc = devm_add_action_or_reset(dev, acpi_nfit_destruct,
> + acpi_desc);
> + if (rc)
> + return rc;
> + }
> +
> mutex_lock(&acpi_desc->init_mutex);
>
> INIT_LIST_HEAD(&prev.spas);
> @@ -2456,9 +2477,6 @@ static int acpi_nfit_add(struct acpi_device *adev)
> if (!acpi_desc)
> return -ENOMEM;
> acpi_nfit_desc_init(acpi_desc, &adev->dev);
> - acpi_desc->nvdimm_bus = nvdimm_bus_register(dev, &acpi_desc->nd_desc);
> - if (!acpi_desc->nvdimm_bus)
> - return -ENOMEM;
>
> /* Save the acpi header for exporting the revision via sysfs */
> acpi_desc->acpi_header = *tbl;
> @@ -2480,19 +2498,12 @@ static int acpi_nfit_add(struct acpi_device *adev)
> rc = acpi_nfit_init(acpi_desc, (void *) tbl
> + sizeof(struct acpi_table_nfit),
> sz - sizeof(struct acpi_table_nfit));
> -
> - if (rc)
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> return rc;
> }
>
> static int acpi_nfit_remove(struct acpi_device *adev)
> {
> - struct acpi_nfit_desc *acpi_desc = dev_get_drvdata(&adev->dev);
> -
> - acpi_desc->cancel = 1;
> - flush_workqueue(nfit_wq);
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + /* see acpi_nfit_destruct */
> return 0;
> }
>
> @@ -2519,9 +2530,6 @@ static void acpi_nfit_notify(struct acpi_device *adev, u32 event)
> if (!acpi_desc)
> goto out_unlock;
> acpi_nfit_desc_init(acpi_desc, &adev->dev);
> - acpi_desc->nvdimm_bus = nvdimm_bus_register(dev, &acpi_desc->nd_desc);
> - if (!acpi_desc->nvdimm_bus)
> - goto out_unlock;
> } else {
> /*
> * Finish previous registration before considering new
> diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c
> index 642713f15723..5404efa578a3 100644
> --- a/tools/testing/nvdimm/test/nfit.c
> +++ b/tools/testing/nvdimm/test/nfit.c
> @@ -1465,16 +1465,11 @@ static int nfit_test_probe(struct platform_device *pdev)
> nd_desc->provider_name = NULL;
> nd_desc->module = THIS_MODULE;
> nd_desc->ndctl = nfit_test_ctl;
> - acpi_desc->nvdimm_bus = nvdimm_bus_register(&pdev->dev, nd_desc);
> - if (!acpi_desc->nvdimm_bus)
> - return -ENXIO;
>
> rc = acpi_nfit_init(acpi_desc, nfit_test->nfit_buf,
> nfit_test->nfit_size);
> - if (rc) {
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + if (rc)
> return rc;
> - }
>
> if (nfit_test->setup != nfit_test0_setup)
> return 0;
> @@ -1484,21 +1479,14 @@ static int nfit_test_probe(struct platform_device *pdev)
>
> rc = acpi_nfit_init(acpi_desc, nfit_test->nfit_buf,
> nfit_test->nfit_size);
> - if (rc) {
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + if (rc)
> return rc;
> - }
>
> return 0;
> }
>
> static int nfit_test_remove(struct platform_device *pdev)
> {
> - struct nfit_test *nfit_test = to_nfit_test(&pdev->dev);
> - struct acpi_nfit_desc *acpi_desc = &nfit_test->acpi_desc;
> -
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> -
> return 0;
> }
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: joeyli <jlee@suse.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: linux-acpi@vger.kernel.org, linux-nvdimm@lists.01.org
Subject: Re: [PATCH 2/2] nfit, tools/testing/nvdimm/: unify shutdown paths
Date: Fri, 22 Jul 2016 20:41:41 +0800 [thread overview]
Message-ID: <20160722124141.GI12939@linux-rxt1.site> (raw)
In-Reply-To: <146915794992.7201.150642033798020654.stgit@dwillia2-desk3.amr.corp.intel.com>
Hi Dan,
On Thu, Jul 21, 2016 at 08:25:50PM -0700, Dan Williams wrote:
> While testing the new on-demand ARS patches we discovered that
> differences between the nfit_test and normal nfit driver shutdown paths
> can leak resources. Unify the shutdown paths to trigger via a devm_
> callback when the acpi_desc->dev is unbound from its driver.
>
> Reported-by: Vishal Verma <vishal.l.verma@intel.com>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Lee, Chun-Yi <jlee@suse.com>
Thanks a lot!
Joey Lee
> ---
> drivers/acpi/nfit.c | 36 ++++++++++++++++++++++--------------
> tools/testing/nvdimm/test/nfit.c | 16 ++--------------
> 2 files changed, 24 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c
> index e7eb3b6f1514..be7c2fde16e7 100644
> --- a/drivers/acpi/nfit.c
> +++ b/drivers/acpi/nfit.c
> @@ -2291,6 +2291,16 @@ static int acpi_nfit_check_deletions(struct acpi_nfit_desc *acpi_desc,
> return 0;
> }
>
> +static void acpi_nfit_destruct(void *data)
> +{
> + struct acpi_nfit_desc *acpi_desc = data;
> +
> + acpi_desc->cancel = 1;
> + flush_workqueue(nfit_wq);
> + nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + acpi_desc->nvdimm_bus = NULL;
> +}
> +
> int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *data, acpi_size sz)
> {
> struct device *dev = acpi_desc->dev;
> @@ -2298,6 +2308,17 @@ int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *data, acpi_size sz)
> const void *end;
> int rc;
>
> + if (!acpi_desc->nvdimm_bus) {
> + acpi_desc->nvdimm_bus = nvdimm_bus_register(dev,
> + &acpi_desc->nd_desc);
> + if (!acpi_desc->nvdimm_bus)
> + return -ENOMEM;
> + rc = devm_add_action_or_reset(dev, acpi_nfit_destruct,
> + acpi_desc);
> + if (rc)
> + return rc;
> + }
> +
> mutex_lock(&acpi_desc->init_mutex);
>
> INIT_LIST_HEAD(&prev.spas);
> @@ -2456,9 +2477,6 @@ static int acpi_nfit_add(struct acpi_device *adev)
> if (!acpi_desc)
> return -ENOMEM;
> acpi_nfit_desc_init(acpi_desc, &adev->dev);
> - acpi_desc->nvdimm_bus = nvdimm_bus_register(dev, &acpi_desc->nd_desc);
> - if (!acpi_desc->nvdimm_bus)
> - return -ENOMEM;
>
> /* Save the acpi header for exporting the revision via sysfs */
> acpi_desc->acpi_header = *tbl;
> @@ -2480,19 +2498,12 @@ static int acpi_nfit_add(struct acpi_device *adev)
> rc = acpi_nfit_init(acpi_desc, (void *) tbl
> + sizeof(struct acpi_table_nfit),
> sz - sizeof(struct acpi_table_nfit));
> -
> - if (rc)
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> return rc;
> }
>
> static int acpi_nfit_remove(struct acpi_device *adev)
> {
> - struct acpi_nfit_desc *acpi_desc = dev_get_drvdata(&adev->dev);
> -
> - acpi_desc->cancel = 1;
> - flush_workqueue(nfit_wq);
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + /* see acpi_nfit_destruct */
> return 0;
> }
>
> @@ -2519,9 +2530,6 @@ static void acpi_nfit_notify(struct acpi_device *adev, u32 event)
> if (!acpi_desc)
> goto out_unlock;
> acpi_nfit_desc_init(acpi_desc, &adev->dev);
> - acpi_desc->nvdimm_bus = nvdimm_bus_register(dev, &acpi_desc->nd_desc);
> - if (!acpi_desc->nvdimm_bus)
> - goto out_unlock;
> } else {
> /*
> * Finish previous registration before considering new
> diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c
> index 642713f15723..5404efa578a3 100644
> --- a/tools/testing/nvdimm/test/nfit.c
> +++ b/tools/testing/nvdimm/test/nfit.c
> @@ -1465,16 +1465,11 @@ static int nfit_test_probe(struct platform_device *pdev)
> nd_desc->provider_name = NULL;
> nd_desc->module = THIS_MODULE;
> nd_desc->ndctl = nfit_test_ctl;
> - acpi_desc->nvdimm_bus = nvdimm_bus_register(&pdev->dev, nd_desc);
> - if (!acpi_desc->nvdimm_bus)
> - return -ENXIO;
>
> rc = acpi_nfit_init(acpi_desc, nfit_test->nfit_buf,
> nfit_test->nfit_size);
> - if (rc) {
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + if (rc)
> return rc;
> - }
>
> if (nfit_test->setup != nfit_test0_setup)
> return 0;
> @@ -1484,21 +1479,14 @@ static int nfit_test_probe(struct platform_device *pdev)
>
> rc = acpi_nfit_init(acpi_desc, nfit_test->nfit_buf,
> nfit_test->nfit_size);
> - if (rc) {
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> + if (rc)
> return rc;
> - }
>
> return 0;
> }
>
> static int nfit_test_remove(struct platform_device *pdev)
> {
> - struct nfit_test *nfit_test = to_nfit_test(&pdev->dev);
> - struct acpi_nfit_desc *acpi_desc = &nfit_test->acpi_desc;
> -
> - nvdimm_bus_unregister(acpi_desc->nvdimm_bus);
> -
> return 0;
> }
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
next prev parent reply other threads:[~2016-07-22 12:41 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-22 3:25 [PATCH 1/2] libnvdimm: move ->module to struct nvdimm_bus_descriptor Dan Williams
2016-07-22 3:25 ` Dan Williams
2016-07-22 3:25 ` [PATCH 2/2] nfit, tools/testing/nvdimm/: unify shutdown paths Dan Williams
2016-07-22 3:25 ` Dan Williams
2016-07-22 12:41 ` joeyli [this message]
2016-07-22 12:41 ` joeyli
[not found] ` <146915794457.7201.5023729229431647060.stgit-p8uTFz9XbKj2zm6wflaqv1nYeNYlB/vhral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-07-22 10:23 ` [PATCH 1/2] libnvdimm: move ->module to struct nvdimm_bus_descriptor joeyli
2016-07-22 10:23 ` joeyli
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=20160722124141.GI12939@linux-rxt1.site \
--to=jlee@suse.com \
--cc=dan.j.williams@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-nvdimm@lists.01.org \
--cc=vishal.l.verma@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 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.