On Thu, Sep 2, 2021 at 11:22 AM Jonathan Cameron <[email protected]> wrote: > > On Tue, 24 Aug 2021 09:07:18 -0700 > Dan Williams <[email protected]> wrote: > > > The LIBNVDIMM IOCTL UAPI calls back to the nvdimm-bus-provider to > > translate the Linux command payload to the device native command format. > > The LIBNVDIMM commands get-config-size, get-config-data, and > > set-config-data, map to the CXL memory device commands device-identify, > > get-lsa, and set-lsa. Recall that the label-storage-area (LSA) on an > > NVDIMM device arranges for the provisioning of namespaces. Additionally > > for CXL the LSA is used for provisioning regions as well. > > > > The data from device-identify is already cached in the 'struct cxl_mem' > > instance associated with @cxl_nvd, so that payload return is simply > > crafted and no CXL command is issued. The conversion for get-lsa is > > straightforward, but the conversion for set-lsa requires an allocation > > to append the set-lsa header in front of the payload. > > > > Acked-by: Ben Widawsky <[email protected]> > > Signed-off-by: Dan Williams <[email protected]> > Minor query inline. > [..] > > +static int cxl_pmem_set_config_data(struct cxl_mem *cxlm, > > + struct nd_cmd_set_config_hdr *cmd, > > + unsigned int buf_len, int *cmd_rc) > > +{ > > + struct cxl_mbox_set_lsa { > > + u32 offset; > > + u32 reserved; > > + u8 data[]; > > + } *set_lsa; > > + int rc; > > + > > + if (sizeof(*cmd) > buf_len) > > + return -EINVAL; > > + > > + /* 4-byte status follows the input data in the payload */ > > + if (struct_size(cmd, in_buf, cmd->in_length) + 4 > buf_len) > > + return -EINVAL; > > + > > + set_lsa = > > + kvzalloc(struct_size(set_lsa, data, cmd->in_length), > > GFP_KERNEL); > > + if (!set_lsa) > > + return -ENOMEM; > > + > > + *set_lsa = (struct cxl_mbox_set_lsa) { > > + .offset = cmd->in_offset, > > + }; > > + memcpy(set_lsa->data, cmd->in_buf, cmd->in_length); > > + > > + rc = cxl_mem_mbox_send_cmd(cxlm, CXL_MBOX_OP_SET_LSA, set_lsa, > > + struct_size(set_lsa, data, cmd->in_length), > > + NULL, 0); > > + > > + /* set "firmware" status */ > > + *(u32 *) &cmd->in_buf[cmd->in_length] = 0; > > Are we guaranteed this is aligned? Not 'locally' obvious so maybe a comment?
Good point, let's just go ahead and use a put_unaligned() accessor.
