Re: [PATCH v5 09/16] nvme-pci: implement dma-buf backed requests

Anuj Gupta/Anuj Gupta <[email protected]> Tue, 4 Aug 2026 12:59:05 +0530
Newsgroups org.kernel.vger.linux-media,dev.linux.lists.dm-devel,dev.linux.lists.nvdimm,org.freedesktop.lists.dri-devel,org.infradead.lists.linux-nvme,org.kernel.vger.ceph-devel,org.kernel.vger.io-uring,org.kernel.vger.linux-block,org.kernel.vger.linux-btrfs,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 8/1/2026 9:16 PM, Pavel Begunkov wrote:
> +	map = kmalloc_flex(*map, dma_list, nr_entries);
> +	if (!map)
> +		return ERR_PTR(-ENOMEM);
> +
> +	sgt = dma_buf_map_attachment(attach, ctx->dir);
> +	if (IS_ERR(sgt)) {
> +		ret = PTR_ERR(sgt);
> +		sgt = NULL;
> +		goto err;
> +	}
> +
> +	for_each_sgtable_dma_sg(sgt, sg, tmp) {
> +		dma_addr_t dma_addr = sg_dma_address(sg);
> +		unsigned long sg_len = sg_dma_len(sg);
> +
> +		if (sg_len % NVME_CTRL_PAGE_SIZE) {
> +			ret = -EINVAL;
> +			goto err;
> +		}
> +		seg_shift = min(seg_shift, __ffs(sg_len));
> +
> +		while (sg_len) {
> +			map->dma_list[i++] = dma_addr;
> +			dma_addr += NVME_CTRL_PAGE_SIZE;
> +			sg_len -= NVME_CTRL_PAGE_SIZE;
> +		}
> +	}
> +
> +	if (WARN_ON_ONCE(seg_shift < NVME_CTRL_PAGE_SHIFT))
> +		return ERR_PTR(-EFAULT);

This should be 'goto err;' instead of a direct return. If this ever 
triggers, it leaks the map and already established sgt mapping.

> +
> +	ret = dma_buf_io_init_map(ctx, &map->base);
> +	if (ret)
> +		goto err;
> +	map->base.seg_shift = seg_shift;
> +	map->nr_entries = nr_entries;
> +	map->sgt = sgt;
> +	return &map->base;
> +err:
> +	if (sgt)
> +		dma_buf_unmap_attachment(attach, sgt, ctx->dir);
> +	kfree(map);
> +	return ERR_PTR(ret);
> +}