kni: support async user request
authorElad Nachman <eladv6@gmail.com>
Mon, 29 Mar 2021 14:36:54 +0000 (15:36 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 20 Apr 2021 23:05:15 +0000 (01:05 +0200)
Adding async userspace requests which don't wait for the userspace
response and always return success. This is preparation to address a
regression in KNI.

Signed-off-by: Elad Nachman <eladv6@gmail.com>
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
kernel/linux/kni/kni_net.c
lib/librte_kni/rte_kni.c
lib/librte_kni/rte_kni_common.h

index b830054..6cf99da 100644 (file)
@@ -124,6 +124,14 @@ kni_net_process_request(struct net_device *dev, struct rte_kni_request *req)
                goto fail;
        }
 
+       /* No result available since request is handled
+        * asynchronously. set response to success.
+        */
+       if (req->async != 0) {
+               req->result = 0;
+               goto async;
+       }
+
        ret_val = wait_event_interruptible_timeout(kni->wq,
                        kni_fifo_count(kni->resp_q), 3 * HZ);
        if (signal_pending(current) || ret_val <= 0) {
@@ -139,6 +147,7 @@ kni_net_process_request(struct net_device *dev, struct rte_kni_request *req)
        }
 
        memcpy(req, kni->sync_kva, sizeof(struct rte_kni_request));
+async:
        ret = 0;
 
 fail:
index 837d021..9dae6a8 100644 (file)
@@ -591,8 +591,11 @@ rte_kni_handle_request(struct rte_kni *kni)
                break;
        }
 
-       /* Construct response mbuf and put it back to resp_q */
-       ret = kni_fifo_put(kni->resp_q, (void **)&req, 1);
+       /* if needed, construct response buffer and put it back to resp_q */
+       if (!req->async)
+               ret = kni_fifo_put(kni->resp_q, (void **)&req, 1);
+       else
+               ret = 1;
        if (ret != 1) {
                RTE_LOG(ERR, KNI, "Fail to put the muf back to resp_q\n");
                return -1; /* It is an error of can't putting the mbuf back */
index ffb3182..b547ea5 100644 (file)
@@ -48,6 +48,7 @@ struct rte_kni_request {
                uint8_t promiscusity;/**< 1: promisc mode enable, 0: disable */
                uint8_t allmulti;    /**< 1: all-multicast mode enable, 0: disable */
        };
+       int32_t async : 1;            /**< 1: request is asynchronous */
        int32_t result;               /**< Result for processing request */
 } __attribute__((__packed__));