Re: [PATCH] cxl/pmem: Format nvdimm serial numbers as decimal
Dave Jiang <[email protected]> Fri, 24 Jul 2026 13:19:56 -0700
| Newsgroups | org.kernel.vger.linux-cxl,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
On 7/24/26 12:12 PM, Dave Jiang wrote: > > > On 6/18/26 10:59 PM, Alison Schofield wrote: >> The CXL NVDIMM security passphrase key is looked up by the description >> "nvdimm:" followed by the device serial string. For serial numbers of >> 10 and above, the kernel auto-unlock path fails to find the key >> because ndctl names it with a decimal serial and the kernel uses hex. >> >> That means a passphrase-protected device cannot be unlocked after a >> reboot, and the pmem namespaces it backs do not come up. Devices >> without an enrolled passphrase are unaffected. >> >> The mismatch occurs for any serial number of 10 and above. Since CXL >> device serial numbers are vendor-assigned 64-bit values, that covers >> essentially all real hardware once security is enabled. >> >> The 'id' sysfs attribute is established ABI that ndctl consumes as >> decimal, so format the kernel's serial string the same way. A u64 >> decimal string requires up to 20 digits plus a NUL byte, so grow >> CXL_DEV_ID_LEN to fit it. >> >> The issue was exposed by CXL unit test cxl-security.sh when cxl_test >> mock serial numbers were recently extended to 10 and above. >> >> Cc: <[email protected]> >> Fixes: b5807c80b5bc ("cxl: add dimm_id support for __nvdimm_create()") >> Signed-off-by: Alison Schofield <[email protected]> > > Applied to cxl/next > 2a77c0818e05 > Backed out per request from Alison. There will be a v3. >> --- >> drivers/cxl/core/pmem.c | 10 ++++++---- >> drivers/cxl/cxl.h | 3 ++- >> 2 files changed, 8 insertions(+), 5 deletions(-) >> >> diff --git a/drivers/cxl/core/pmem.c b/drivers/cxl/core/pmem.c >> index 68462e38a977..2ccdf04c1f43 100644 >> --- a/drivers/cxl/core/pmem.c >> +++ b/drivers/cxl/core/pmem.c >> @@ -219,12 +219,14 @@ static struct cxl_nvdimm *cxl_nvdimm_alloc(struct cxl_nvdimm_bridge *cxl_nvb, >> dev->bus = &cxl_bus_type; >> dev->type = &cxl_nvdimm_type; >> /* >> - * A "%llx" string is 17-bytes vs dimm_id that is max >> - * NVDIMM_KEY_DESC_LEN >> + * dev_id becomes the nvdimm dimm_id used for security key >> + * lookups. Match the decimal serial emitted by the CXL 'id' >> + * sysfs attribute. A u64 decimal string requires 20 digits >> + * plus a NUL byte and must still fit in NVDIMM_KEY_DESC_LEN. >> */ >> - BUILD_BUG_ON(sizeof(cxl_nvd->dev_id) < 17 || >> + BUILD_BUG_ON(sizeof(cxl_nvd->dev_id) < 21 || >> sizeof(cxl_nvd->dev_id) > NVDIMM_KEY_DESC_LEN); >> - sprintf(cxl_nvd->dev_id, "%llx", cxlmd->cxlds->serial); >> + sprintf(cxl_nvd->dev_id, "%lld", cxlmd->cxlds->serial); >> >> return cxl_nvd; >> } >> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h >> index 1297594beaec..3463faeb8a15 100644 >> --- a/drivers/cxl/cxl.h >> +++ b/drivers/cxl/cxl.h >> @@ -487,7 +487,8 @@ struct cxl_nvdimm_bridge { >> struct nvdimm_bus_descriptor nd_desc; >> }; >> >> -#define CXL_DEV_ID_LEN 19 >> +/* Holds a u64 serial as a decimal string: up to 20 digits + NUL */ >> +#define CXL_DEV_ID_LEN 21 >> >> enum { >> CXL_NVD_F_INVALIDATED = 0, >> >> base-commit: 8cd9520d35a6c38db6567e97dd93b1f11f185dc6 > >