-no-shutdown \
-boot strict=on \
-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=0,fd=XXXXXXX,opaque=libvirt-1-storage-vdpa \
+-add-fd set=0,fd=@vdpa-libvirt-1-storage-fd@,opaque=libvirt-1-storage-vdpa \
-blockdev '{"driver":"virtio-blk-vhost-vdpa","path":"/dev/fdset/0","node-name":"libvirt-1-storage","read-only":false,"cache":{"direct":true,"no-flush":false}}' \
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x2","drive":"libvirt-1-storage","id":"virtio-disk0","bootindex":1,"write-cache":"on"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
STREQ(disk->src->path, "/dev/cdrom"))
disk->src->hostcdrom = true;
- if (info->args.vdpafds) {
- for (src = disk->src; virStorageSourceIsBacking(src); src = src->backingStore) {
- gpointer value;
-
- if (src->type != VIR_STORAGE_TYPE_VHOST_VDPA)
- continue;
-
- if ((value = g_hash_table_lookup(info->args.vdpafds, src->vdpadev))) {
- int fd = GPOINTER_TO_INT(value);
- qemuDomainStorageSourcePrivate *srcpriv;
- VIR_AUTOCLOSE fakefd = open("/dev/zero", O_RDWR);
-
- if (fcntl(fd, F_GETFD) != -1) {
- fprintf(stderr, "fd '%d' is already in use\n", fd);
- abort();
- }
-
- if (dup2(fakefd, fd) < 0) {
- fprintf(stderr, "failed to duplicate fake fd: %s",
- g_strerror(errno));
- abort();
- }
-
- srcpriv = qemuDomainStorageSourcePrivateFetch(src);
-
- srcpriv->fdpass = qemuFDPassNew(qemuBlockStorageSourceGetStorageNodename(src), priv);
- qemuFDPassAddFD(srcpriv->fdpass, &fd, "-vdpa");
- }
+ for (src = disk->src; virStorageSourceIsBacking(src); src = src->backingStore) {
+ if (src->type == VIR_STORAGE_TYPE_VHOST_VDPA) {
+ qemuDomainStorageSourcePrivate *srcpriv = qemuDomainStorageSourcePrivateFetch(src);
+ int fd = virTestMakeDummyFD(g_strdup_printf("@vdpa-%s-fd@",
+ qemuBlockStorageSourceGetStorageNodename(src)));
+
+ srcpriv->fdpass = qemuFDPassNew(qemuBlockStorageSourceGetStorageNodename(src), priv);
+ qemuFDPassAddFD(srcpriv->fdpass, &fd, "-vdpa");
}
}
}