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
> 
>