On Thu, 14 Jul 2022 17:02:19 -0700 Dan Williams <dan.j.williams@xxxxxxxxx> wrote: > From: Ben Widawsky <bwidawsk@xxxxxxxxxx> > > CXL 2.0 allows for dynamic provisioning of new memory regions (system > physical address resources like "System RAM" and "Persistent Memory"). > Whereas DDR and PMEM resources are conveyed statically at boot, CXL > allows for assembling and instantiating new regions from the available > capacity of CXL memory expanders in the system. > > Sysfs with an "echo $region_name > $create_region_attribute" interface > is chosen as the mechanism to initiate the provisioning process. This > was chosen over ioctl() and netlink() to keep the configuration > interface entirely in a pseudo-fs interface, and it was chosen over > configfs since, aside from this one creation event, the interface is > read-mostly. I.e. configfs supports cases where an object is designed to > be provisioned each boot, like an iSCSI storage target, and CXL region > creation is mostly for PMEM regions which are created usually once > per-lifetime of a server instance. This is an improvement over nvdimm > that pre-created "seed" devices that tended to confuse users looking to > determine which devices are active and which are idle. > > Recall that the major change that CXL brings over previous persistent > memory architectures is the ability to dynamically define new regions. > Compare that to drivers like 'nfit' where the region configuration is > statically defined by platform firmware. > > Regions are created as a child of a root decoder that encompasses an > address space with constraints. When created through sysfs, the root > decoder is explicit. When created from an LSA's region structure a root > decoder will possibly need to be inferred by the driver. > > Upon region creation through sysfs, a vacant region is created with a > unique name. Regions have a number of attributes that must be configured > before the region can be bound to the driver where HDM decoder program > is completed. > > An example of creating a new region: > > - Allocate a new region name: > region=$(cat /sys/bus/cxl/devices/decoder0.0/create_pmem_region) > > - Create a new region by name: > while > region=$(cat /sys/bus/cxl/devices/decoder0.0/create_pmem_region) > ! echo $region > /sys/bus/cxl/devices/decoder0.0/create_pmem_region > do true; done > > - Region now exists in sysfs: > stat -t /sys/bus/cxl/devices/decoder0.0/$region > > - Delete the region, and name: > echo $region > /sys/bus/cxl/devices/decoder0.0/delete_region > > Signed-off-by: Ben Widawsky <bwidawsk@xxxxxxxxxx> > [djbw: simplify locking, reword changelog] > Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx> V1 comments all addressed so Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>