vDPA оборудованиеэто своего рода следованиепуть к данным virtioСтандартный, но сПуть управления, зависящий от поставщика, изоборудование。
Устройства vDPA могут быть физически расположены на оборудовании или эмулироваться с помощью программного обеспечения.
Только маленький vDPA Родительский драйвер обрабатывает путь управления. Основные преимущества все vDPA оборудование У всех естьУнифицированный программный стек:
В последние годы было опубликовано множество сообщений в блогах и выступлений, которые могут помочь вам лучше понять vDPA и варианты использования. Мы собрали некоторые из них на vdpa-dev.gitlab.io. Я рекомендую вам изучить как минимум следующее:
vDPA Большая часть работы в Китае выполняется с помощью сетевых устройств, но недавно мы также разработали поддержку блокирующего устройствоизподдерживать。
Основным вариантом использования, безусловно, является использование аппаратного обеспечения для прямой эмуляции устройства virtio-blk и поддержки различных сетевых серверов, таких как Ceph RBD или iSCSI. Это цель некоторых SmartNIC или DPU, которые, конечно, способны эмулировать устройства virtio-net, а также virtio-blk для сетевого хранилища.
Абстракция, обеспечиваемая vDPA, также позволяет использовать программные ускорители, аналогичные существующим устройствам vhost или vhost-user. Мы обсуждали это на KVM-форуме 2021 года.
В этом разговоре мы обсудили быстрый и медленный путь. когда QEMU Необходимо обрабатывать запросы (например, поддерживать живую миграцию или выполнять I/O предел)час,это будетиспользоватьмедленный путь。существоватьмедленный период пути, доступный клиенту из существующего устройства QEMU Средняя симуляция. КЕМУ использовать libblkio Драйвер, реализованный в перехватывает запрос и пересылает его vDPA оборудование. С другой стороны, когда QEMU Ускоренный путь вступает в силу, когда вмешательство не требуется. В этом случае в ДПА оборудование может быть представлено непосредственно клиенту,обойти QEMU измоделирование。
libblkio предоставляет блокирующее доступ к пользовательскому пространству устройствоиз通用 API. Он поддерживает несколько драйверов. Мы сосредоточимся на QEMU серединаблокирующее устройствоvirtio-blk-vhost-vdpa
использоватьизводительvirtio-blk-vhost-vdpa
. В настоящее время он поддерживает только медленный путь, но в будущем должен иметь возможность автоматически переключаться на быстрый путь. с QEMU 7.2 Поскольку он поддерживает libblkio драйвер, поэтому вы можете использовать следующие параметры для vDPA блокирующее устройство Подключитесь к виртуальной машине:
-blockdev node-name=drive_src1,driver=virtio-blk-vhost-vdpa,path=/dev/vhost-vdpa-0,cache.direct=on \
-device virtio-blk-pci,id=src1,bootindex=2,drive=drive_src1 \
в любом случае,Чтобы полностью использовать vDPA Производительность аппаратных устройств, мы всегда можем использовать QEMU Предоставлено универсальное устройство vhost-vdpa-device-pci, которое поддерживает любые vDPA устройство и предоставлять его непосредственно клиентам. Конечно, QEMU В этом случае нет возможности перехватить запрос, поэтому некоторые функции, предоставляемые его блочным слоем (например, живая миграция, форматирование диска и т. д.), не поддерживаются. от QEMU 8.0 Для начала вы можете использовать следующие параметры для преобразования общего vDPA устройство, подключенное к VM:
-device vhost-vdpa-device-pci,vhostdev=/dev/vhost-vdpa-0
На форуме KVM 2022 Альберто Фариа и Стефан Хайноци представили libblkio, а мы с Кевином Вольфом обсудили его использование в демоне хранения QEMU (QSD).
Одним из преимуществ vDPA является его мощная абстракция, которая поддерживает реализацию устройств virtio в аппаратном и программном обеспечении (либо в ядре, либо в пользовательском пространстве). Эта унификация в рамках единой структуры делает устройства идентичными QEMU, обеспечивая плавную интеграцию аппаратных и программных компонентов.
оустройство ядра,от Linux v5.13 Старт,житьсуществовать Один разработан специально дляи Цель отладкииз И дизайниз简单моделирование器。это может пройтиvdpa-sim-blk
Ядромодульиспользовать,Этот модуль имитирует 128 МБ виртуального диска, как KVM Forum 2021, как указано в изречении.,Ядросерединаизбудущееоборудование(Похоже на повторяющийся, ноот Не объединеноизvhost-blk
)может обеспечить превосходноеизпроизводительность。当硬件Нет可用час,Этот видоборудование Можно использовать как альтернативу,Например,Облегчает живую миграцию в любую систему,Независимо от того, имеет ли целевая система SmartNIC/DPU.
Вместо этого, что касается пользовательского пространства, мы можем использовать VDUSE。QSD поддерживает его и, следовательно, позволяет нам экспортировать таким образом QEMU сохранениеиз любого образа диска, например экспорт vDPA Устройство vduse0:
qemu-storage-daemon \
--blockdev file,filename=/path/to/disk.qcow2,node-name=file \
--blockdev qcow2,file=file,node-name=qcow2 \
--export type=vduse-blk,id=vduse0,name=vduse0,node-name=qcow2,writable=on
Как упоминалось во введении, vDPA поддерживаются различные автобусы, например vhost-vdpa
иvirtio-vdpa
。водить машину:vhost-vdpa, Такая гибкость позволяет автобусу быть vDPA Устройство и виртуальная машина или драйвер пользовательского пространства (например, libblkio) вместе использовать. Кроме того, драйвер virtio-vdpa также позволяет осуществлять прямое подключение к хосту через шину. контейнер для взаимодействия с запущенными приложениями.
iproute2серединаизинструментvdpa
может пройтиnetlinkудобныйизуправлятьvdpaоборудование,может быть выделеноивыпустите этиоборудование。
от Linux 5.17 Старт, в ДПА водительподдерживатьdriver_ovveride
。Это усовершенствование позволяетсуществовать运行час进行动态重新配置,оти позвольтеоборудование以Этот вид方式отодин кусочекавтобус迁移到另один кусочекавтобус:
# load vdpa buses
$ modprobe -a virtio-vdpa vhost-vdpa
# load vdpa-blk in-kernel simulator
$ modprobe vdpa-sim-blk
# instantiate a new vdpasim_blk device called `vdpa0`
$ vdpa dev add mgmtdev vdpasim_blk name vdpa0
# `vdpa0` is attached to the first vDPA bus driver loaded
$ driverctl -b vdpa list-devices
vdpa0 virtio_vdpa
# change the `vdpa0` bus to `vhost-vdpa` Перенести шину vdpa0 -> vhost-vdpa
$ driverctl -b vdpa set-override vdpa0 vhost_vdpa
# `vdpa0` is now attached to the `vhost-vdpa` bus
$ driverctl -b vdpa list-devices
vdpa0 vhost_vdpa [*]
# Note: driverctl(8) integrates with udev so the binding is preserved.
以下даокак将VDUSEиQEMU демон хранилища с виртуальными машинами ( QEMU
) или контейнер ( podman
) Объедините использование с несколькими примерами. Эти шаги можно легко адаптировать для прохождения vDPA поддерживать virtio-blk оборудованиеизлюбое оборудование。
# load vdpa buses
$ modprobe -a virtio-vdpa vhost-vdpa
# create an empty qcow2 image
$ qemu-img create -f qcow2 test.qcow2 10G
# load vduse kernel module
$ modprobe vduse
# launch QSD exposing the `test.qcow2` image as `vduse0` vDPA device
$ qemu-storage-daemon --blockdev file,filename=test.qcow2,node-name=file \
--blockdev qcow2,file=file,node-name=qcow2 \
--export vduse-blk,id=vduse0,name=vduse0,num-queues=1,node-name=qcow2,writable=on &
# instantiate the `vduse0` device (same name used in QSD)
$ vdpa dev add name vduse0 mgmtdev vduse
# be sure to attach it to the `virtio-vdpa` device to use with host applications
$ driverctl -b vdpa set-override vduse0 virtio_vdpa
# device exposed as a virtio device, but attached to the host kernel
$ lsblk -pv
NAME TYPE TRAN SIZE RQ-SIZE MQ
/dev/vda disk virtio 10G 256 1
# start a container with `/dev/vda` attached
podman run -it --rm --device /dev/vda --group-add keep-groups fedora:39 bash
# download Fedora cloud image (or use any other bootable image you want)
$ wget https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images/Fedora-Cloud-Base-39-1.5.x86_64.qcow2
# launch QSD exposing the VM image as `vduse1` vDPA device
$ qemu-storage-daemon \
--blockdev file,filename=Fedora-Cloud-Base-39-1.5.x86_64.qcow2,node-name=file \
--blockdev qcow2,file=file,node-name=qcow2 \
--export vduse-blk,id=vduse1,name=vduse1,num-queues=1,node-name=qcow2,writable=on &
# instantiate the `vduse1` device (same name used in QSD)
$ vdpa dev add name vduse1 mgmtdev vduse
# initially it's attached to the host (`/dev/vdb`), because `virtio-vdpa`
# is the first kernel module we loaded
$ lsblk -pv
NAME TYPE TRAN SIZE RQ-SIZE MQ
/dev/vda disk virtio 10G 256 1
/dev/vdb disk virtio 5G 256 1
$ lsblk /dev/vdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vdb 251:16 0 5G 0 disk
├─vdb1 251:17 0 1M 0 part
├─vdb2 251:18 0 1000M 0 part
├─vdb3 251:19 0 100M 0 part
├─vdb4 251:20 0 4M 0 part
└─vdb5 251:21 0 3.9G 0 part
# and it is identified as `virtio1` in the host
$ ls /sys/bus/vdpa/devices/vduse1/
driver driver_override power subsystem uevent virtio1
# attach it to the `vhost-vdpa` device to use the device with VMs
$ driverctl -b vdpa set-override vduse1 vhost_vdpa
# `/dev/vdb` is not available anymore
$ lsblk -pv
NAME TYPE TRAN SIZE RQ-SIZE MQ
/dev/vda disk virtio 10G 256 1
# the device is identified as `vhost-vdpa-1` in the host
$ ls /sys/bus/vdpa/devices/vduse1/
driver driver_override power subsystem uevent vhost-vdpa-1
$ ls -l /dev/vhost-vdpa-1
crw-------. 1 root root 511, 0 Feb 12 17:58 /dev/vhost-vdpa-1
# launch QEMU using `/dev/vhost-vdpa-1` device with the
# `virtio-blk-vhost-vdpa` libblkio driver
$ qemu-system-x86_64 -m 512M -smp 2 -M q35,accel=kvm,memory-backend=mem \
-object memory-backend-memfd,share=on,id=mem,size="512M" \
-blockdev node-name=drive0,driver=virtio-blk-vhost-vdpa,path=/dev/vhost-vdpa-1,cache.direct=on \
-device virtio-blk-pci,drive=drive0
# `virtio-blk-vhost-vdpa` blockdev can be used with any QEMU block layer
# features (e.g live migration, I/O throttling).
# In this example we are using I/O throttling:
$ qemu-system-x86_64 -m 512M -smp 2 -M q35,accel=kvm,memory-backend=mem \
-object memory-backend-memfd,share=on,id=mem,size="512M" \
-blockdev node-name=drive0,driver=virtio-blk-vhost-vdpa,path=/dev/vhost-vdpa-1,cache.direct=on \
-blockdev node-name=throttle0,driver=throttle,file=drive0,throttle-group=limits0 \
-object throttle-group,id=limits0,x-iops-total=2000 \
-device virtio-blk-pci,drive=throttle0
# Alternatively, we can use the generic `vhost-vdpa-device-pci` to take
# advantage of all the performance, but without having any QEMU block layer
# features available
$ qemu-system-x86_64 -m 512M -smp 2 -M q35,accel=kvm,memory-backend=mem \
-object memory-backend-memfd,share=on,id=mem,size="512M" \
-device vhost-vdpa-device-pci,vhostdev=/dev/vhost-vdpa-0
Выступление на конференции Virtio vdpa vduse linux qemu
Тип устройства QEMU | быстрый путь | QEMU перехватывает запросы |
---|---|---|
vhost-vdpa-device-pci (более общий) | поддерживать | Нетподдерживать |
virtio-blk-vhost-vdpa (работает с libblkio) | Нетподдерживать | поддерживать(живая миграция,формат диска,управление потоком ввода-вывода и т. д.) |
modprobe vdpa-sim-blk, insmod vdpa_sim_blk.ko
drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
module_init(vdpasim_blk_init) -> sim
module_param(shared_backend, bool, 0444)
device_register(&vdpasim_blk_mgmtdev)
vdpa_mgmtdev_register(&mgmt_dev)
if (shared_backend)
shared_buffer = kvzalloc(VDPASIM_BLK_CAPACITY << SECTOR_SHIFT, GFP_KERNEL)
static struct vdpa_mgmt_dev mgmt_dev = {
.device = &vdpasim_blk_mgmtdev,
.id_table = id_table,
.ops = &vdpasim_blk_mgmtdev_ops,
};
static const struct vdpa_mgmtdev_ops vdpasim_blk_mgmtdev_ops = {
.dev_add = vdpasim_blk_dev_add,
.dev_del = vdpasim_blk_dev_del
};
# Add `vdpa-blk1` device through `vdpasim_blk` management device
$ vdpa dev add name vdpa-blk1 mgmtdev vdpasim_blk
static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name, const struct vdpa_dev_set_config *config)
dev_attr.id = VIRTIO_ID_BLOCK
dev_attr.supported_features = VDPASIM_BLK_FEATURES
dev_attr.nvqs = VDPASIM_BLK_VQ_NUM -> 1
dev_attr.get_config = vdpasim_blk_get_config
blk_config->capacity = cpu_to_vdpasim64(vdpasim, VDPASIM_BLK_CAPACITY) -> 0x40000 -> print(0x40000) 262144 * 512 = 134217728 = 128MB -> lsblk vda 252:0 0 128M 0 block:virtio:vdpa
blk_config->size_max = cpu_to_vdpasim32(vdpasim, VDPASIM_BLK_SIZE_MAX) -> 4096
blk_config->seg_max = cpu_to_vdpasim32(vdpasim, VDPASIM_BLK_SEG_MAX) -> 32
blk_config->blk_size = cpu_to_vdpasim32(vdpasim, SECTOR_SIZE) -> 1<<9 = 512
...
dev_attr.work_fn = vdpasim_blk_work -> Функция обработки ввода-вывода/рабочая очередь
for (i = 0; i < VDPASIM_BLK_VQ_NUM; i++)
while (vdpasim_blk_handle_req(vdpasim, vq))
vdpasim_blk_handle_req
struct virtio_blk_outhdr hdr
vringh_getdesc_iotlb(&vq->vring, &vq->out_iov, &vq->in_iov, &vq->head, GFP_ATOMIC) -> использовать больше не нужно riov и wiov , тебе следует позвонить vringh_kiov_cleanup() очистить их, чтобы освободить память
__vringh_iov(vrh, *head, riov, wiov, no_range_check, NULL,gfp, copydesc_iotlb)
to_push = vringh_kiov_length(&vq->in_iov) - 1
to_pull = vringh_kiov_length(&vq->out_iov)
bytes = vringh_iov_pull_iotlb(&vq->vring, &vq->out_iov, &hdr, sizeof(hdr)) -> copy bytes from vring_iov to hdr(отGUEST получает заголовок сообщения)
vringh_iov_xfer(vrh, riov, dst, len, xfer_from_iotlb)
err = xfer(vrh, iov->iov[iov->i].iov_base, ptr, partlen) -> xfer_from_iotlb
copy_from_iotlb(vrh, dst, src, len)
type = vdpasim32_to_cpu(vdpasim, hdr.type);
sector = vdpasim64_to_cpu(vdpasim, hdr.sector);
offset = sector << SECTOR_SHIFT;
status = VIRTIO_BLK_S_OK;
switch (type)
case VIRTIO_BLK_T_IN -> GUEST READ
vringh_iov_push_iotlb(&vq->vring, &vq->in_iov, blk->buffer + offset, to_push) -> copy bytes into vring_iov -> vringh_iov_xfer(vrh, wiov, (void *)src, len, xfer_to_iotlb) -> read from blk->buffer + offset
err = xfer(vrh, iov->iov[iov->i].iov_base, ptr, partlen)
copy_to_iotlb(vrh, dst, src, len)
ret = iotlb_translate(vrh, (u64)(uintptr_t)dst
copy_to_iter
case VIRTIO_BLK_T_OUT: -> GUEST WRITE
bytes = vringh_iov_pull_iotlb(&vq->vring, &vq->out_iov, blk->buffer + offset, to_pull) -> copy bytes from vring_iov to blk буфер (запись ввода-вывода в blk, указывающая на буфер (смещение))
case VIRTIO_BLK_T_GET_ID
bytes = vringh_iov_push_iotlb(&vq->vring, &vq->in_iov, vdpasim_blk_id, VIRTIO_BLK_ID_BYTES)
case VIRTIO_BLK_T_FLUSH:
break
case VIRTIO_BLK_T_DISCARD:
case VIRTIO_BLK_T_WRITE_ZEROES:
struct virtio_blk_discard_write_zeroes range
bytes = vringh_iov_pull_iotlb(&vq->vring, &vq->out_iov, &range, to_pull) -> vring -> range
vdpasim_blk_check_range(vdpasim, sector, num_sectors, VDPASIM_BLK_DWZ_MAX_SECTORS)
memset(blk->buffer + offset, 0, num_sectors << SECTOR_SHIFT) -> reset blk buffer
smp_wmb()
local_bh_disable
if (vringh_need_notify_iotlb(&vq->vring) > 0)
vringh_notify(&vq->vring)
vrh->notify(vrh)
local_bh_enable()
if (reschedule)
vdpasim_schedule_work
simdev = vdpasim_create(&dev_attr, config)
ops = &vdpasim_batch_config_ops
or ops = &vdpasim_config_ops
vdpa = __vdpa_alloc_device(NULL, ops, dev_attr->ngroups, dev_attr->nas, dev_attr->alloc_size, dev_attr->name, use_va) -> allocate and initilaize a vDPA device
vdev->dev.bus = &vdpa_bus
vdev->config = config -> ops
device_initialize(&vdev->dev)
kthread_init_work(&vdpasim->work, vdpasim_work_fn)
vdpasim->worker = kthread_create_worker(0, "vDPA sim worker: %s", dev_attr->name)
if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)))
vdpasim->vqs = kcalloc(dev_attr->nvqs
vdpasim->iommu = kmalloc_array(vdpasim->dev_attr.nas, sizeof(*vdpasim->iommu), GFP_KERNEL)
vdpasim->iommu_pt = kmalloc_array(vdpasim->dev_attr.nas, sizeof(*vdpasim->iommu_pt), GFP_KERNEL)
for (i = 0; i < vdpasim->dev_attr.nas; i++)
vhost_iotlb_init(&vdpasim->iommu[i], max_iotlb_entries, 0) -> 2048 -> initialize a vhost IOTLB
vhost_iotlb_add_range vdpasim->iommu_pt[i] = true
for (i = 0; i < dev_attr->nvqs; i++)
vringh_set_iotlb(&vdpasim->vqs[i].vring, &vdpasim->iommu[0], &vdpasim->iommu_lock) -> initialize a vringh for a ring with IOTLB, associated vring and iotlb
blk = sim_to_blk(simdev)
blk->shared_backend = shared_backend
blk->buffer = kvzalloc
_vdpa_register_device(&simdev->vdpa, VDPASIM_BLK_VQ_NUM)
static const struct vdpa_config_ops vdpasim_config_ops = {
.set_vq_address = vdpasim_set_vq_address,
vq->desc_addr = desc_area;
vq->driver_addr = driver_area
vq->device_addr = device_area
.set_vq_num = vdpasim_set_vq_num, -> vq->num = num
.kick_vq = vdpasim_kick_vq, -> vdpasim_schedule_work(vdpasim) -> vdpasim_work_fn -> ключевая функция, Когда пользовательский режим Гость готов к вводу-выводу После того как BUF уведомляется VQ, выполняется эта функция обработки ввода-вывода.
vdpasim->dev_attr.work_fn(vdpasim) -> vdpasim_blk_work -> handle IO
.set_vq_cb = vdpasim_set_vq_cb,
vq->cb = cb->callback
vq->private = cb->private
.set_vq_ready = vdpasim_set_vq_ready,
vdpasim_queue_ready(vdpasim, idx)
vq->vring.last_avail_idx = last_avail_idx;
vq->vring.last_used_idx = last_avail_idx
vq->vring.notify = vdpasim_vq_notify
vq->cb(vq->private)
.get_vq_ready = vdpasim_get_vq_ready,
.set_vq_state = vdpasim_set_vq_state,
vrh->last_avail_idx = state->split.avail_index
.get_vendor_vq_stats = vdpasim_get_vq_stats,
.get_vq_state = vdpasim_get_vq_state,
.get_vq_align = vdpasim_get_vq_align, -> #define VDPASIM_QUEUE_ALIGN PAGE_SIZE -> 4K
.get_vq_group = vdpasim_get_vq_group,
.get_device_features = vdpasim_get_device_features,
vdpasim->dev_attr.supported_features
.get_backend_features = vdpasim_get_backend_features,
BIT_ULL(VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK)
.set_driver_features = vdpasim_set_driver_features,
.get_driver_features = vdpasim_get_driver_features,
.set_config_cb = vdpasim_set_config_cb,
.get_vq_num_max = vdpasim_get_vq_num_max,
.get_device_id = vdpasim_get_device_id,
.get_vendor_id = vdpasim_get_vendor_id,
.get_status = vdpasim_get_status,
.set_status = vdpasim_set_status,
vdpasim->status = status
.reset= vdpasim_reset,
.compat_reset= vdpasim_compat_reset,
vdpasim_do_reset(vdpasim, flags)
for (i = 0; i < vdpasim->dev_attr.nvqs; i++)
vdpasim_vq_reset(vdpasim, &vdpasim->vqs[i])
vq->ready = false;
vq->desc_addr = 0;
vq->driver_addr = 0;
vq->device_addr = 0;
vq->cb = NULL;
vq->private = NULL;
vringh_init_iotlb(&vq->vring, vdpasim->dev_attr.supported_features, VDPASIM_QUEUE_MAX, false, NULL, NULL, NULL);
vq->vring.notify = NULL;
vringh_set_iotlb(&vdpasim->vqs[i].vring, &vdpasim->iommu[0], &vdpasim->iommu_lock)
for (i = 0; i < vdpasim->dev_attr.nas; i++)
vhost_iotlb_reset(&vdpasim->iommu[i])
vhost_iotlb_add_range(&vdpasim->iommu[i], 0, ULONG_MAX, 0, VHOST_MAP_RW)
.suspend= vdpasim_suspend,
vdpasim->running = false
.resume= vdpasim_resume,
if (vdpasim->pending_kick)
for (i = 0; i < vdpasim->dev_attr.nvqs; ++i)
vdpasim_kick_vq(vdpa, i)
.get_config_size = vdpasim_get_config_size,
.get_config = vdpasim_get_config,
.set_config = vdpasim_set_config,
vdpasim->dev_attr.set_config(vdpasim, vdpasim->config) -> транзит
.get_generation = vdpasim_get_generation,
.get_iova_range = vdpasim_get_iova_range,
.set_group_asid = vdpasim_set_group_asid,
.dma_map = vdpasim_dma_map,
vhost_iotlb_add_range_ctx(&vdpasim->iommu[asid], iova, iova + size - 1, pa, perm, opaque)
.dma_unmap = vdpasim_dma_unmap,
vhost_iotlb_reset(&vdpasim->iommu[asid])
vhost_iotlb_del_range(&vdpasim->iommu[asid], iova, iova + size - 1)
.reset_map = vdpasim_reset_map,
.bind_mm= vdpasim_bind_mm,
mm_work.mm_to_bind = mm
vdpasim_worker_change_mm_sync(vdpasim, &mm_work)
vdpasim_mm_work_fn
vdpasim->mm_bound = mm_work->mm_to_bind
.unbind_mm= vdpasim_unbind_mm,
.free = vdpasim_free,
};
vdpa, linux commit: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4c8cf31885f69e86be0b5b9e6677a26797365e1d
modprobe vdpa
core_initcall(vdpa_init) -> vDPA:представлять vDPA Автобус, в ДПА Устройство предназначено для использования в соответствии с virtio Норма изпуть к данных и с путями управления устройствами, зависящими от поставщика. в ДПА Устройства могут быть физически расположены на оборудовании или эмулироваться с помощью программного обеспечения.vDPA Аппаратные устройства обычно проходят PCIE Реализация следующих типов: - ПФ (физическая функция) - единственная физическая функция - VF (виртуальная функция) - поддерживатьодин корень I/O виртуализация(SR-IOV)оборудования. Его виртуальная функция (VF) представляет собой экземпляр виртуализации устройства и может быть назначена различным разделам. - ADI (интерфейс назначаемых устройств) и его эквиваленты - использовать Intel Расширяемый IOV и другие технологии, в зависимости от операционной системы хоста. Используйте один или несколько ADI Состоит из виртуального устройства (VDEV). или является его эквивалентом, например Mellanox из СФ (подфункция). >отводительизперспектива,в соответствии с DMA Преобразование по пути и положению, vDPA Устройства делятся на два типа: - Платформа зависит от DMA Конвертировать - отводительизперспектива,оборудование Можетсуществоватьоборудование访问内житьсерединаиз数据受到предели/или Конвертироватьизна платформеиспользовать。одинпримерда PCIE в ДПА, который DMA Запросы выполняются через шину (например. PCIE) зависит от метки режима. прямой доступ к памяти Конвертироватьи Защищатьсуществовать PCIE автобус IOMMU Уровень пройден. - Зависит от устройства DMA Конвертировать - Устройство реализовано через собственную логику. DMA Изоляция и защита. Пример — это часть использования IOMMU из vDPA оборудование. спрятать vDPA Устройство/ИОММУ Варианты из вышеперечисленных типов, различия и сложности и для того, чтобы показать общее из верхних слоев virtio Устройствам требуется аппаратно-независимая платформа. Этот патч представляет программное обеспечение vDPA автобус,это абстрагирует vDPA Устройство, в ДПА автобусводительизобщие атрибуты, а также vDPA Абстрактные устройства vDPA автобусводитель之间из通信方法 (vdpa_config_ops). Это позволяет использовать несколько типов драйверов. vDPA оборудование, такое как virtio_vdpa и vhost_vdpa водительсуществоватьавтобусбеги дальше,и позвольте Ядро virtio Драйвер или пользовательское пространство vhost Драйвериспользовать vDPA оборудование: -> commit: https://github.com/ssbandjl/linux/commit/961e9c84077f6c8579d7a628cbe94a675cb67ae4, путем спаривания vDPA автобуси vDPA автобусэксплуатацияабстрактный,Основные аппаратные различия и сложности скрыты от верхних уровней. верхний уровень vDPA автобусводитель Можетиспользоватьединыйиз vdpa_config_ops контролировать различные типы из vDPA оборудование
virtio drivers vhost drivers
| |
[virtio bus] [vhost uAPI]
| |
virtio device vhost device
virtio_vdpa drv vhost_vdpa drv
\ /
[vDPA bus]
|
vDPA device
hardware drv
|
[hardware bus]
|
vDPA hardware
root@host101:/dev# tree -L 100 /sys/bus/vdpa/
/sys/bus/vdpa/
├── devices
├── drivers
├── drivers_autoprobe
├── drivers_probe
└── uevent
modprobe -a virtio-vdpa vhost-vdpa
root@host101:/sys/bus/vdpa# tree -L 10
.
├── devices
├── drivers
│ ├── vhost_vdpa
│ │ ├── bind
│ │ ├── module -> ../../../../module/vhost_vdpa
│ │ ├── uevent
│ │ └── unbind
│ └── virtio_vdpa
│ ├── bind
│ ├── module -> ../../../../module/virtio_vdpa
│ ├── uevent
│ └── unbind
├── drivers_autoprobe
├── drivers_probe
└── uevent
root@host101:/sys/bus/vdpa# vdpa dev add mgmtdev vdpasim_blk name vdpa0
root@host101:/sys/bus/vdpa# tree -L 10
.
├── devices
│ └── vdpa0 -> ../../../devices/vdpa0
├── drivers
│ ├── vhost_vdpa
│ │ ├── bind
│ │ ├── module -> ../../../../module/vhost_vdpa
│ │ ├── uevent
│ │ └── unbind
│ └── virtio_vdpa
│ ├── bind
│ ├── module -> ../../../../module/virtio_vdpa
│ ├── uevent
│ ├── unbind
│ └── vdpa0 -> ../../../../devices/vdpa0
├── drivers_autoprobe
├── drivers_probe
└── ueven
https://stefano-garzarella.github.io/posts/2024-02-12-vdpa-blk/
kernel: drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
блог: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts
https://chattoyou.cn(Подавать жалобы/сообщение)
https://cloud.tencent.com/developer/column/101987
Технические друзья: Добро пожаловать в DPU/SmartNIC/Uninstall/Network.,жить储加速/Интересуются такими технологиями, как изоляция безопасностииз Друзья присоединяйтесьТехнология ДПУКоммуникационная группа