Project

General

Profile

Feature #12941

Support multiple extents in bhyve blockif_delete

Added by Jason King about 1 month ago.

Status:
New
Priority:
Normal
Assignee:
-
Category:
bhyve
Start date:
Due date:
% Done:

0%

Estimated time:
Difficulty:
Medium
Tags:
Gerrit CR:

Description

Currently, the blockif_delete() function only supports deleting a single extent (offset + length) per request. This mimics the current semantics of the FreeBSD DIOCDELETE ioctl which only allows a single extent per call. The bhyve virtio block support always advertises supporting a single extent to match the FreeBSD limits (when advertising the discard feature to guests). However the emulated NVMe device supports requests w/ up to 256 extents (the maximum allowed by the NVMe spec). It does this by storing additional extents in the request's br_iov array and then using a loopback to issue an ioctl for each extent in the NVMe dataset management command.

illumos's DKIOCFREE ioctl supports passing multiple extents in a single request (following the interfaces such as SCSI, ATA, virtio, and NVMe which all potentially allow multiple extents to be provided in a single request). We should enhance the illumos blockif_delete() code to support multiple extents. We can map additional extents to the br_iov array as the current NVMe support does, except we can then issue a single ioctl() to the underlying block device instead of looping.

Also available in: Atom PDF