When virtio blk device is pause, make sure hardware last_avail_idx
and last_used_idx are the same.

Signed-off-by: Andy Pei <andy....@intel.com>
---
 drivers/vdpa/ifc/ifcvf_vdpa.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/drivers/vdpa/ifc/ifcvf_vdpa.c b/drivers/vdpa/ifc/ifcvf_vdpa.c
index 4923bc1..def6adf 100644
--- a/drivers/vdpa/ifc/ifcvf_vdpa.c
+++ b/drivers/vdpa/ifc/ifcvf_vdpa.c
@@ -314,12 +314,12 @@ struct rte_vdpa_dev_info {
 vdpa_ifcvf_stop(struct ifcvf_internal *internal)
 {
        struct ifcvf_hw *hw = &internal->hw;
-       struct rte_vhost_vring vq;
        uint32_t i;
        int vid;
        uint64_t features = 0;
        uint64_t log_base = 0, log_size = 0;
        uint64_t len;
+       u32 ring_state = 0;
 
        vid = internal->vid;
 
@@ -328,13 +328,22 @@ struct rte_vdpa_dev_info {
         */
        if (internal->device_type == IFCVF_BLK) {
                for (i = 0; i < hw->nr_vring; i++) {
-                       rte_vhost_get_vhost_vring(internal->vid, i, &vq);
-                       while (vq.avail->idx != vq.used->idx) {
-                               ifcvf_notify_queue(hw, i);
-                               usleep(10);
-                       }
-                       hw->vring[i].last_avail_idx = vq.avail->idx;
-                       hw->vring[i].last_used_idx = vq.used->idx;
+                       do {
+                               if (hw->lm_cfg != NULL)
+                                       ring_state = *(u32 *)(hw->lm_cfg +
+                                               IFCVF_LM_RING_STATE_OFFSET +
+                                               i * IFCVF_LM_CFG_SIZE);
+                               hw->vring[i].last_avail_idx =
+                                       (u16)(ring_state & IFCVF_16_BIT_MASK);
+                               hw->vring[i].last_used_idx =
+                                       (u16)(ring_state >> 16);
+                               if (hw->vring[i].last_avail_idx !=
+                                       hw->vring[i].last_used_idx) {
+                                       ifcvf_notify_queue(hw, i);
+                                       usleep(10);
+                               }
+                       } while (hw->vring[i].last_avail_idx !=
+                               hw->vring[i].last_used_idx);
                }
        }
 
-- 
1.8.3.1

Reply via email to