[v3,3/5] vhost: prepare memory regions addresses
Checks
Commit Message
Prepare memory regions guest physical addresses for vectorized data
path. These information will be utilized by SIMD instructions to find
matched region index.
Signed-off-by: Marvin Liu <yong.liu@intel.com>
@@ -52,6 +52,8 @@
#define ASYNC_MAX_POLL_SEG 255
+#define MAX_NREGIONS 8
+
#define VHOST_MAX_ASYNC_IT (MAX_PKT_BURST * 2)
#define VHOST_MAX_ASYNC_VEC (BUF_VECTOR_MAX * 2)
@@ -349,6 +351,11 @@ struct inflight_mem_info {
uint64_t size;
};
+struct mem_regions_range {
+ uint64_t regions_low_addrs[MAX_NREGIONS];
+ uint64_t regions_high_addrs[MAX_NREGIONS];
+};
+
/**
* Device structure contains all configuration information relating
* to the device.
@@ -356,6 +363,7 @@ struct inflight_mem_info {
struct virtio_net {
/* Frontend (QEMU) memory and memory region information */
struct rte_vhost_memory *mem;
+ struct mem_regions_range *regions_range;
uint64_t features;
uint64_t protocol_features;
int vid;
@@ -185,6 +185,11 @@ vhost_backend_cleanup(struct virtio_net *dev)
dev->inflight_info = NULL;
}
+ if (dev->regions_range) {
+ free(dev->regions_range);
+ dev->regions_range = NULL;
+ }
+
if (dev->slave_req_fd >= 0) {
close(dev->slave_req_fd);
dev->slave_req_fd = -1;
@@ -1230,6 +1235,27 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg,
}
}
+ RTE_BUILD_BUG_ON(VHOST_MEMORY_MAX_NREGIONS != 8);
+ if (dev->vectorized) {
+ if (dev->regions_range == NULL) {
+ dev->regions_range = calloc(1,
+ sizeof(struct mem_regions_range));
+ if (!dev->regions_range) {
+ VHOST_LOG_CONFIG(ERR,
+ "failed to alloc dev vectorized area\n");
+ return RTE_VHOST_MSG_RESULT_ERR;
+ }
+ }
+
+ for (i = 0; i < memory->nregions; i++) {
+ dev->regions_range->regions_low_addrs[i] =
+ memory->regions[i].guest_phys_addr;
+ dev->regions_range->regions_high_addrs[i] =
+ memory->regions[i].guest_phys_addr +
+ memory->regions[i].memory_size;
+ }
+ }
+
for (i = 0; i < dev->nr_vring; i++) {
struct vhost_virtqueue *vq = dev->virtqueue[i];