Segmentation fault is observed as soon as any dpdk application
with ethdev event is launched. Handling the event types
appropriately.

Also fixing sub event type violation as in OCTEONTX event device we
use sub_event_type to store the ethernet port identifier when we receive
work from OCTEONTX ethernet device. This violates the event device spec
as sub_event_type should be 0 in the initial receive stage.
Set sub_event_type to 0 after copying the port id in single workslot
mode.

Fixes: 8dc6c2f12ecf ("crypto/octeontx: add crypto adapter data path")

Signed-off-by: Harman Kalra <hka...@marvell.com>
Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com>
---
V3:
 * fixing sub event type violation
V2:
 * Seperated out a generic patch from the series
 
 drivers/event/octeontx/ssovf_worker.h | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/event/octeontx/ssovf_worker.h 
b/drivers/event/octeontx/ssovf_worker.h
index e6ee292688..57be476394 100644
--- a/drivers/event/octeontx/ssovf_worker.h
+++ b/drivers/event/octeontx/ssovf_worker.h
@@ -179,16 +179,22 @@ ssows_get_work(struct ssows *ws, struct rte_event *ev, 
const uint16_t flag)
        ev->event = sched_type_queue | (get_work0 & 0xffffffff);
 
        if (get_work1) {
-               if (ev->event_type == RTE_EVENT_TYPE_ETHDEV)
-                       get_work1 = (uintptr_t)ssovf_octeontx_wqe_to_pkt(
-                               get_work1, (ev->event >> 20) & 0x7F, flag,
-                               ws->lookup_mem);
-               else if (ev->event_type == RTE_EVENT_TYPE_CRYPTODEV)
+               if (ev->event_type == RTE_EVENT_TYPE_ETHDEV) {
+                       uint16_t port = (ev->event >> 20) & 0x7F;
+
+                       ev->sub_event_type = 0;
+                       ev->mbuf = ssovf_octeontx_wqe_to_pkt(
+                               get_work1, port, flag, ws->lookup_mem);
+               } else if (ev->event_type == RTE_EVENT_TYPE_CRYPTODEV) {
                        get_work1 = otx_crypto_adapter_dequeue(get_work1);
-               ev->u64 = get_work1;
-       } else if (unlikely((get_work0 & 0xFFFFFFFF) == 0xFFFFFFFF)) {
-               ssovf_octeontx_wqe_free(get_work1);
-               return 0;
+                       ev->u64 = get_work1;
+               } else {
+                       if (unlikely((get_work0 & 0xFFFFFFFF) == 0xFFFFFFFF)) {
+                               ssovf_octeontx_wqe_free(get_work1);
+                               return 0;
+                       }
+                       ev->u64 = get_work1;
+               }
        }
 
        return !!get_work1;
-- 
2.18.0

Reply via email to