[PATCH] nvme-fc: set max_segments to lldd max value
Himanshu Madhani
himanshu.madhani at oracle.com
Mon Jul 20 17:11:40 EDT 2020
On 7/14/20 2:03 PM, James Smart wrote:
> Currently the FC transport is set max_hw_sectors based on the lldds
> max sgl segment count. However, the block queue max segments is
> set based on the controller's max_segments count, which the transport
> does not set. As such, the lldd is receiving sgl lists that are
> exceeding its max segment count.
>
> Set the controller max segment count and derive max_hw_sectors from
> the max segment count.
>
> Signed-off-by: James Smart <jsmart2021 at gmail.com>
> Reviewed-by: Ewan D. Milne <emilne at redhat.com>
> CC: Max Gurtovoy <maxg at mellanox.com>
>
> ---
> Looks like the setting of max_segments has been missing from all
> fabric transports for a while. Rdma had a fixup (ff13c1b87c97) from
> Max last fall that corrected this. But tcp and fc were still lacking.
> Copying Max to look at tcp.
> ---
> drivers/nvme/host/fc.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
> index 6aa30bb5a762..e57e536546f7 100644
> --- a/drivers/nvme/host/fc.c
> +++ b/drivers/nvme/host/fc.c
> @@ -3001,8 +3001,9 @@ nvme_fc_create_association(struct nvme_fc_ctrl *ctrl)
> if (ret)
> goto out_disconnect_admin_queue;
>
> - ctrl->ctrl.max_hw_sectors =
> - (ctrl->lport->ops->max_sgl_segments - 1) << (PAGE_SHIFT - 9);
> + ctrl->ctrl.max_segments = ctrl->lport->ops->max_sgl_segments;
> + ctrl->ctrl.max_hw_sectors = ctrl->ctrl.max_segments <<
> + (ilog2(SZ_4K) - 9);
>
> blk_mq_unquiesce_queue(ctrl->ctrl.admin_q);
>
>
Reviewed-by: Himanshu Madhani <himanshu.madhani at oracle.com>
--
Himanshu Madhani Oracle Linux Engineering
More information about the Linux-nvme
mailing list