[PATCH 2/2] nvmet-tcp: fix connect error when setting param_inline_data_size to zero.

Hou Pu houpu.main at gmail.com
Sat May 22 07:27:52 PDT 2021


On Sat, May 22, 2021 at 2:04 AM Sagi Grimberg <sagi at grimberg.me> wrote:
>
>
> >>> +static inline int nvmet_tcp_inline_data_size(struct nvmet_tcp_cmd *cmd)
> >>> +{
> >>> +     struct nvmet_tcp_queue *queue = cmd->queue;
> >>> +     struct nvme_command *nvme_cmd = cmd->req.cmd;
> >>> +     int inline_data_size = NVME_TCP_ADMIN_CCSZ;
> >>> +     u16 qid = 0;
> >>> +
> >>> +     if (likely(queue->nvme_sq.ctrl)) {
> >>> +             /* The connect admin/io queue has been executed. */
> >>> +             qid = queue->nvme_sq.qid;
> >>> +             if (qid)
> >>> +                     inline_data_size = cmd->req.port->inline_data_size;
> >>> +     } else if (nvme_cmd->connect.qid)
> >>> +             inline_data_size = cmd->req.port->inline_data_size;
> >>
> >> How can a connection to an I/O queue arrive without having the ctrl
> >> reference installed? Is this for the failure case?
> >
> > Hi Sagi,
> > AFAIK after the host finishes setting up the admin queue,
> > it connects to the io queue and sends the io-connect command. At this
> > point the nvmet_tcp_queue is firstly allocated and does not have a valid
> > queue->nvme_sq.ctrl. It is assigned after io-connect in nvmet_install_queue().
> > So this function tries to find the correct queue number before or after a
> > fabrics connect command.
>
> Why do you need the inline_data_size before the connect? its only
> relevant for nvme I/O..

>From my observation, the host always sends an admin-connect command with
nvmf_connect_data as inline data (by setting sg type to NVME_SGL_FMT_DATA_DESC).
This is fixed from the host side.

For io-connect command, the host sends nvmf_connect_data according
to ioccsz. If the size of nvmf_connect_data is smaller than ioccsz*16
it is sent as inline data. ioccsz is obtained by identifying the controller and
is controlled by param_inline_data_size from the target side.

If param_inline_data_size is set to zero, admin-connect will not
be received by target correctly. As target side thought there is
no inline data (by looking param_inline_data_size), but in fact
admin-connect has inline data.

This patch is trying to make param_inline_data_size only affect io-queue.
and admin-queue always allow 8k inline data. This is what the host
side do currently and also what the specification says AFAIK.

Thanks,
Hou



More information about the Linux-nvme mailing list