2018-08-03 09:42:17

by Ocean He

[permalink] [raw]
Subject: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at startup

From: Ocean He <[email protected]>

In the beginning of acpi_nfit_add, if fail to find NFIT table then should
return -ENODEV, instead of 0.

Signed-off-by: Ocean He <[email protected]>
---
drivers/acpi/nfit/core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 7c47900..1790d7c 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -3355,7 +3355,7 @@ static int acpi_nfit_add(struct acpi_device *adev)
if (ACPI_FAILURE(status)) {
/* This is ok, we could have an nvdimm hotplugged later */
dev_dbg(dev, "failed to find NFIT at startup\n");
- return 0;
+ return -ENODEV;
}

rc = devm_add_action_or_reset(dev, acpi_nfit_put_table, tbl);
--
1.8.3.1



2018-08-03 09:45:41

by Johannes Thumshirn

[permalink] [raw]
Subject: Re: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at startup

Looks good,
Reviewed-by: Johannes Thumshirn <[email protected]>
--
Johannes Thumshirn Storage
[email protected] +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N?rnberg
GF: Felix Imend?rffer, Jane Smithard, Graham Norton
HRB 21284 (AG N?rnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

2018-08-03 17:12:57

by Vishal Verma

[permalink] [raw]
Subject: Re: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at startup


On Fri, 2018-08-03 at 05:39 -0400, Ocean He wrote:
> From: Ocean He <[email protected]>
>
> In the beginning of acpi_nfit_add, if fail to find NFIT table then
> should
> return -ENODEV, instead of 0.
>
> Signed-off-by: Ocean He <[email protected]>
> ---
> drivers/acpi/nfit/core.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
> index 7c47900..1790d7c 100644
> --- a/drivers/acpi/nfit/core.c
> +++ b/drivers/acpi/nfit/core.c
> @@ -3355,7 +3355,7 @@ static int acpi_nfit_add(struct acpi_device
> *adev)
> if (ACPI_FAILURE(status)) {
> /* This is ok, we could have an nvdimm hotplugged
> later */
> dev_dbg(dev, "failed to find NFIT at startup\n");
> - return 0;
> + return -ENODEV;

Hm, the comment directly above this says this is ok..
Has this caused any problems in practice?

> }
>
> rc = devm_add_action_or_reset(dev, acpi_nfit_put_table,
> tbl);

2018-08-06 07:16:47

by Ocean HY1 He

[permalink] [raw]
Subject: RE: [External] Re: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at startup



> -----Original Message-----
> From: Verma, Vishal L <[email protected]>
> Sent: Saturday, August 04, 2018 1:12 AM
> To: Williams, Dan J <[email protected]>; [email protected];
> [email protected]; Jiang, Dave <[email protected]>; [email protected];
> [email protected]
> Cc: [email protected]; [email protected]; linux-
> [email protected]; Ocean HY1 He <[email protected]>
> Subject: [External] Re: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at
> startup
>
>
> On Fri, 2018-08-03 at 05:39 -0400, Ocean He wrote:
> > From: Ocean He <[email protected]>
> >
> > In the beginning of acpi_nfit_add, if fail to find NFIT table then
> > should
> > return -ENODEV, instead of 0.
> >
> > Signed-off-by: Ocean He <[email protected]>
> > ---
> > drivers/acpi/nfit/core.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
> > index 7c47900..1790d7c 100644
> > --- a/drivers/acpi/nfit/core.c
> > +++ b/drivers/acpi/nfit/core.c
> > @@ -3355,7 +3355,7 @@ static int acpi_nfit_add(struct acpi_device
> > *adev)
> > if (ACPI_FAILURE(status)) {
> > /* This is ok, we could have an nvdimm hotplugged
> > later */
> > dev_dbg(dev, "failed to find NFIT at startup\n");
> > - return 0;
> > + return -ENODEV;
>
> Hm, the comment directly above this says this is ok..
> Has this caused any problems in practice?
>
Thanks for your comments. After going through related codes and some test, I am
now thinking it's right to keep "return 0" if NFIT not found at boot time.

Per chapter 9.20.2 NVDIMM Root Device in ACPI 6.2 spec:
The NVDIMM root device is represented by an ACPI namespace device with a _HID
of "ACPI0012". This device allows the OS to trigger enumeration of NVDIMMs
through NFIT at boot time and re-enumeration at root level via the _FIT method
during runtime.

The acpi_nfit_driver is registered to ACPI bus to support "ACPI0012".
The acpi_nfit_driver.acpi_nfit_add is used to enumerate NVDIMMs through NFIT
at boot time; The acpi_nfit_driver.acpi_nfit_notify is used to enumerate
NVDIMMs during runtime.

In my Lenovo ThinkSystem SR630 which support NVDIMMs, If I remove
all NVDIMMs, the NFIT table is gone after system boot up. If keep "return 0"
in acpi_nfit_add, then acpi_nfit_driver would still be attached to "ACPI0012".
Once a NVDIMM is hotplugged into system during runtime, then
acpi_nfit_driver.acpi_nfit_notify can be called to enumerate NVDIMMs (I could
not do hotplug test because firmware doesn't support).
Otherwise, "return -ENODEV" would block NVDIMM enumeration during runtime.

How do you think to adjust annotation as following?

diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 7c47900..1673161 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -3353,7 +3353,13 @@ static int acpi_nfit_add(struct acpi_device *adev)

status = acpi_get_table(ACPI_SIG_NFIT, 0, &tbl);
if (ACPI_FAILURE(status)) {
- /* This is ok, we could have an nvdimm hotplugged later */
+ /* The NVDIMM root device allows OS to trigger enumeration of
+ * NVDIMMs through NFIT at boot time and re-enumeration at
+ * root level via the _FIT method during runtime.
+ * This is ok to return 0 here, we could have an nvdimm
+ * hotplugged later and evaluate _FIT method which returns
+ * data in the format of a series of NFIT Structures.
+ */
dev_dbg(dev, "failed to find NFIT at startup\n");
return 0;
}

Ocean.

> > }
> >
> > rc = devm_add_action_or_reset(dev, acpi_nfit_put_table,
> > tbl);

2018-08-06 18:09:10

by Vishal Verma

[permalink] [raw]
Subject: Re: [External] Re: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at startup

On Mon, 2018-08-06 at 07:15 +0000, Ocean HY1 He wrote:
> > -----Original Message-----
> > From: Verma, Vishal L <[email protected]>
> > Sent: Saturday, August 04, 2018 1:12 AM
> > To: Williams, Dan J <[email protected]>; [email protected];
> > [email protected]; Jiang, Dave <[email protected]>; [email protected];
> > [email protected]
> > Cc: [email protected]; [email protected]; linux-
> > [email protected]; Ocean HY1 He <[email protected]>
> > Subject: [External] Re: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at
> > startup
> >
> >
> > On Fri, 2018-08-03 at 05:39 -0400, Ocean He wrote:
> > > From: Ocean He <[email protected]>
> > >
> > > In the beginning of acpi_nfit_add, if fail to find NFIT table then
> > > should
> > > return -ENODEV, instead of 0.
> > >
> > > Signed-off-by: Ocean He <[email protected]>
> > > ---
> > > drivers/acpi/nfit/core.c | 2 +-
> > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
> > > index 7c47900..1790d7c 100644
> > > --- a/drivers/acpi/nfit/core.c
> > > +++ b/drivers/acpi/nfit/core.c
> > > @@ -3355,7 +3355,7 @@ static int acpi_nfit_add(struct acpi_device
> > > *adev)
> > > if (ACPI_FAILURE(status)) {
> > > /* This is ok, we could have an nvdimm hotplugged
> > > later */
> > > dev_dbg(dev, "failed to find NFIT at startup\n");
> > > - return 0;
> > > + return -ENODEV;
> >
> > Hm, the comment directly above this says this is ok..
> > Has this caused any problems in practice?
> >
>
> Thanks for your comments. After going through related codes and some test, I am
> now thinking it's right to keep "return 0" if NFIT not found at boot time.
>
> Per chapter 9.20.2 NVDIMM Root Device in ACPI 6.2 spec:
> The NVDIMM root device is represented by an ACPI namespace device with a _HID
> of "ACPI0012". This device allows the OS to trigger enumeration of NVDIMMs
> through NFIT at boot time and re-enumeration at root level via the _FIT method
> during runtime.
>
> The acpi_nfit_driver is registered to ACPI bus to support "ACPI0012".
> The acpi_nfit_driver.acpi_nfit_add is used to enumerate NVDIMMs through NFIT
> at boot time; The acpi_nfit_driver.acpi_nfit_notify is used to enumerate
> NVDIMMs during runtime.
>
> In my Lenovo ThinkSystem SR630 which support NVDIMMs, If I remove
> all NVDIMMs, the NFIT table is gone after system boot up. If keep "return 0"
> in acpi_nfit_add, then acpi_nfit_driver would still be attached to "ACPI0012".
> Once a NVDIMM is hotplugged into system during runtime, then
> acpi_nfit_driver.acpi_nfit_notify can be called to enumerate NVDIMMs (I could
> not do hotplug test because firmware doesn't support).
> Otherwise, "return -ENODEV" would block NVDIMM enumeration during runtime.
>
> How do you think to adjust annotation as following?
>
> diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
> index 7c47900..1673161 100644
> --- a/drivers/acpi/nfit/core.c
> +++ b/drivers/acpi/nfit/core.c
> @@ -3353,7 +3353,13 @@ static int acpi_nfit_add(struct acpi_device *adev)
>
> status = acpi_get_table(ACPI_SIG_NFIT, 0, &tbl);
> if (ACPI_FAILURE(status)) {
> - /* This is ok, we could have an nvdimm hotplugged later */
> + /* The NVDIMM root device allows OS to trigger enumeration of
> + * NVDIMMs through NFIT at boot time and re-enumeration at
> + * root level via the _FIT method during runtime.
> + * This is ok to return 0 here, we could have an nvdimm
> + * hotplugged later and evaluate _FIT method which returns
> + * data in the format of a series of NFIT Structures.
> + */
> dev_dbg(dev, "failed to find NFIT at startup\n");
> return 0;
> }

Yes, this sounds reasonable to me.

Thanks,
-Vishal

>
> Ocean.
>
> > > }
> > >
> > > rc = devm_add_action_or_reset(dev, acpi_nfit_put_table,
> > > tbl);