Linux CXL
 help / color / mirror / Atom feed
* [PATCH v2 0/4] cxl: Prep for QoS class support
@ 2023-05-11 17:58 Dave Jiang
  2023-05-11 17:58 ` [PATCH v2 1/4] cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute Dave Jiang
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Dave Jiang @ 2023-05-11 17:58 UTC (permalink / raw)
  To: linux-cxl
  Cc: Ira Weiny, Jonathan Cameron, Davidlohr Bueso, dan.j.williams,
	ira.weiny, vishal.l.verma, alison.schofield

v2:
- Set cdat.table at the end to keep consistency. (Davidlohr)
- Split out error return for cdat_read(). (Davidlohr)

With the "cxl: Add support for QTG ID retrieval for CXL subsystem" series
getting larger and larger and span multiple maintainers, I'm going to try
to break them up into smaller parts. These 3 patches are just preparation
for QTG retrieval. Full git branch available at [1].

[1]: https://git.kernel.org/pub/scm/linux/kernel/git/djiang/linux.git/log/?h=cxl-qtg
---

Dave Jiang (4):
      cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute
      cxl: Add missing return to cdat read error path
      cxl: Add checksum verification to CDAT from CXL
      cxl: Add support for reading CXL switch CDAT table


 Documentation/ABI/testing/sysfs-bus-cxl | 15 +++++++++
 drivers/cxl/acpi.c                      |  3 ++
 drivers/cxl/core/pci.c                  | 43 +++++++++++++++++++++----
 drivers/cxl/core/port.c                 | 11 +++++++
 drivers/cxl/cxl.h                       |  3 ++
 drivers/cxl/port.c                      |  3 ++
 6 files changed, 72 insertions(+), 6 deletions(-)

--


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 1/4] cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute
  2023-05-11 17:58 [PATCH v2 0/4] cxl: Prep for QoS class support Dave Jiang
@ 2023-05-11 17:58 ` Dave Jiang
  2023-05-11 23:56   ` Dan Williams
  2023-05-11 17:58 ` [PATCH v2 2/4] cxl: add missing return to cdat read error path Dave Jiang
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Dave Jiang @ 2023-05-11 17:58 UTC (permalink / raw)
  To: linux-cxl
  Cc: Davidlohr Bueso, Ira Weiny, Jonathan Cameron, dan.j.williams,
	ira.weiny, vishal.l.verma, alison.schofield

Export the QoS Throttling Group ID from the CXL Fixed Memory Window
Structure (CFMWS) under the root decoder sysfs attributes as qos_class.

CXL rev3.0 9.17.1.3 CXL Fixed Memory Window Structure (CFMWS)

cxl cli will use this id to match with the _DSM retrieved id for a
hot-plugged CXL memory device DPA memory range to make sure that the
DPA range is under the right CFMWS window.

Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>

---
v5:
- Documentation rewrite. (Dan)
- Rename attrib to qos_class
- Move qtg_id to root decoder
v4:
- Change kernel version for documentation to v6.5
v2:
- Add explanation commit header (Jonathan)
---
 Documentation/ABI/testing/sysfs-bus-cxl |   15 +++++++++++++++
 drivers/cxl/acpi.c                      |    3 +++
 drivers/cxl/core/port.c                 |   11 +++++++++++
 drivers/cxl/cxl.h                       |    3 +++
 4 files changed, 32 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
index 3acf2f17a73f..2f24e42ef36d 100644
--- a/Documentation/ABI/testing/sysfs-bus-cxl
+++ b/Documentation/ABI/testing/sysfs-bus-cxl
@@ -310,6 +310,21 @@ Description:
 		provided it is currently idle / not bound to a driver.
 
 
+What:		/sys/bus/cxl/devices/decoderX.Y/qos_class
+Date:		May, 2023
+KernelVersion:	v6.5
+Contact:	linux-cxl@vger.kernel.org
+Description:
+		(RO) For CXL host platforms that support "QoS Telemmetry" this
+		root-decoder-only attribute conveys a platform specific cookie
+		that identifies a QoS performance class for the CXL Window.
+		This class-id can be compared against a similar "qos_class"
+		published for each memory-type that an endpoint supports. While
+		it is not required that endpoints map their local memory-class
+		to a matching platform class, mismatches are not recommended and
+		there are platform specific side-effects that may result.
+
+
 What:		/sys/bus/cxl/devices/regionZ/uuid
 Date:		May, 2022
 KernelVersion:	v6.0
diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c
index 7e1765b09e04..e063df2bf876 100644
--- a/drivers/cxl/acpi.c
+++ b/drivers/cxl/acpi.c
@@ -289,6 +289,9 @@ static int cxl_parse_cfmws(union acpi_subtable_headers *header, void *arg,
 			}
 		}
 	}
+
+	cxlrd->qos_class = cfmws->qtg_id;
+
 	rc = cxl_decoder_add(cxld, target_map);
 err_xormap:
 	if (rc)
diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index 4d1f9c5b5029..a0130aeb8d42 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -276,6 +276,15 @@ static ssize_t interleave_ways_show(struct device *dev,
 
 static DEVICE_ATTR_RO(interleave_ways);
 
+static ssize_t qos_class_show(struct device *dev,
+			      struct device_attribute *attr, char *buf)
+{
+	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
+
+	return sysfs_emit(buf, "%d\n", cxlrd->qos_class);
+}
+static DEVICE_ATTR_RO(qos_class);
+
 static struct attribute *cxl_decoder_base_attrs[] = {
 	&dev_attr_start.attr,
 	&dev_attr_size.attr,
@@ -295,6 +304,7 @@ static struct attribute *cxl_decoder_root_attrs[] = {
 	&dev_attr_cap_type2.attr,
 	&dev_attr_cap_type3.attr,
 	&dev_attr_target_list.attr,
+	&dev_attr_qos_class.attr,
 	SET_CXL_REGION_ATTR(create_pmem_region)
 	SET_CXL_REGION_ATTR(create_ram_region)
 	SET_CXL_REGION_ATTR(delete_region)
@@ -1625,6 +1635,7 @@ struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port,
 	}
 
 	atomic_set(&cxlrd->region_id, rc);
+	cxlrd->qos_class = CXL_QOS_CLASS_INVALID;
 	return cxlrd;
 }
 EXPORT_SYMBOL_NS_GPL(cxl_root_decoder_alloc, CXL);
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 044a92d9813e..4577d808ac6d 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -300,6 +300,7 @@ enum cxl_decoder_type {
  */
 #define CXL_DECODER_MAX_INTERLEAVE 16
 
+#define CXL_QOS_CLASS_INVALID -1
 
 /**
  * struct cxl_decoder - Common CXL HDM Decoder Attributes
@@ -411,6 +412,7 @@ typedef struct cxl_dport *(*cxl_calc_hb_fn)(struct cxl_root_decoder *cxlrd,
  * @calc_hb: which host bridge covers the n'th position by granularity
  * @platform_data: platform specific configuration data
  * @range_lock: sync region autodiscovery by address range
+ * @qos_class: QoS performance class cookie
  * @cxlsd: base cxl switch decoder
  */
 struct cxl_root_decoder {
@@ -419,6 +421,7 @@ struct cxl_root_decoder {
 	cxl_calc_hb_fn calc_hb;
 	void *platform_data;
 	struct mutex range_lock;
+	int qos_class;
 	struct cxl_switch_decoder cxlsd;
 };
 



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 2/4] cxl: add missing return to cdat read error path
  2023-05-11 17:58 [PATCH v2 0/4] cxl: Prep for QoS class support Dave Jiang
  2023-05-11 17:58 ` [PATCH v2 1/4] cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute Dave Jiang
@ 2023-05-11 17:58 ` Dave Jiang
  2023-05-11 23:59   ` Dan Williams
  2023-05-11 17:59 ` [PATCH v2 3/4] cxl: Add checksum verification to CDAT from CXL Dave Jiang
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Dave Jiang @ 2023-05-11 17:58 UTC (permalink / raw)
  To: linux-cxl; +Cc: dan.j.williams, ira.weiny, vishal.l.verma, alison.schofield

Add a return to the error path when cxl_cdat_read_table() fails. Current
code continues with the table pointer points to freed memory.

Fixes: 4f8a8f10c2f5 ("cxl/pci: Simplify CDAT retrieval error path")
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
 drivers/cxl/core/pci.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index bdbd907884ce..f332fe7af92b 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -571,6 +571,7 @@ void read_cdat_data(struct cxl_port *port)
 		/* Don't leave table data allocated on error */
 		devm_kfree(dev, cdat_table);
 		dev_err(dev, "CDAT data read error\n");
+		return;
 	}
 
 	port->cdat.table = cdat_table + sizeof(__le32);



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 3/4] cxl: Add checksum verification to CDAT from CXL
  2023-05-11 17:58 [PATCH v2 0/4] cxl: Prep for QoS class support Dave Jiang
  2023-05-11 17:58 ` [PATCH v2 1/4] cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute Dave Jiang
  2023-05-11 17:58 ` [PATCH v2 2/4] cxl: add missing return to cdat read error path Dave Jiang
@ 2023-05-11 17:59 ` Dave Jiang
  2023-05-12 21:38   ` Dan Williams
  2023-05-11 17:59 ` [PATCH v2 4/4] cxl: Add support for reading CXL switch CDAT table Dave Jiang
  2023-05-12 19:00 ` [PATCH v2 0/4] cxl: Prep for QoS class support Davidlohr Bueso
  4 siblings, 1 reply; 12+ messages in thread
From: Dave Jiang @ 2023-05-11 17:59 UTC (permalink / raw)
  To: linux-cxl
  Cc: Ira Weiny, Jonathan Cameron, dan.j.williams, ira.weiny,
	vishal.l.verma, alison.schofield

A CDAT table is available from a CXL device. The table is read by the
driver and cached in software. With the CXL subsystem needing to parse the
CDAT table, the checksum should be verified. Add checksum verification
after the CDAT table is read from device.

Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>

---
Post patch series split:
v2:
- Split out fix for cdat_read() error path return. (Davidlohr)
- Make port->cdat consistent. (Davidlohr)

___
v5:
- Return on CDAT errors. (Dan)
v3:
- Just return the final sum. (Alison)
v2:
- Drop ACPI checksum export and just use local verification. (Dan)
---
 drivers/cxl/core/pci.c |   20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index f332fe7af92b..64ae45ae7ad6 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -528,6 +528,16 @@ static int cxl_cdat_read_table(struct device *dev,
 	return 0;
 }
 
+static unsigned char cdat_checksum(void *buf, size_t size)
+{
+	unsigned char sum, *data = buf;
+	size_t i;
+
+	for (sum = 0, i = 0; i < size; i++)
+		sum += data[i];
+	return sum;
+}
+
 /**
  * read_cdat_data - Read the CDAT data on this port
  * @port: Port to read data from
@@ -574,7 +584,15 @@ void read_cdat_data(struct cxl_port *port)
 		return;
 	}
 
-	port->cdat.table = cdat_table + sizeof(__le32);
+	cdat_table = cdat_table + sizeof(__le32);
+	if (cdat_checksum(cdat_table, cdat_length)) {
+		/* Don't leave table data allocated on error */
+		devm_kfree(dev, cdat_table);
+		dev_err(dev, "CDAT data checksum error\n");
+		return;
+	}
+
+	port->cdat.table = cdat_table;
 	port->cdat.length = cdat_length;
 }
 EXPORT_SYMBOL_NS_GPL(read_cdat_data, CXL);



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 4/4] cxl: Add support for reading CXL switch CDAT table
  2023-05-11 17:58 [PATCH v2 0/4] cxl: Prep for QoS class support Dave Jiang
                   ` (2 preceding siblings ...)
  2023-05-11 17:59 ` [PATCH v2 3/4] cxl: Add checksum verification to CDAT from CXL Dave Jiang
@ 2023-05-11 17:59 ` Dave Jiang
  2023-05-12 21:39   ` Dan Williams
  2023-05-12 19:00 ` [PATCH v2 0/4] cxl: Prep for QoS class support Davidlohr Bueso
  4 siblings, 1 reply; 12+ messages in thread
From: Dave Jiang @ 2023-05-11 17:59 UTC (permalink / raw)
  To: linux-cxl
  Cc: Davidlohr Bueso, Ira Weiny, Jonathan Cameron, dan.j.williams,
	ira.weiny, vishal.l.verma, alison.schofield

Add read_cdat_data() call in cxl_switch_port_probe() to allow
reading of CDAT data for CXL switches. read_cdat_data() needs
to be adjusted for the retrieving of the PCIe device depending
on if the passed in port is endpoint or switch.

Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>

---
v2:
- Set pdev to NULL first (Davidlohr)

Before split:
v5:
- Rebase after fix [1]. (Dan)

[1]: http://lore.kernel.org/r/168213190748.708404.16215095414060364800.stgit@dwillia2-xfh.jf.intel.com
v4:
- Remove cxl_test wrapper. (Ira)
---
 drivers/cxl/core/pci.c |   22 +++++++++++++++++-----
 drivers/cxl/port.c     |    3 +++
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index 64ae45ae7ad6..58051154ab1a 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -546,18 +546,30 @@ static unsigned char cdat_checksum(void *buf, size_t size)
  */
 void read_cdat_data(struct cxl_port *port)
 {
-	struct cxl_memdev *cxlmd = to_cxl_memdev(port->uport);
-	struct device *host = cxlmd->dev.parent;
+	struct device *uport = port->uport;
 	struct device *dev = &port->dev;
 	struct pci_doe_mb *cdat_doe;
+	struct pci_dev *pdev = NULL;
+	struct cxl_memdev *cxlmd;
 	size_t cdat_length;
 	void *cdat_table;
 	int rc;
 
-	if (!dev_is_pci(host))
+	if (is_cxl_memdev(uport)) {
+		struct device *host;
+
+		cxlmd = to_cxl_memdev(uport);
+		host = cxlmd->dev.parent;
+		if (dev_is_pci(host))
+			pdev = to_pci_dev(host);
+	} else if (dev_is_pci(uport)) {
+		pdev = to_pci_dev(uport);
+	}
+
+	if (!pdev)
 		return;
-	cdat_doe = pci_find_doe_mailbox(to_pci_dev(host),
-					PCI_DVSEC_VENDOR_ID_CXL,
+
+	cdat_doe = pci_find_doe_mailbox(pdev, PCI_DVSEC_VENDOR_ID_CXL,
 					CXL_DOE_PROTOCOL_TABLE_ACCESS);
 	if (!cdat_doe) {
 		dev_dbg(dev, "No CDAT mailbox\n");
diff --git a/drivers/cxl/port.c b/drivers/cxl/port.c
index 22a7ab2bae7c..a49f5eb149f1 100644
--- a/drivers/cxl/port.c
+++ b/drivers/cxl/port.c
@@ -62,6 +62,9 @@ static int cxl_switch_port_probe(struct cxl_port *port)
 	struct cxl_hdm *cxlhdm;
 	int rc;
 
+	/* Cache the data early to ensure is_visible() works */
+	read_cdat_data(port);
+
 	rc = devm_cxl_port_enumerate_dports(port);
 	if (rc < 0)
 		return rc;



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* RE: [PATCH v2 1/4] cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute
  2023-05-11 17:58 ` [PATCH v2 1/4] cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute Dave Jiang
@ 2023-05-11 23:56   ` Dan Williams
  0 siblings, 0 replies; 12+ messages in thread
From: Dan Williams @ 2023-05-11 23:56 UTC (permalink / raw)
  To: Dave Jiang, linux-cxl
  Cc: Davidlohr Bueso, Ira Weiny, Jonathan Cameron, dan.j.williams,
	vishal.l.verma, alison.schofield

Dave Jiang wrote:
> Export the QoS Throttling Group ID from the CXL Fixed Memory Window
> Structure (CFMWS) under the root decoder sysfs attributes as qos_class.
> 
> CXL rev3.0 9.17.1.3 CXL Fixed Memory Window Structure (CFMWS)
> 
> cxl cli will use this id to match with the _DSM retrieved id for a
> hot-plugged CXL memory device DPA memory range to make sure that the
> DPA range is under the right CFMWS window.
> 
> Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
> Reviewed-by: Ira Weiny <ira.weiny@intel.com>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>

Looks good to me.

Will apply to a for-6.5/cxl-qos-class topic branch.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v2 2/4] cxl: add missing return to cdat read error path
  2023-05-11 17:58 ` [PATCH v2 2/4] cxl: add missing return to cdat read error path Dave Jiang
@ 2023-05-11 23:59   ` Dan Williams
  2023-05-15 10:03     ` Jonathan Cameron
  0 siblings, 1 reply; 12+ messages in thread
From: Dan Williams @ 2023-05-11 23:59 UTC (permalink / raw)
  To: Dave Jiang, linux-cxl
  Cc: dan.j.williams, ira.weiny, vishal.l.verma, alison.schofield

Dave Jiang wrote:
> Add a return to the error path when cxl_cdat_read_table() fails. Current
> code continues with the table pointer points to freed memory.

Yikes, at least the attribute is BIN_ATTR_ADMIN_RO(), but still bad.
Will mark this as an urgent fix.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 0/4] cxl: Prep for QoS class support
  2023-05-11 17:58 [PATCH v2 0/4] cxl: Prep for QoS class support Dave Jiang
                   ` (3 preceding siblings ...)
  2023-05-11 17:59 ` [PATCH v2 4/4] cxl: Add support for reading CXL switch CDAT table Dave Jiang
@ 2023-05-12 19:00 ` Davidlohr Bueso
  4 siblings, 0 replies; 12+ messages in thread
From: Davidlohr Bueso @ 2023-05-12 19:00 UTC (permalink / raw)
  To: Dave Jiang
  Cc: linux-cxl, Ira Weiny, Jonathan Cameron, dan.j.williams,
	vishal.l.verma, alison.schofield

On Thu, 11 May 2023, Dave Jiang wrote:

>v2:
>- Set cdat.table at the end to keep consistency. (Davidlohr)
>- Split out error return for cdat_read(). (Davidlohr)

For the other two patches in the series:

Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v2 3/4] cxl: Add checksum verification to CDAT from CXL
  2023-05-11 17:59 ` [PATCH v2 3/4] cxl: Add checksum verification to CDAT from CXL Dave Jiang
@ 2023-05-12 21:38   ` Dan Williams
  2023-05-12 22:01     ` [PATCH v3] " Dave Jiang
  0 siblings, 1 reply; 12+ messages in thread
From: Dan Williams @ 2023-05-12 21:38 UTC (permalink / raw)
  To: Dave Jiang, linux-cxl
  Cc: Ira Weiny, Jonathan Cameron, dan.j.williams, vishal.l.verma,
	alison.schofield

Dave Jiang wrote:
> A CDAT table is available from a CXL device. The table is read by the
> driver and cached in software. With the CXL subsystem needing to parse the
> CDAT table, the checksum should be verified. Add checksum verification
> after the CDAT table is read from device.
> 
> Reviewed-by: Ira Weiny <ira.weiny@intel.com>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
> 
> ---
> Post patch series split:
> v2:
> - Split out fix for cdat_read() error path return. (Davidlohr)
> - Make port->cdat consistent. (Davidlohr)
> 
> ___
> v5:
> - Return on CDAT errors. (Dan)
> v3:
> - Just return the final sum. (Alison)
> v2:
> - Drop ACPI checksum export and just use local verification. (Dan)
> ---
>  drivers/cxl/core/pci.c |   20 +++++++++++++++++++-
>  1 file changed, 19 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
> index f332fe7af92b..64ae45ae7ad6 100644
> --- a/drivers/cxl/core/pci.c
> +++ b/drivers/cxl/core/pci.c
> @@ -528,6 +528,16 @@ static int cxl_cdat_read_table(struct device *dev,
>  	return 0;
>  }
>  
> +static unsigned char cdat_checksum(void *buf, size_t size)
> +{
> +	unsigned char sum, *data = buf;
> +	size_t i;
> +
> +	for (sum = 0, i = 0; i < size; i++)
> +		sum += data[i];
> +	return sum;
> +}
> +
>  /**
>   * read_cdat_data - Read the CDAT data on this port
>   * @port: Port to read data from
> @@ -574,7 +584,15 @@ void read_cdat_data(struct cxl_port *port)
>  		return;
>  	}
>  
> -	port->cdat.table = cdat_table + sizeof(__le32);
> +	cdat_table = cdat_table + sizeof(__le32);
> +	if (cdat_checksum(cdat_table, cdat_length)) {
> +		/* Don't leave table data allocated on error */
> +		devm_kfree(dev, cdat_table);
> +		dev_err(dev, "CDAT data checksum error\n");
> +		return;

Rather than duplicate this pattern I would switch to a "goto err"
arrangement:

err:
	devm_kfree(dev, cdat_table);
	dev_err(dev, "failed to read/validate CDAT\n");

...then you also don't need the "return" statement. The error message
nuance of "failed to read" vs "failed to checksum" does not really need
separate error statements, the result is the same.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v2 4/4] cxl: Add support for reading CXL switch CDAT table
  2023-05-11 17:59 ` [PATCH v2 4/4] cxl: Add support for reading CXL switch CDAT table Dave Jiang
@ 2023-05-12 21:39   ` Dan Williams
  0 siblings, 0 replies; 12+ messages in thread
From: Dan Williams @ 2023-05-12 21:39 UTC (permalink / raw)
  To: Dave Jiang, linux-cxl
  Cc: Davidlohr Bueso, Ira Weiny, Jonathan Cameron, dan.j.williams,
	vishal.l.verma, alison.schofield

Dave Jiang wrote:
> Add read_cdat_data() call in cxl_switch_port_probe() to allow
> reading of CDAT data for CXL switches. read_cdat_data() needs
> to be adjusted for the retrieving of the PCIe device depending
> on if the passed in port is endpoint or switch.
> 
> Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
> Reviewed-by: Ira Weiny <ira.weiny@intel.com>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>

Looks good.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3] cxl: Add checksum verification to CDAT from CXL
  2023-05-12 21:38   ` Dan Williams
@ 2023-05-12 22:01     ` Dave Jiang
  0 siblings, 0 replies; 12+ messages in thread
From: Dave Jiang @ 2023-05-12 22:01 UTC (permalink / raw)
  To: dan.j.willimans; +Cc: Ira Weiny, Jonathan Cameron, Davidlohr Bueso, linux-cxl

A CDAT table is available from a CXL device. The table is read by the
driver and cached in software. With the CXL subsystem needing to parse the
CDAT table, the checksum should be verified. Add checksum verification
after the CDAT table is read from device.

Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>

---
Post patch series split:
v3:
- Use single error out path. (Dan)
v2:
- Split out fix for cdat_read() error path return. (Davidlohr)
- Make port->cdat consistent. (Davidlohr)

___
v5:
- Return on CDAT errors. (Dan)
v3:
- Just return the final sum. (Alison)
v2:
- Drop ACPI checksum export and just use local verification. (Dan)
---
 drivers/cxl/core/pci.c |   30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index f332fe7af92b..103c27f5e2a9 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -528,6 +528,16 @@ static int cxl_cdat_read_table(struct device *dev,
 	return 0;
 }
 
+static unsigned char cdat_checksum(void *buf, size_t size)
+{
+	unsigned char sum, *data = buf;
+	size_t i;
+
+	for (sum = 0, i = 0; i < size; i++)
+		sum += data[i];
+	return sum;
+}
+
 /**
  * read_cdat_data - Read the CDAT data on this port
  * @port: Port to read data from
@@ -567,15 +577,21 @@ void read_cdat_data(struct cxl_port *port)
 		return;
 
 	rc = cxl_cdat_read_table(dev, cdat_doe, cdat_table, &cdat_length);
-	if (rc) {
-		/* Don't leave table data allocated on error */
-		devm_kfree(dev, cdat_table);
-		dev_err(dev, "CDAT data read error\n");
-		return;
-	}
+	if (rc)
+		goto err;
 
-	port->cdat.table = cdat_table + sizeof(__le32);
+	cdat_table = cdat_table + sizeof(__le32);
+	if (cdat_checksum(cdat_table, cdat_length))
+		goto err;
+
+	port->cdat.table = cdat_table;
 	port->cdat.length = cdat_length;
+	return;
+
+err:
+	/* Don't leave table data allocated on error */
+	devm_kfree(dev, cdat_table);
+	dev_err(dev, "Failed to read/validate CDAT.\n");
 }
 EXPORT_SYMBOL_NS_GPL(read_cdat_data, CXL);
 



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 2/4] cxl: add missing return to cdat read error path
  2023-05-11 23:59   ` Dan Williams
@ 2023-05-15 10:03     ` Jonathan Cameron
  0 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2023-05-15 10:03 UTC (permalink / raw)
  To: Dan Williams
  Cc: Dave Jiang, linux-cxl, ira.weiny, vishal.l.verma,
	alison.schofield

On Thu, 11 May 2023 16:59:38 -0700
Dan Williams <dan.j.williams@intel.com> wrote:

> Dave Jiang wrote:
> > Add a return to the error path when cxl_cdat_read_table() fails. Current
> > code continues with the table pointer points to freed memory.  
> 
> Yikes, at least the attribute is BIN_ATTR_ADMIN_RO(), but still bad.
> Will mark this as an urgent fix.

I see it's already gone upstream but fwiw

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

I first thought we were saved because the cdat_length parameter
would be set to 0, but nope, that will have the value from the
earlier cxl_cdat_get_length() so if that succeeds and the later
table readout doesn't we indeed end up in a mess..



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-05-15 10:05 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-11 17:58 [PATCH v2 0/4] cxl: Prep for QoS class support Dave Jiang
2023-05-11 17:58 ` [PATCH v2 1/4] cxl: Export QTG ids from CFMWS to sysfs as qos_class attribute Dave Jiang
2023-05-11 23:56   ` Dan Williams
2023-05-11 17:58 ` [PATCH v2 2/4] cxl: add missing return to cdat read error path Dave Jiang
2023-05-11 23:59   ` Dan Williams
2023-05-15 10:03     ` Jonathan Cameron
2023-05-11 17:59 ` [PATCH v2 3/4] cxl: Add checksum verification to CDAT from CXL Dave Jiang
2023-05-12 21:38   ` Dan Williams
2023-05-12 22:01     ` [PATCH v3] " Dave Jiang
2023-05-11 17:59 ` [PATCH v2 4/4] cxl: Add support for reading CXL switch CDAT table Dave Jiang
2023-05-12 21:39   ` Dan Williams
2023-05-12 19:00 ` [PATCH v2 0/4] cxl: Prep for QoS class support Davidlohr Bueso

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox