lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 153/267] nvme: refine the Qemu Identify CNS quirk
    Date
    From: Christoph Hellwig <hch@lst.de>

    [ Upstream commit b9a5c3d4c34d8bd9fd75f7f28d18a57cb68da237 ]

    Add a helper to check if we can use Identify CNS values > 1, and refine
    the Qemu quirk to not apply to reported versions larger than 1.1, as the
    Qemu implementation had been fixed by then.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Keith Busch <kbusch@kernel.org>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/nvme/host/core.c | 16 ++++++++++++++--
    1 file changed, 14 insertions(+), 2 deletions(-)

    diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
    index d5359c7c811a..0d60f2f8f3ee 100644
    --- a/drivers/nvme/host/core.c
    +++ b/drivers/nvme/host/core.c
    @@ -926,6 +926,19 @@ void nvme_stop_keep_alive(struct nvme_ctrl *ctrl)
    }
    EXPORT_SYMBOL_GPL(nvme_stop_keep_alive);

    +/*
    + * In NVMe 1.0 the CNS field was just a binary controller or namespace
    + * flag, thus sending any new CNS opcodes has a big chance of not working.
    + * Qemu unfortunately had that bug after reporting a 1.1 version compliance
    + * (but not for any later version).
    + */
    +static bool nvme_ctrl_limited_cns(struct nvme_ctrl *ctrl)
    +{
    + if (ctrl->quirks & NVME_QUIRK_IDENTIFY_CNS)
    + return ctrl->vs < NVME_VS(1, 2, 0);
    + return ctrl->vs < NVME_VS(1, 1, 0);
    +}
    +
    static int nvme_identify_ctrl(struct nvme_ctrl *dev, struct nvme_id_ctrl **id)
    {
    struct nvme_command c = { };
    @@ -3368,8 +3381,7 @@ static void nvme_scan_work(struct work_struct *work)

    mutex_lock(&ctrl->scan_lock);
    nn = le32_to_cpu(id->nn);
    - if (ctrl->vs >= NVME_VS(1, 1, 0) &&
    - !(ctrl->quirks & NVME_QUIRK_IDENTIFY_CNS)) {
    + if (!nvme_ctrl_limited_cns(ctrl)) {
    if (!nvme_scan_ns_list(ctrl, nn))
    goto out_free_id;
    }
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-19 18:21    [W:4.822 / U:0.428 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site