On Tue, 17 Jun 2025 18:07:23 +0100
Jonathan Cameron <[email protected]> wrote:

> On Tue, 17 Jun 2025 18:09:24 +0530
> Neeraj Kumar <[email protected]> wrote:
> 
> Hi Neeraj,
> 
> First a process thing. Looks like threading is broken in your patch set.
> https://lore.kernel.org/linux-cxl/1931444790.41750165203442.JavaMail.epsvc@epcpadp1new/T/#u
> Lore had a go and seems to have figured out there is a thread for the rest.
> If you can't fix it locally for your email, look at using the b4 gateway
> (see the docs for the b4 tool)
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/palmer/b4.git/
> 
> Also, in an RFC the first thing I expect to see if a 'Why this is an RFC 
> statement'
> vs ready for upstream merge.  What are the questions that need comments or
> the blockers you know need to be resolved?
> 
> Anyhow, good to see this. Not an area I'm that familiar with but
> I'll try to take a detailed look a bit later this week.
> 
Whilst I've looked through this series, most of my comments are superficial 
'local'
stuff.  This needs some attention from those more familiar with the persistent 
memory
flows than I am.

Jonathan

> Thanks,
> 
> Jonathan
> 
> 
> > Introduction:
> > =============
> > CXL Persistent Memory (Pmem) devices region, namespace and content must be
> > persistent across system reboot. In order to achieve this persistency, it
> > uses Label Storage Area (LSA) to store respective metadata. During system
> > reboot, stored metadata in LSA is used to bring back the region, namespace
> > and content of CXL device in its previous state.
> > CXL specification provides Get_LSA (4102h) and Set_LSA (4103h) mailbox
> > commands to access the LSA area. nvdimm driver is using same commands to
> > get/set LSA data.
> > 
> > There are three types of LSA format and these are part of following
> > specifications: 
> >  - v1.1: https://pmem.io/documents/NVDIMM_Namespace_Spec.pdf
> >  - v1.2: https://uefi.org/sites/default/files/resources/UEFI_Spec_2_7.pdf
> >  - v2.1: 
> > https://computeexpresslink.org/wp-content/uploads/2024/02/CXL-2.0-Specification.pdf
> > 
> > Basic differences between these LSA formats:
> >  - v1.1: Support Namespace persistency. Size of Namespace Label is 128 bytes
> >  - v1.2: Support Namespace persistency. Size of Namespace Label is 256 bytes
> >  - v2.1: Support Namespace and Region persistency. Size of Namespace and
> >    Region Label is 256 bytes.
> > 
> > Linux nvdimm driver supports only v1.1 and v1.2 LSA format. CXL pmem device
> > require support of LSA v2.1 format for region and namespace persistency.
> > Initial support of LSA 2.1 was add in [1].
> > 
> > This patchset adds support of LSA 2.1 in nvdimm and cxl pmem driver.
> > 
> > Patch 1:     Introduce NDD_CXL_LABEL flag and Update cxl label index as per 
> > v2.1
> > Patch 2-4:   Update namespace label as per v2.1
> > Patch 5-12:  Introduce cxl region labels and modify existing change 
> > accordingly
> > Patch 13:    Refactor cxl pmem region auto assembly
> > Patch 14-18: Save cxl region info in LSA and region recreation during reboot
> > Patch 19:    Segregate out cxl pmem region code from region.c to 
> > pmem_region.c
> > Patch 20:    Introduce cxl region addition/deletion attributes
> > 
> > 
> > Testing:
> > ========
> > In order to test this patchset, I also added the support of LSA v2.1 format
> > in ndctl. ndctl changes are available at [2]. After review, I’ll push in
> > ndctl repo for community review.
> > 
> > 1. Used Qemu using following CXL topology
> >    M2="-object 
> > memory-backend-file,id=cxl-mem1,share=on,mem-path=$TMP_DIR/cxltest.raw,size=512M
> >  \
> >        -object 
> > memory-backend-file,id=cxl-lsa1,share=on,mem-path=$TMP_DIR/lsa.raw,size=1M \
> >        -object 
> > memory-backend-file,id=cxl-mem2,share=on,mem-path=$TMP_DIR/cxltest2.raw,size=512M
> >  \
> >        -object 
> > memory-backend-file,id=cxl-lsa2,share=on,mem-path=$TMP_DIR/lsa2.raw,size=1M 
> > \
> >        -device pxb-cxl,bus_nr=10,bus=pcie.0,id=cxl.1 \
> >        -device cxl-rp,port=1,bus=cxl.1,id=root_port11,chassis=0,slot=1 \
> >        -device 
> > cxl-type3,bus=root_port11,memdev=cxl-mem1,lsa=cxl-lsa1,id=cxl-pmem1,sn=1 \
> >        -device cxl-rp,port=2,bus=cxl.1,id=root_port12,chassis=0,slot=2 \
> >        -device 
> > cxl-type3,bus=root_port12,memdev=cxl-mem2,lsa=cxl-lsa2,id=cxl-pmem2,sn=2 \
> >        -M 
> > cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G,cxl-fmw.0.interleave-granularity=8k"
> > 
> > 2. Create cxl region on both devices
> >     cxl create-region -d decoder0.0 -m mem0
> >     cxl create-region -d decoder0.0 -m mem1
> > 
> >     root@QEMUCXL6060pmem:~# cxl list
> >     [
> >       {
> >         "memdevs":[
> >           {
> >             "memdev":"mem0",
> >             "pmem_size":536870912,
> >             "serial":2,
> >             "host":"0000:0c:00.0",
> >             "firmware_version":"BWFW VERSION 00"
> >           },
> >           {
> >             "memdev":"mem1",
> >             "pmem_size":536870912,
> >             "serial":1,
> >             "host":"0000:0b:00.0",
> >             "firmware_version":"BWFW VERSION 00"
> >           }
> >         ]
> >       },
> >       {
> >         "regions":[
> >           {
> >             "region":"region0",
> >             "resource":45365592064,
> >             "size":536870912,
> >             "type":"pmem",
> >             "interleave_ways":1,
> >             "interleave_granularity":256,
> >             "decode_state":"commit",
> >             "qos_class_mismatch":true
> >           },
> >           {
> >             "region":"region1",
> >             "resource":45902462976,
> >             "size":536870912,
> >             "type":"pmem",
> >             "interleave_ways":1,
> >             "interleave_granularity":256,
> >             "decode_state":"commit",
> >             "qos_class_mismatch":true
> >           }
> >         ]
> >       }
> >     ]
> > 
> > 3. Re-Start Qemu and we could see cxl region persistency using "cxl list"
> > 
> > 4. Create namespace for both regions
> >     root@QEMUCXL6060pmem:~# ndctl create-namespace --mode=fsdax 
> > --region=region0 --size=128M
> >     {
> >       "dev":"namespace0.0",
> >       "mode":"fsdax",
> >       "map":"dev",
> >       "size":"124.00 MiB (130.02 MB)",
> >       "uuid":"3f6dcdc5-d289-4b0c-ad16-82636c82bec1",
> >       "sector_size":512,
> >       "align":2097152,
> >       "blockdev":"pmem0"
> >     }
> >     
> >     root@QEMUCXL6060pmem:~# ndctl create-namespace --mode=fsdax 
> > --region=region1 --size=256M
> >     {
> >       "dev":"namespace1.0",
> >       "mode":"fsdax",
> >       "map":"dev",
> >       "size":"250.00 MiB (262.14 MB)",
> >       "uuid":"6b9083c9-cb1a-447b-894d-fdfd2f3dbed2",
> >       "sector_size":512,
> >       "align":2097152,
> >       "blockdev":"pmem1"
> >     }
> >     
> >     root@QEMUCXL6060pmem:~# time ndctl create-namespace --mode=fsdax 
> > --region=region0 --size=256M
> >     {
> >       "dev":"namespace0.1",
> >       "mode":"fsdax",
> >       "map":"dev",
> >       "size":"250.00 MiB (262.14 MB)",
> >       "uuid":"c2071802-8c24-4f9c-a6c1-f6bb6589e561",
> >       "sector_size":512,
> >       "align":2097152,
> >       "blockdev":"pmem0.1"
> >     }
> >     
> >     real    0m47.517s
> >     user    0m0.209s
> >     sys     0m26.879s
> >     root@QEMUCXL6060pmem:~# time ndctl create-namespace --mode=fsdax 
> > --region=region1 --size=128M
> >     {
> >       "dev":"namespace1.1",
> >       "mode":"fsdax",
> >       "map":"dev",
> >       "size":"124.00 MiB (130.02 MB)",
> >       "uuid":"13bc8de3-53d3-4c3d-b252-be7efefe80ee",
> >       "sector_size":512,
> >       "align":2097152,
> >       "blockdev":"pmem1.1"
> >     }
> >     
> >     real    0m33.459s
> >     user    0m0.243s
> >     sys     0m13.590s
> > 
> >     root@QEMUCXL6060pmem:~# ndctl list
> >     [
> >       {
> >         "dev":"namespace1.0",
> >         "mode":"fsdax",
> >         "map":"dev",
> >         "size":262144000,
> >         "uuid":"6b9083c9-cb1a-447b-894d-fdfd2f3dbed2",
> >         "sector_size":512,
> >         "align":2097152,
> >         "blockdev":"pmem1"
> >       },
> >       {
> >         "dev":"namespace1.1",
> >         "mode":"fsdax",
> >         "map":"dev",
> >         "size":130023424,
> >         "uuid":"13bc8de3-53d3-4c3d-b252-be7efefe80ee",
> >         "sector_size":512,
> >         "align":2097152,
> >         "blockdev":"pmem1.1"
> >       },
> >       {
> >         "dev":"namespace0.1",
> >         "mode":"fsdax",
> >         "map":"dev",
> >         "size":262144000,
> >         "uuid":"c2071802-8c24-4f9c-a6c1-f6bb6589e561",
> >         "sector_size":512,
> >         "align":2097152,
> >         "blockdev":"pmem0.1"
> >       },
> >       {
> >         "dev":"namespace0.0",
> >         "mode":"fsdax",
> >         "map":"dev",
> >         "size":130023424,
> >         "uuid":"3f6dcdc5-d289-4b0c-ad16-82636c82bec1",
> >         "sector_size":512,
> >         "align":2097152,
> >         "blockdev":"pmem0"
> >       }
> >     ]
> >     
> > 5. Re-Start Qemu and we could see
> >     - Region persistency using "cxl list"
> >     - Namespace persistency using "ndctl list" and cat /proc/iomem
> > 
> >     root@QEMUCXL6060pmem:~# cat /proc/iomem
> >     
> >     a90000000-b8fffffff : CXL Window 0
> >       a90000000-aafffffff : Persistent Memory
> >         a90000000-aafffffff : region0
> >           a90000000-a97ffffff : namespace0.0
> >           a98000000-aa7ffffff : namespace0.1
> >       ab0000000-acfffffff : Persistent Memory
> >         ab0000000-acfffffff : region1
> >           ab0000000-abfffffff : namespace1.0
> >           ac0000000-ac7ffffff : namespace1.1
> >     
> > 
> >     - NOTE: We can see some lag in restart, Its WIP
> > 
> > 6. Also verify LSA version using "ndctl read-labels -j nmem0 -u"
> >     root@QEMUCXL6060pmem:~# ndctl read-labels -j nmem0
> >     {
> >       "dev":"nmem0",
> >       "index":[
> >         {
> >           "signature":"NAMESPACE_INDEX",
> >           "major":2,
> >           "minor":1,
> >           "labelsize":256,
> >           "seq":2,
> >           "nslot":4090
> >         },
> >         {
> >           "signature":"NAMESPACE_INDEX",
> >           "major":2,
> >           "minor":1,
> >           "labelsize":256,
> >           "seq":1,
> >           "nslot":4090
> >         }
> >       ],
> >       "label":[
> >         {
> >           "type":"68bb2c0a-5a77-4937-9f85-3caf41a0f93c",
> >           "uuid":"9a26b9ce-a859-4a63-b1b7-fd176105770d",
> >           "name":"",
> >           "flags":8,
> >           "nrange":1,
> >           "position":0,
> >           "dpa":134217728,
> >           "rawsize":268435456,
> >           "slot":0,
> >           "align":0,
> >           "region_uuid":"de512bdc-9731-4e5f-838c-be2e9b94ea72",
> >           "abstraction_uuid":"266400ba-fb9f-4677-bcb0-968f11d0d225",
> >           "lbasize":512
> >         },
> >         {
> >           "type":"529d7c61-da07-47c4-a93f-ecdf2c06f444",
> >           "uuid":"de512bdc-9731-4e5f-838c-be2e9b94ea72",
> >           "flags":0,
> >           "nlabel":1,
> >           "position":0,
> >           "dpa":0,
> >           "rawsize":536870912,
> >           "hpa":45365592064,
> >           "slot":1,
> >           "interleave granularity":256,
> >           "align":0
> >         },
> >         {
> >           "type":"68bb2c0a-5a77-4937-9f85-3caf41a0f93c",
> >           "uuid":"a90d211a-b28d-48c7-bfe7-99560d3825ef",
> >           "name":"",
> >           "flags":0,
> >           "nrange":1,
> >           "position":0,
> >           "dpa":0,
> >           "rawsize":134217728,
> >           "slot":2,
> >           "align":0,
> >           "region_uuid":"de512bdc-9731-4e5f-838c-be2e9b94ea72",
> >           "abstraction_uuid":"266400ba-fb9f-4677-bcb0-968f11d0d225",
> >           "lbasize":512
> >         },
> >         {
> >           "type":"68bb2c0a-5a77-4937-9f85-3caf41a0f93c",
> >           "uuid":"9a26b9ce-a859-4a63-b1b7-fd176105770d",
> >           "name":"",
> >           "flags":0,
> >           "nrange":1,
> >           "position":0,
> >           "dpa":134217728,
> >           "rawsize":268435456,
> >           "slot":3,
> >           "align":0,
> >           "region_uuid":"de512bdc-9731-4e5f-838c-be2e9b94ea72",
> >           "abstraction_uuid":"266400ba-fb9f-4677-bcb0-968f11d0d225",
> >           "lbasize":512
> >         }
> >       ]
> >     }
> >     read 1 nmem
> > 
> >     - NOTE: We have following UUID types as per CXL Spec
> >             "type":"529d7c61-da07-47c4-a93f-ecdf2c06f444" is region label
> >             "type":"68bb2c0a-5a77-4937-9f85-3caf41a0f93c" is namespace label
> > 
> > 
> > Limitation (WIP):
> > ================
> > Current changes only support interleave way == 1
> > 
> > Observation:
> > ============
> > First time namespace creation using ndctl takes around 10 to 20 second time
> > while executing "devm_memremap_pages" at [3]
> > 
> > As using this patchset, after auto region creation, namespace creation is
> > happening in boot sequence (if nvdimm and cxl drivers are static), It is
> > therefore boot sequence is increased by around 10 to 20 sec.
> > 
> > 
> > [1]: 
> > https://lore.kernel.org/all/163116432405.2460985.5547867384570123403.st...@dwillia2-desk3.amr.corp.intel.com/
> > [2]: https://github.com/neerajoss/ndctl/tree/linux-cxl/CXL_LSA_2.1_Support
> > [3]: 
> > https://elixir.bootlin.com/linux/v6.13.7/source/drivers/nvdimm/pmem.c#L520
> > 
> > 
> > 
> > 
> > Neeraj Kumar (20):
> >   nvdimm/label: Introduce NDD_CXL_LABEL flag to set cxl label format
> >   nvdimm/label: Prep patch to accommodate cxl lsa 2.1 support
> >   nvdimm/namespace_label: Add namespace label changes as per CXL LSAv2.1
> >   nvdimm/label: CXL labels skip the need for 'interleave-set cookie'
> >   nvdimm/region_label: Add region label updation routine
> >   nvdimm/region_label: Add region label deletion routine
> >   nvdimm/namespace_label: Update namespace init_labels and its region_uuid
> >   nvdimm/label: Include region label in slot validation
> >   nvdimm/namespace_label: Skip region label during ns label DPA reservation
> >   nvdimm/region_label: Preserve cxl region information from region label
> >   nvdimm/region_label: Export routine to fetch region information
> >   nvdimm/namespace_label: Skip region label during namespace creation
> >   cxl/mem: Refactor cxl pmem region auto-assembling
> >   cxl/region: Add cxl pmem region creation routine for region persistency
> >   cxl: Add a routine to find cxl root decoder on cxl bus
> >   cxl/mem: Preserve cxl root decoder during mem probe
> >   cxl/pmem: Preserve region information into nd_set
> >   cxl/pmem: Add support of cxl lsa 2.1 support in cxl pmem
> >   cxl/pmem_region: Prep patch to accommodate pmem_region attributes
> >   cxl/pmem_region: Add cxl region label updation and deletion device 
> > attributes
> > 
> >  drivers/cxl/Kconfig             |  12 +
> >  drivers/cxl/core/Makefile       |   1 +
> >  drivers/cxl/core/core.h         |   8 +-
> >  drivers/cxl/core/pmem_region.c  | 325 ++++++++++++++++++++++++++
> >  drivers/cxl/core/port.c         |  72 +++++-
> >  drivers/cxl/core/region.c       | 383 +++++++++++++++---------------
> >  drivers/cxl/cxl.h               |  46 +++-
> >  drivers/cxl/cxlmem.h            |   1 +
> >  drivers/cxl/mem.c               |  27 ++-
> >  drivers/cxl/pmem.c              |  72 +++++-
> >  drivers/cxl/port.c              |  38 ---
> >  drivers/nvdimm/dimm.c           |   5 +
> >  drivers/nvdimm/dimm_devs.c      |  28 +++
> >  drivers/nvdimm/label.c          | 403 ++++++++++++++++++++++++++++----
> >  drivers/nvdimm/label.h          |  20 +-
> >  drivers/nvdimm/namespace_devs.c | 149 ++++++++----
> >  drivers/nvdimm/nd-core.h        |   2 +
> >  drivers/nvdimm/nd.h             |  81 ++++++-
> >  drivers/nvdimm/region_devs.c    |   5 +
> >  include/linux/libnvdimm.h       |  28 +++
> >  tools/testing/cxl/Kbuild        |   1 +
> >  21 files changed, 1364 insertions(+), 343 deletions(-)
> >  create mode 100644 drivers/cxl/core/pmem_region.c
> > 
> > 
> > base-commit: 448a60e85ae2afe2cb760f5d2ed2c8a49d2bd1b4  
> 
> 


Reply via email to