drivers/virtio/virtio_pci_modern.c
Source file repositories/reference/linux-study-clean/drivers/virtio/virtio_pci_modern.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/virtio/virtio_pci_modern.c- Extension
.c- Size
- 34551 bytes
- Lines
- 1302
- Domain
- Driver Families
- Bucket
- drivers/virtio
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/delay.hlinux/virtio_pci_admin.hvirtio_pci_common.h
Detected Declarations
function vp_get_featuresfunction vp_avq_indexfunction vp_modern_avq_donefunction virtqueue_exec_admin_cmdfunction vp_modern_admin_cmd_execfunction virtio_pci_admin_cmd_list_initfunction virtio_pci_admin_cmd_dev_parts_objects_enablefunction virtio_pci_admin_cmd_cap_initfunction vp_modern_avq_activatefunction vp_modern_avq_cleanupfunction vp_transport_featuresfunction __vp_check_common_size_one_featurefunction offsetofendfunction vp_finalize_featuresfunction vp_getfunction vp_setfunction vp_generationfunction vp_get_statusfunction vp_set_statusfunction vp_resetfunction vp_active_vqfunction vp_modern_disable_vq_and_resetfunction vp_modern_enable_vq_after_resetfunction vp_config_vectorfunction vp_notify_with_datafunction voidfunction vp_modern_find_vqsfunction del_vqfunction virtio_pci_find_shm_capfunction vp_get_shm_regionfunction virtio_pci_admin_has_dev_partsfunction virtio_pci_admin_mode_setfunction virtio_pci_admin_obj_createfunction virtio_pci_admin_obj_destroyfunction virtio_pci_admin_dev_parts_metadata_getfunction virtio_pci_admin_dev_parts_getfunction virtio_pci_admin_dev_parts_setfunction virtio_pci_modern_probefunction virtio_pci_modern_removeexport virtio_pci_admin_has_dev_partsexport virtio_pci_admin_mode_setexport virtio_pci_admin_obj_createexport virtio_pci_admin_obj_destroyexport virtio_pci_admin_dev_parts_metadata_getexport virtio_pci_admin_dev_parts_getexport virtio_pci_admin_dev_parts_set
Annotated Snippet
while ((cmd = virtqueue_get_buf(vq, &len))) {
/* If the number of bytes written by the device is less
* than the size of struct virtio_admin_cmd_status, the
* remaining status bytes will remain zero-initialized,
* since the buffer was zeroed during allocation.
* In this case, set the size of command_specific_result
* to 0.
*/
if (len < status_size)
cmd->result_sg_size = 0;
else
cmd->result_sg_size = len - status_size;
complete(&cmd->completion);
}
} while (!virtqueue_enable_cb(vq));
spin_unlock_irqrestore(&admin_vq->lock, flags);
}
static int virtqueue_exec_admin_cmd(struct virtio_pci_admin_vq *admin_vq,
u16 opcode,
struct scatterlist **sgs,
unsigned int out_num,
unsigned int in_num,
struct virtio_admin_cmd *cmd)
{
struct virtqueue *vq;
unsigned long flags;
int ret;
vq = admin_vq->info->vq;
if (!vq)
return -EIO;
if (opcode != VIRTIO_ADMIN_CMD_LIST_QUERY &&
opcode != VIRTIO_ADMIN_CMD_LIST_USE &&
!((1ULL << opcode) & admin_vq->supported_cmds))
return -EOPNOTSUPP;
init_completion(&cmd->completion);
again:
if (virtqueue_is_broken(vq))
return -EIO;
spin_lock_irqsave(&admin_vq->lock, flags);
ret = virtqueue_add_sgs(vq, sgs, out_num, in_num, cmd, GFP_KERNEL);
if (ret < 0) {
if (ret == -ENOSPC) {
spin_unlock_irqrestore(&admin_vq->lock, flags);
cpu_relax();
goto again;
}
goto unlock_err;
}
if (!virtqueue_kick(vq))
goto unlock_err;
spin_unlock_irqrestore(&admin_vq->lock, flags);
wait_for_completion(&cmd->completion);
return cmd->ret;
unlock_err:
spin_unlock_irqrestore(&admin_vq->lock, flags);
return -EIO;
}
int vp_modern_admin_cmd_exec(struct virtio_device *vdev,
struct virtio_admin_cmd *cmd)
{
struct scatterlist *sgs[VIRTIO_AVQ_SGS_MAX], hdr, stat;
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
struct virtio_admin_cmd_status *va_status;
unsigned int out_num = 0, in_num = 0;
struct virtio_admin_cmd_hdr *va_hdr;
u16 status;
int ret;
if (!virtio_has_feature(vdev, VIRTIO_F_ADMIN_VQ))
return -EOPNOTSUPP;
va_status = kzalloc_obj(*va_status);
if (!va_status)
return -ENOMEM;
va_hdr = kzalloc_obj(*va_hdr);
if (!va_hdr) {
ret = -ENOMEM;
goto err_alloc;
}
Annotation
- Immediate include surface: `linux/delay.h`, `linux/virtio_pci_admin.h`, `virtio_pci_common.h`.
- Detected declarations: `function vp_get_features`, `function vp_avq_index`, `function vp_modern_avq_done`, `function virtqueue_exec_admin_cmd`, `function vp_modern_admin_cmd_exec`, `function virtio_pci_admin_cmd_list_init`, `function virtio_pci_admin_cmd_dev_parts_objects_enable`, `function virtio_pci_admin_cmd_cap_init`, `function vp_modern_avq_activate`, `function vp_modern_avq_cleanup`.
- Atlas domain: Driver Families / drivers/virtio.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.