Thread (41 messages) 41 messages, 6 authors, 2021-04-23

[dpdk-dev] [PATCH v5 2/3] kni: support async user request

From: Ferruh Yigit <hidden>
Date: 2021-03-29 14:37:08
Subsystem: library code, the rest · Maintainers: Andrew Morton, Linus Torvalds

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 <redacted>
Signed-off-by: Ferruh Yigit <redacted>
---
 kernel/linux/kni/kni_net.c      | 9 +++++++++
 lib/librte_kni/rte_kni.c        | 7 +++++--
 lib/librte_kni/rte_kni_common.h | 1 +
 3 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c
index b830054c7491..6cf99da0dc92 100644
--- a/kernel/linux/kni/kni_net.c
+++ b/kernel/linux/kni/kni_net.c
@@ -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:
diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c
index 837d0217d2d1..9dae6a8d7c0c 100644
--- a/lib/librte_kni/rte_kni.c
+++ b/lib/librte_kni/rte_kni.c
@@ -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 */
diff --git a/lib/librte_kni/rte_kni_common.h b/lib/librte_kni/rte_kni_common.h
index ffb3182731a0..b547ea550171 100644
--- a/lib/librte_kni/rte_kni_common.h
+++ b/lib/librte_kni/rte_kni_common.h
@@ -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__));
 
-- 
2.30.2
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help