/* * vr_dpdk_virtio_recover_vring_base - recovers the vring base from the shared * memory after vRouter crash. * * Returns 0 on success, -1 otherwise. */ int vr_dpdk_virtio_recover_vring_base(unsigned int vif_idx, unsigned int vring_idx) { vr_dpdk_virtioq_t *vq; if ((vif_idx >= VR_MAX_INTERFACES) || (vring_idx >= (2 * VR_DPDK_VIRTIO_MAX_QUEUES))) { return -1; } if (vring_idx & 1) { vq = &vr_dpdk_virtio_rxqs[vif_idx][vring_idx/2]; } else { vq = &vr_dpdk_virtio_txqs[vif_idx][vring_idx/2]; } if (vq->vdv_used) { /* Reading base index from the shared memory. */ if (vq->vdv_last_used_idx != vq->vdv_used->idx) { RTE_LOG(INFO, UVHOST, " recovering vring base %d -> %d\n", vq->vdv_last_used_idx, vq->vdv_used->idx); vr_dpdk_virtio_set_vring_base(vif_idx, vring_idx, vq->vdv_used->idx); } } return 0; }
/* * vr_uvhm_set_vring_base - handles a VHOST_USER_SET_VRING_BASE messsage * from the vhost user client to set the based index of a vring. * * Returns 0 on success, -1 otherwise. */ static int vr_uvhm_set_vring_base(vr_uvh_client_t *vru_cl) { VhostUserMsg *vum_msg; unsigned int vring_idx; vum_msg = &vru_cl->vruc_msg; vring_idx = vum_msg->state.index; if (vring_idx >= VHOST_CLIENT_MAX_VRINGS) { vr_uvhost_log("Bad ring index %d received by vhost server\n", vring_idx); return -1; } if (vr_dpdk_virtio_set_vring_base(vru_cl->vruc_idx, vring_idx, vum_msg->state.num)) { vr_uvhost_log("Couldn't set vring base in vhost server %d %d %d\n", vru_cl->vruc_idx, vring_idx, vum_msg->state.num); return -1; } return 0; }