sched: fix debug build
[dpdk.git] / kernel / linux / kni / kni_net.c
index 6cf99da..611719b 100644 (file)
@@ -113,6 +113,14 @@ kni_net_process_request(struct net_device *dev, struct rte_kni_request *req)
 
        ASSERT_RTNL();
 
+       /* If we need to wait and RTNL mutex is held
+        * drop the mutex and hold reference to keep device
+        */
+       if (req->async == 0) {
+               dev_hold(dev);
+               rtnl_unlock();
+       }
+
        mutex_lock(&kni->sync_lock);
 
        /* Construct data */
@@ -152,6 +160,10 @@ async:
 
 fail:
        mutex_unlock(&kni->sync_lock);
+       if (req->async == 0) {
+               rtnl_lock();
+               dev_put(dev);
+       }
        return ret;
 }
 
@@ -194,6 +206,10 @@ kni_net_release(struct net_device *dev)
 
        /* Setting if_up to 0 means down */
        req.if_up = 0;
+
+       /* request async because of the deadlock problem */
+       req.async = 1;
+
        ret = kni_net_process_request(dev, &req);
 
        return (ret == 0) ? req.result : ret;
@@ -229,7 +245,7 @@ kni_fifo_trans_pa2va(struct kni_dev *kni,
                                        break;
 
                                prev_kva = kva;
-                               kva = pa2kva(kva->next);
+                               kva = get_kva(kni, kva->next);
                                /* Convert physical address to virtual address */
                                prev_kva->next = pa2va(prev_kva->next, kva);
                        }
@@ -406,7 +422,7 @@ kni_net_rx_normal(struct kni_dev *kni)
                                        break;
 
                                prev_kva = kva;
-                               kva = pa2kva(kva->next);
+                               kva = get_kva(kni, kva->next);
                                data_kva = kva2data_kva(kva);
                                /* Convert physical address to virtual address */
                                prev_kva->next = pa2va(prev_kva->next, kva);
@@ -485,7 +501,7 @@ kni_net_rx_lo_fifo(struct kni_dev *kni)
                        kni->va[i] = pa2va(kni->pa[i], kva);
 
                        while (kva->next) {
-                               next_kva = pa2kva(kva->next);
+                               next_kva = get_kva(kni, kva->next);
                                /* Convert physical address to virtual address */
                                kva->next = pa2va(kva->next, next_kva);
                                kva = next_kva;