vhost: setup iovs even for empty descriptors
This ensures that SPDK will detect descriptor chains that are too long. The additional check in vhost block stands as an optimization and makes us fail the corrupted I/O early. Change-Id: Icceaa0dd938dca96a1872e5ee96bf6a151fdd9e7 Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Signed-off-by: Dima Stepanov <dstepanov.src@gmail.com> Reviewed-on: https://review.gerrithub.io/c/433641 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
174613bf4d
commit
d555e54681
@ -468,7 +468,7 @@ spdk_vhost_vring_desc_to_iov(struct spdk_vhost_session *vsession, struct iovec *
|
||||
uintptr_t payload = desc->addr;
|
||||
uintptr_t vva;
|
||||
|
||||
while (remaining) {
|
||||
do {
|
||||
if (*iov_index >= SPDK_VHOST_IOVS_MAX) {
|
||||
SPDK_ERRLOG("SPDK_VHOST_IOVS_MAX(%d) reached\n", SPDK_VHOST_IOVS_MAX);
|
||||
return -1;
|
||||
@ -503,7 +503,7 @@ spdk_vhost_vring_desc_to_iov(struct spdk_vhost_session *vsession, struct iovec *
|
||||
remaining -= len;
|
||||
payload += len;
|
||||
(*iov_index)++;
|
||||
}
|
||||
} while (remaining);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -126,6 +126,7 @@ blk_iovs_setup(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtq
|
||||
struct vring_desc *desc, *desc_table;
|
||||
uint16_t out_cnt = 0, cnt = 0;
|
||||
uint32_t desc_table_size, len = 0;
|
||||
uint32_t desc_handled_cnt;
|
||||
int rc;
|
||||
|
||||
rc = spdk_vhost_vq_get_desc(vsession, vq, req_idx, &desc, &desc_table, &desc_table_size);
|
||||
@ -134,6 +135,7 @@ blk_iovs_setup(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtq
|
||||
return -1;
|
||||
}
|
||||
|
||||
desc_handled_cnt = 0;
|
||||
while (1) {
|
||||
/*
|
||||
* Maximum cnt reached?
|
||||
@ -163,6 +165,14 @@ blk_iovs_setup(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtq
|
||||
} else if (desc == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
desc_handled_cnt++;
|
||||
if (spdk_unlikely(desc_handled_cnt > desc_table_size)) {
|
||||
/* Break a cycle and report an error, if any. */
|
||||
SPDK_ERRLOG("%s: found a cycle in the descriptor chain: desc_table_size = %d, desc_handled_cnt = %d.\n",
|
||||
vdev->name, desc_table_size, desc_handled_cnt);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user