vDPA: поддержка блочных устройств в Linux и QEMU, а также устройство моделирования блоков ядра VDPA анализ исходного кода vdpa-sim-blk
vDPA: поддержка блочных устройств в Linux и QEMU, а также устройство моделирования блоков ядра VDPA анализ исходного кода vdpa-sim-blk

Использование libblkio, демона хранилища QEMU и VDUSE

vDPA оборудованиеэто своего рода следованиепуть к данным virtioСтандартный, но сПуть управления, зависящий от поставщика, изоборудование。

Устройства vDPA могут быть физически расположены на оборудовании или эмулироваться с помощью программного обеспечения.

картина
картина

Только маленький vDPA Родительский драйвер обрабатывает путь управления. Основные преимущества все vDPA оборудование У всех естьУнифицированный программный стек:

  • для пользовательского пространства или клиента virtio драйвер изvhost интерфейс(vhost-vdpa),Напримерсуществовать QEMU Запустить виртуальную машину в
  • virtio интерфейс(virtio-vdpa),Используется для работы на голом металле или заявка на контейнеризацию
  • Используется для создания экземпляров устройств и конфигураций. virtio параметризуправлятьинтерфейс(vdpa netlink)

Полезные ресурсы

В последние годы было опубликовано множество сообщений в блогах и выступлений, которые могут помочь вам лучше понять vDPA и варианты использования. Мы собрали некоторые из них на vdpa-dev.gitlab.io. Я рекомендую вам изучить как минимум следующее:

  • vDPAЯдрорамкапредставлять
  • представлять VDUSE:virtio из Определение программного обеспеченияпуть к данным

блокирующее устройство

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 блокирующее устройство Подключитесь к виртуальной машине:

Язык кода:javascript
копировать
  -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:

Язык кода:javascript
копировать
   -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:

Язык кода:javascript
копировать
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。Это усовершенствование позволяетсуществовать运行час进行动态重新配置,оти позвольтеоборудование以Этот вид方式отодин кусочекавтобус迁移到另один кусочекавтобус:

Язык кода:javascript
копировать
# 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 оборудованиеизлюбое оборудование。

Образы qcow2 доступны для хост-приложений и контейнеров.

Язык кода:javascript
копировать
# 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

Запустите виртуальную машину с помощью устройства vDPA.

Язык кода:javascript
копировать
# 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


Вы также можете посмотреть
  • SOCAT сейчассуществоватьподдерживать AF_VSOCK
  • AF_VSOCK: обеспечивает вложенную виртуальную машину и поддержку обратной связи.
  • QEMU 4.2 mmap(2)s Ядрои initrd
  • KVM форум 2019:QEMU、Firecracker и Linux серединаиз virtio-vsock
  • какиспользовать QEMU/KVM Измерение Linux VM из Время начала

Сравнение vhost-vdpa-device-pci и virtio-blk-vhost-vdpa

Тип устройства QEMU

быстрый путь

QEMU перехватывает запросы

vhost-vdpa-device-pci (более общий)

поддерживать

Нетподдерживать

virtio-blk-vhost-vdpa (работает с libblkio)

Нетподдерживать

поддерживать(живая миграция,формат диска,управление потоком ввода-вывода и т. д.)

Анализ исходного кода устройства Linux vdpa-sim-blk

Загрузочный модуль

Язык кода:javascript
копировать
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
};

Добавить устройство и функцию обработки ввода-вывода (рабочая очередь)

Язык кода:javascript
копировать
# 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)

Реализовать функцию обратного вызова vdpa

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
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

Сяобин (ssbandjl)

блог: 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.,жить储加速/Интересуются такими технологиями, как изоляция безопасностииз Друзья присоединяйтесьТехнология ДПУКоммуникационная группа

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose