HomeFreeBSD

nvme: Fix memory leak in pt ioctl commands

Description

nvme: Fix memory leak in pt ioctl commands

When running nvme passthrough commands through the ioctl interface
memory is mapped with vmapbuf() but not unmapped. This results in leaked
memory whenever a process executes an nvme passthrough command with a
data buffer. This can be replicated with a simple c function (error
checks skipped for brevity):

void leak_memory(int nvme_ns_fd, uint16_t nblocks) {
struct nvme_pt_command pt = {

		.cmd = {
			.opc = NVME_OPC_READ,
			.cdw12 = nblocks - 1,
		},
		.len = nblocks * 512, // Assumes devices with 512 byte lba
		.is_read = 1, // Reads and writes should both trigger leak

}
void *buf;

posix_memalign(&buf, nblocks * 512);
pt.buf = buf;
ioctl(nvme_ns_fd, NVME_PASSTHROUGH_COMMAND, &pt);
free(buf);
}

Signed-off-by: David Sloan <david.sloan@eideticom.com>

PR: 273626
Reviewed by: imp, markj
MFC after: 1 week

(cherry picked from commit 7ea866eb14f8ec869a525442c03228b6701e1dab)

Details

Provenance
David Sloan <david.sloan@eideticom.com>Authored on Sep 7 2023, 4:22 PM
markjCommitted on Oct 9 2023, 12:41 AM
Parents
rGfdc38bc6cd28: zfs: merge openzfs/zfs@2407f30bd (zfs-2.2-release) into stable/14
Branches
Unknown
Tags
Unknown