[PATCH] nvmet-tcp: fix memory leak when having inflight commands on disconnect
Sagi Grimberg
sagi at grimberg.me
Tue May 25 08:52:15 PDT 2021
> +static void nvmet_tcp_free_resp_list(struct nvmet_tcp_queue *queue)
> +{
> + struct list_head *p;
> + struct nvmet_tcp_cmd *cmd;
> + int c = 0;
> +
> + nvmet_tcp_process_resp_list(queue);
> +
> + list_for_each(p, &queue->resp_send_list) {
> + cmd = list_entry(p, struct nvmet_tcp_cmd, entry);
> + kfree(cmd->iov);
PDUs need to be unmapped as well in case of writes. That is not
handled in nvmet_tcp_uninit_data_in_cmds ? Or is it just reads (data-out
commands)?
> + sgl_free(cmd->req.sg);
> + c++;
> + }
> +
> + WARN_ON(c != queue->send_list_len);
> +
> + if (queue->snd_cmd) {
> + kfree(queue->snd_cmd->iov);
> + sgl_free(queue->snd_cmd->req.sg);
> + c++;
> + }
> +
> + pr_debug("qid %u send_list_len %d, free %d unprocessed commands\n",
> + queue->nvme_sq.qid, queue->send_list_len, c);
> +}
> +
> static void nvmet_tcp_release_queue_work(struct work_struct *w)
> {
> struct nvmet_tcp_queue *queue =
> @@ -1441,6 +1468,7 @@ static void nvmet_tcp_release_queue_work(struct work_struct *w)
> nvmet_tcp_uninit_data_in_cmds(queue);
> nvmet_sq_destroy(&queue->nvme_sq);
> cancel_work_sync(&queue->io_work);
> + nvmet_tcp_free_resp_list(queue);
> sock_release(queue->sock);
> nvmet_tcp_free_cmds(queue);
> if (queue->hdr_digest || queue->data_digest)
>
More information about the Linux-nvme
mailing list