Message ID | 168330452895.1986478.7758561874383258080.stgit@djiang5-mobl3 |
---|---|
State | Superseded |
Headers | show |
Series | cxl: Prep for QoS class support | expand |
On Fri, 05 May 2023, Dave Jiang wrote: > /** > * read_cdat_data - Read the CDAT data on this port > * @port: Port to read data from >@@ -571,9 +581,17 @@ 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; Should this be a separate fixlet? > } > > port->cdat.table = cdat_table + sizeof(__le32); >+ if (cdat_checksum(port->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.length = cdat_length; Upon error, port->cdat should remain consistent (only be set after passing the checksum. Ie, wouldn't the following be better? cdat_table += sizeof(__le32); if (cdat_checksum()) { ... } port->cdat.table = cdat_table; port->cdat.length = cdat_length; Thanks, Davidlohr
On 5/5/23 12:15 PM, Davidlohr Bueso wrote: > On Fri, 05 May 2023, Dave Jiang wrote: > >> /** >> * read_cdat_data - Read the CDAT data on this port >> * @port: Port to read data from >> @@ -571,9 +581,17 @@ 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; > > Should this be a separate fixlet? Yeah I can split that out. > >> } >> >> port->cdat.table = cdat_table + sizeof(__le32); >> + if (cdat_checksum(port->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.length = cdat_length; > > Upon error, port->cdat should remain consistent (only be set after > passing the > checksum. Ie, wouldn't the following be better? yup. I'll update. > > cdat_table += sizeof(__le32); > if (cdat_checksum()) { > ... > } > port->cdat.table = cdat_table; > port->cdat.length = cdat_length; > > > Thanks, > Davidlohr
diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c index bdbd907884ce..046e55a9b419 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 @@ -571,9 +581,17 @@ 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); + if (cdat_checksum(port->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.length = cdat_length; } EXPORT_SYMBOL_NS_GPL(read_cdat_data, CXL);