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) {
}
memcpy(req, kni->sync_kva, sizeof(struct rte_kni_request));
+async:
ret = 0;
fail:
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 */
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__));