Lines Matching refs:hdev

62     struct vhost_dev *hdev;  in vhost_get_max_memslots()  local
64 QLIST_FOREACH(hdev, &vhost_devices, entry) { in vhost_get_max_memslots()
65 max = MIN(max, hdev->vhost_ops->vhost_backend_memslots_limit(hdev)); in vhost_get_max_memslots()
73 struct vhost_dev *hdev; in vhost_get_free_memslots() local
75 QLIST_FOREACH(hdev, &vhost_devices, entry) { in vhost_get_free_memslots()
76 unsigned int r = hdev->vhost_ops->vhost_backend_memslots_limit(hdev); in vhost_get_free_memslots()
79 if (hdev->vhost_ops->vhost_backend_no_private_memslots && in vhost_get_free_memslots()
80 hdev->vhost_ops->vhost_backend_no_private_memslots(hdev)) { in vhost_get_free_memslots()
162 static inline void vhost_dev_elect_mem_logger(struct vhost_dev *hdev, bool add) in vhost_dev_elect_mem_logger() argument
166 assert(hdev->vhost_ops); in vhost_dev_elect_mem_logger()
168 backend_type = hdev->vhost_ops->backend_type; in vhost_dev_elect_mem_logger()
172 if (add && !QLIST_IS_INSERTED(hdev, logdev_entry)) { in vhost_dev_elect_mem_logger()
175 hdev, logdev_entry); in vhost_dev_elect_mem_logger()
187 hdev, logdev_entry); in vhost_dev_elect_mem_logger()
189 } else if (!add && QLIST_IS_INSERTED(hdev, logdev_entry)) { in vhost_dev_elect_mem_logger()
190 QLIST_REMOVE(hdev, logdev_entry); in vhost_dev_elect_mem_logger()
865 struct vhost_dev *hdev = iommu->hdev; in vhost_iommu_unmap_notify() local
868 if (vhost_backend_invalidate_device_iotlb(hdev, iova, in vhost_iommu_unmap_notify()
906 iommu->hdev = dev; in vhost_iommu_region_add()
1190 static int vhost_memory_region_lookup(struct vhost_dev *hdev, in vhost_memory_region_lookup() argument
1196 for (i = 0; i < hdev->mem->nregions; i++) { in vhost_memory_region_lookup()
1197 struct vhost_memory_region *reg = hdev->mem->regions + i; in vhost_memory_region_lookup()
1509 int vhost_dev_init(struct vhost_dev *hdev, void *opaque, in vhost_dev_init() argument
1517 hdev->vdev = NULL; in vhost_dev_init()
1518 hdev->migration_blocker = NULL; in vhost_dev_init()
1520 r = vhost_set_backend_type(hdev, backend_type); in vhost_dev_init()
1523 r = hdev->vhost_ops->vhost_backend_init(hdev, opaque, errp); in vhost_dev_init()
1528 r = hdev->vhost_ops->vhost_set_owner(hdev); in vhost_dev_init()
1534 r = hdev->vhost_ops->vhost_get_features(hdev, &features); in vhost_dev_init()
1540 limit = hdev->vhost_ops->vhost_backend_memslots_limit(hdev); in vhost_dev_init()
1553 for (i = 0; i < hdev->nvqs; ++i, ++n_initialized_vqs) { in vhost_dev_init()
1554 r = vhost_virtqueue_init(hdev, hdev->vqs + i, hdev->vq_index + i); in vhost_dev_init()
1562 for (i = 0; i < hdev->nvqs; ++i) { in vhost_dev_init()
1563 r = vhost_virtqueue_set_busyloop_timeout(hdev, hdev->vq_index + i, in vhost_dev_init()
1572 hdev->features = features; in vhost_dev_init()
1574 hdev->memory_listener = (MemoryListener) { in vhost_dev_init()
1588 hdev->iommu_listener = (MemoryListener) { in vhost_dev_init()
1594 if (hdev->migration_blocker == NULL) { in vhost_dev_init()
1595 if (!(hdev->features & (0x1ULL << VHOST_F_LOG_ALL))) { in vhost_dev_init()
1596 error_setg(&hdev->migration_blocker, in vhost_dev_init()
1598 } else if (vhost_dev_log_is_shared(hdev) && !qemu_memfd_alloc_check()) { in vhost_dev_init()
1599 error_setg(&hdev->migration_blocker, in vhost_dev_init()
1604 if (hdev->migration_blocker != NULL) { in vhost_dev_init()
1605 r = migrate_add_blocker_normal(&hdev->migration_blocker, errp); in vhost_dev_init()
1611 hdev->mem = g_malloc0(offsetof(struct vhost_memory, regions)); in vhost_dev_init()
1612 hdev->n_mem_sections = 0; in vhost_dev_init()
1613 hdev->mem_sections = NULL; in vhost_dev_init()
1614 hdev->log = NULL; in vhost_dev_init()
1615 hdev->log_size = 0; in vhost_dev_init()
1616 hdev->log_enabled = false; in vhost_dev_init()
1617 hdev->started = false; in vhost_dev_init()
1618 memory_listener_register(&hdev->memory_listener, &address_space_memory); in vhost_dev_init()
1619 QLIST_INSERT_HEAD(&vhost_devices, hdev, entry); in vhost_dev_init()
1625 if (hdev->vhost_ops->vhost_backend_no_private_memslots && in vhost_dev_init()
1626 hdev->vhost_ops->vhost_backend_no_private_memslots(hdev)) { in vhost_dev_init()
1651 vhost_virtqueue_set_busyloop_timeout(hdev, hdev->vq_index + i, 0); in vhost_dev_init()
1655 hdev->nvqs = n_initialized_vqs; in vhost_dev_init()
1656 vhost_dev_cleanup(hdev); in vhost_dev_init()
1660 void vhost_dev_cleanup(struct vhost_dev *hdev) in vhost_dev_cleanup() argument
1664 trace_vhost_dev_cleanup(hdev); in vhost_dev_cleanup()
1666 for (i = 0; i < hdev->nvqs; ++i) { in vhost_dev_cleanup()
1667 vhost_virtqueue_cleanup(hdev->vqs + i); in vhost_dev_cleanup()
1669 if (hdev->mem) { in vhost_dev_cleanup()
1671 memory_listener_unregister(&hdev->memory_listener); in vhost_dev_cleanup()
1672 QLIST_REMOVE(hdev, entry); in vhost_dev_cleanup()
1674 migrate_del_blocker(&hdev->migration_blocker); in vhost_dev_cleanup()
1675 g_free(hdev->mem); in vhost_dev_cleanup()
1676 g_free(hdev->mem_sections); in vhost_dev_cleanup()
1677 if (hdev->vhost_ops) { in vhost_dev_cleanup()
1678 hdev->vhost_ops->vhost_backend_cleanup(hdev); in vhost_dev_cleanup()
1680 assert(!hdev->log); in vhost_dev_cleanup()
1682 memset(hdev, 0, sizeof(struct vhost_dev)); in vhost_dev_cleanup()
1685 static void vhost_dev_disable_notifiers_nvqs(struct vhost_dev *hdev, in vhost_dev_disable_notifiers_nvqs() argument
1699 r = virtio_bus_set_host_notifier(VIRTIO_BUS(qbus), hdev->vq_index + i, in vhost_dev_disable_notifiers_nvqs()
1714 virtio_bus_cleanup_host_notifier(VIRTIO_BUS(qbus), hdev->vq_index + i); in vhost_dev_disable_notifiers_nvqs()
1722 int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) in vhost_dev_enable_notifiers() argument
1742 for (i = 0; i < hdev->nvqs; ++i) { in vhost_dev_enable_notifiers()
1743 r = virtio_bus_set_host_notifier(VIRTIO_BUS(qbus), hdev->vq_index + i, in vhost_dev_enable_notifiers()
1748 vhost_dev_disable_notifiers_nvqs(hdev, vdev, i); in vhost_dev_enable_notifiers()
1763 void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) in vhost_dev_disable_notifiers() argument
1765 vhost_dev_disable_notifiers_nvqs(hdev, vdev, hdev->nvqs); in vhost_dev_disable_notifiers()
1771 bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n) in vhost_virtqueue_pending() argument
1773 struct vhost_virtqueue *vq = hdev->vqs + n - hdev->vq_index; in vhost_virtqueue_pending()
1774 assert(n >= hdev->vq_index && n < hdev->vq_index + hdev->nvqs); in vhost_virtqueue_pending()
1779 void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, in vhost_virtqueue_mask() argument
1783 int r, index = n - hdev->vq_index; in vhost_virtqueue_mask()
1787 assert(hdev->vhost_ops); in vhost_virtqueue_mask()
1791 file.fd = event_notifier_get_wfd(&hdev->vqs[index].masked_notifier); in vhost_virtqueue_mask()
1796 file.index = hdev->vhost_ops->vhost_get_vq_index(hdev, n); in vhost_virtqueue_mask()
1797 r = hdev->vhost_ops->vhost_set_vring_call(hdev, &file); in vhost_virtqueue_mask()
1803 bool vhost_config_pending(struct vhost_dev *hdev) in vhost_config_pending() argument
1805 assert(hdev->vhost_ops); in vhost_config_pending()
1806 if ((hdev->started == false) || in vhost_config_pending()
1807 (hdev->vhost_ops->vhost_set_config_call == NULL)) { in vhost_config_pending()
1812 &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier; in vhost_config_pending()
1816 void vhost_config_mask(struct vhost_dev *hdev, VirtIODevice *vdev, bool mask) in vhost_config_mask() argument
1821 &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier; in vhost_config_mask()
1823 assert(hdev->vhost_ops); in vhost_config_mask()
1825 if ((hdev->started == false) || in vhost_config_mask()
1826 (hdev->vhost_ops->vhost_set_config_call == NULL)) { in vhost_config_mask()
1835 r = hdev->vhost_ops->vhost_set_config_call(hdev, fd); in vhost_config_mask()
1864 uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits, in vhost_get_features() argument
1870 if (!(hdev->features & bit_mask)) { in vhost_get_features()
1878 void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits, in vhost_ack_features() argument
1885 hdev->acked_features |= bit_mask; in vhost_ack_features()
1891 int vhost_dev_get_config(struct vhost_dev *hdev, uint8_t *config, in vhost_dev_get_config() argument
1894 assert(hdev->vhost_ops); in vhost_dev_get_config()
1896 if (hdev->vhost_ops->vhost_get_config) { in vhost_dev_get_config()
1897 return hdev->vhost_ops->vhost_get_config(hdev, config, config_len, in vhost_dev_get_config()
1905 int vhost_dev_set_config(struct vhost_dev *hdev, const uint8_t *data, in vhost_dev_set_config() argument
1908 assert(hdev->vhost_ops); in vhost_dev_set_config()
1910 if (hdev->vhost_ops->vhost_set_config) { in vhost_dev_set_config()
1911 return hdev->vhost_ops->vhost_set_config(hdev, data, offset, in vhost_dev_set_config()
1918 void vhost_dev_set_config_notifier(struct vhost_dev *hdev, in vhost_dev_set_config_notifier() argument
1921 hdev->config_ops = ops; in vhost_dev_set_config_notifier()
1989 int vhost_dev_prepare_inflight(struct vhost_dev *hdev, VirtIODevice *vdev) in vhost_dev_prepare_inflight() argument
1993 if (hdev->vhost_ops->vhost_get_inflight_fd == NULL || in vhost_dev_prepare_inflight()
1994 hdev->vhost_ops->vhost_set_inflight_fd == NULL) { in vhost_dev_prepare_inflight()
1998 hdev->vdev = vdev; in vhost_dev_prepare_inflight()
2000 r = vhost_dev_set_features(hdev, hdev->log_enabled); in vhost_dev_prepare_inflight()
2041 static int vhost_dev_set_vring_enable(struct vhost_dev *hdev, int enable) in vhost_dev_set_vring_enable() argument
2043 if (!hdev->vhost_ops->vhost_set_vring_enable) { in vhost_dev_set_vring_enable()
2053 if (hdev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER && in vhost_dev_set_vring_enable()
2054 !virtio_has_feature(hdev->backend_features, in vhost_dev_set_vring_enable()
2059 return hdev->vhost_ops->vhost_set_vring_enable(hdev, enable); in vhost_dev_set_vring_enable()
2069 int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) in vhost_dev_start() argument
2074 assert(hdev->vhost_ops); in vhost_dev_start()
2076 trace_vhost_dev_start(hdev, vdev->name, vrings); in vhost_dev_start()
2079 hdev->started = true; in vhost_dev_start()
2080 hdev->vdev = vdev; in vhost_dev_start()
2082 r = vhost_dev_set_features(hdev, hdev->log_enabled); in vhost_dev_start()
2087 if (vhost_dev_has_iommu(hdev)) { in vhost_dev_start()
2088 memory_listener_register(&hdev->iommu_listener, vdev->dma_as); in vhost_dev_start()
2091 r = hdev->vhost_ops->vhost_set_mem_table(hdev, hdev->mem); in vhost_dev_start()
2096 for (i = 0; i < hdev->nvqs; ++i) { in vhost_dev_start()
2097 r = vhost_virtqueue_start(hdev, in vhost_dev_start()
2099 hdev->vqs + i, in vhost_dev_start()
2100 hdev->vq_index + i); in vhost_dev_start()
2107 &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier, 0); in vhost_dev_start()
2113 &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier); in vhost_dev_start()
2115 vhost_config_mask(hdev, vdev, true); in vhost_dev_start()
2117 if (hdev->log_enabled) { in vhost_dev_start()
2120 hdev->log_size = vhost_get_log_size(hdev); in vhost_dev_start()
2121 hdev->log = vhost_log_get(hdev->vhost_ops->backend_type, in vhost_dev_start()
2122 hdev->log_size, in vhost_dev_start()
2123 vhost_dev_log_is_shared(hdev)); in vhost_dev_start()
2124 log_base = (uintptr_t)hdev->log->log; in vhost_dev_start()
2125 r = hdev->vhost_ops->vhost_set_log_base(hdev, in vhost_dev_start()
2126 hdev->log_size ? log_base : 0, in vhost_dev_start()
2127 hdev->log); in vhost_dev_start()
2132 vhost_dev_elect_mem_logger(hdev, true); in vhost_dev_start()
2135 r = vhost_dev_set_vring_enable(hdev, true); in vhost_dev_start()
2140 if (hdev->vhost_ops->vhost_dev_start) { in vhost_dev_start()
2141 r = hdev->vhost_ops->vhost_dev_start(hdev, true); in vhost_dev_start()
2146 if (vhost_dev_has_iommu(hdev) && in vhost_dev_start()
2147 hdev->vhost_ops->vhost_set_iotlb_callback) { in vhost_dev_start()
2148 hdev->vhost_ops->vhost_set_iotlb_callback(hdev, true); in vhost_dev_start()
2152 for (i = 0; i < hdev->nvqs; ++i) { in vhost_dev_start()
2153 struct vhost_virtqueue *vq = hdev->vqs + i; in vhost_dev_start()
2154 vhost_device_iotlb_miss(hdev, vq->used_phys, true); in vhost_dev_start()
2157 vhost_start_config_intr(hdev); in vhost_dev_start()
2161 vhost_dev_set_vring_enable(hdev, false); in vhost_dev_start()
2164 vhost_log_put(hdev, false); in vhost_dev_start()
2167 vhost_virtqueue_stop(hdev, in vhost_dev_start()
2169 hdev->vqs + i, in vhost_dev_start()
2170 hdev->vq_index + i); in vhost_dev_start()
2174 if (vhost_dev_has_iommu(hdev)) { in vhost_dev_start()
2175 memory_listener_unregister(&hdev->iommu_listener); in vhost_dev_start()
2179 hdev->started = false; in vhost_dev_start()
2184 void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) in vhost_dev_stop() argument
2189 assert(hdev->vhost_ops); in vhost_dev_stop()
2191 &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier); in vhost_dev_stop()
2194 &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier); in vhost_dev_stop()
2196 trace_vhost_dev_stop(hdev, vdev->name, vrings); in vhost_dev_stop()
2198 if (hdev->vhost_ops->vhost_dev_start) { in vhost_dev_stop()
2199 hdev->vhost_ops->vhost_dev_start(hdev, false); in vhost_dev_stop()
2202 vhost_dev_set_vring_enable(hdev, false); in vhost_dev_stop()
2204 for (i = 0; i < hdev->nvqs; ++i) { in vhost_dev_stop()
2205 vhost_virtqueue_stop(hdev, in vhost_dev_stop()
2207 hdev->vqs + i, in vhost_dev_stop()
2208 hdev->vq_index + i); in vhost_dev_stop()
2210 if (hdev->vhost_ops->vhost_reset_status) { in vhost_dev_stop()
2211 hdev->vhost_ops->vhost_reset_status(hdev); in vhost_dev_stop()
2214 if (vhost_dev_has_iommu(hdev)) { in vhost_dev_stop()
2215 if (hdev->vhost_ops->vhost_set_iotlb_callback) { in vhost_dev_stop()
2216 hdev->vhost_ops->vhost_set_iotlb_callback(hdev, false); in vhost_dev_stop()
2218 memory_listener_unregister(&hdev->iommu_listener); in vhost_dev_stop()
2220 vhost_stop_config_intr(hdev); in vhost_dev_stop()
2221 vhost_log_put(hdev, true); in vhost_dev_stop()
2222 hdev->started = false; in vhost_dev_stop()
2224 hdev->vdev = NULL; in vhost_dev_stop()
2227 int vhost_net_set_backend(struct vhost_dev *hdev, in vhost_net_set_backend() argument
2230 if (hdev->vhost_ops->vhost_net_set_backend) { in vhost_net_set_backend()
2231 return hdev->vhost_ops->vhost_net_set_backend(hdev, file); in vhost_net_set_backend()
2237 int vhost_reset_device(struct vhost_dev *hdev) in vhost_reset_device() argument
2239 if (hdev->vhost_ops->vhost_reset_device) { in vhost_reset_device()
2240 return hdev->vhost_ops->vhost_reset_device(hdev); in vhost_reset_device()