Message ID | 20180209092719.10679-5-mb@lightnvm.io (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
> On 9 Feb 2018, at 01.27, Matias Bjørling <mb@lightnvm.io> wrote: > > The nvme driver sets up the size of the nvme namespace in two steps. > First it initializes the device with standard logical block and > metadata sizes, and then sets the correct logical block and metadata > size. Due to the OCSSD 2.0 specification relies on the namespace to > expose these sizes for correct initialization, let it be updated > appropriately on the LightNVM side as well. > > Signed-off-by: Matias Bjørling <mb@lightnvm.io> > --- > This late initialization breaks ligthnvm's core init since the sector size (csecs) is used on the first init part to set the logical block size. nvm_core_init -> blk_queue_logical_block_size(dev->q, dev_geo->c.csecs); We can do do a nvme_nvm_revalidate and set this on the revalidation path instead of simply updating the info as in nvme_nvm_update_nvm_info(). Javier
On 02/12/2018 09:21 PM, Javier Gonzalez wrote: > >> On 9 Feb 2018, at 01.27, Matias Bjørling <mb@lightnvm.io> wrote: >> >> The nvme driver sets up the size of the nvme namespace in two steps. >> First it initializes the device with standard logical block and >> metadata sizes, and then sets the correct logical block and metadata >> size. Due to the OCSSD 2.0 specification relies on the namespace to >> expose these sizes for correct initialization, let it be updated >> appropriately on the LightNVM side as well. >> >> Signed-off-by: Matias Bjørling <mb@lightnvm.io> >> --- >> > > This late initialization breaks ligthnvm's core init since the sector > size (csecs) is used on the first init part to set the logical block size. > > nvm_core_init -> blk_queue_logical_block_size(dev->q, dev_geo->c.csecs); > > We can do do a nvme_nvm_revalidate and set this on the revalidation path > instead of simply updating the info as in nvme_nvm_update_nvm_info().' I believe that is what the patch does (nvme_nvm_update_nvm_info is called from the nvme_revalidate_disk context). The nvm_core_init initialization of the block size is redundant and should be removed. I'll update the patch.
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index f837d666cbd4..740ceb28067c 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1379,6 +1379,8 @@ static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id) if (ns->noiob) nvme_set_chunk_size(ns); nvme_update_disk_info(disk, ns, id); + if (ns->ndev) + nvme_nvm_update_nvm_info(ns); #ifdef CONFIG_NVME_MULTIPATH if (ns->head->disk) nvme_update_disk_info(ns->head->disk, ns, id); diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c index 8b243af8a949..a19e85f0cbae 100644 --- a/drivers/nvme/host/lightnvm.c +++ b/drivers/nvme/host/lightnvm.c @@ -814,6 +814,14 @@ int nvme_nvm_ioctl(struct nvme_ns *ns, unsigned int cmd, unsigned long arg) } } +void nvme_nvm_update_nvm_info(struct nvme_ns *ns) +{ + struct nvm_dev *ndev = ns->ndev; + + ndev->identity.csecs = ndev->geo.sec_size = 1 << ns->lba_shift; + ndev->identity.sos = ndev->geo.oob_size = ns->ms; +} + int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node) { struct request_queue *q = ns->queue; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index ea1aa5283e8e..1ca08f4993ba 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -451,12 +451,14 @@ static inline void nvme_mpath_clear_current_path(struct nvme_ns *ns) #endif /* CONFIG_NVME_MULTIPATH */ #ifdef CONFIG_NVM +void nvme_nvm_update_nvm_info(struct nvme_ns *ns); int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node); void nvme_nvm_unregister(struct nvme_ns *ns); int nvme_nvm_register_sysfs(struct nvme_ns *ns); void nvme_nvm_unregister_sysfs(struct nvme_ns *ns); int nvme_nvm_ioctl(struct nvme_ns *ns, unsigned int cmd, unsigned long arg); #else +static inline void nvme_nvm_update_nvm_info(struct nvme_ns *ns) {}; static inline int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node) {
The nvme driver sets up the size of the nvme namespace in two steps. First it initializes the device with standard logical block and metadata sizes, and then sets the correct logical block and metadata size. Due to the OCSSD 2.0 specification relies on the namespace to expose these sizes for correct initialization, let it be updated appropriately on the LightNVM side as well. Signed-off-by: Matias Bjørling <mb@lightnvm.io> --- drivers/nvme/host/core.c | 2 ++ drivers/nvme/host/lightnvm.c | 8 ++++++++ drivers/nvme/host/nvme.h | 2 ++ 3 files changed, 12 insertions(+)