]> git.droids-corp.org - dpdk.git/commitdiff
event/cnxk: add checks in release operation
authorPavan Nikhilesh <pbhagavatula@marvell.com>
Wed, 27 Apr 2022 10:58:27 +0000 (16:28 +0530)
committerJerin Jacob <jerinj@marvell.com>
Tue, 17 May 2022 14:42:57 +0000 (16:42 +0200)
Add additional checks while performing RTE_EVENT_OP_RELEASE to
ensure that there are no pending SWTAGs and FLUSHEs in flight.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
drivers/event/cnxk/cn10k_eventdev.c
drivers/event/cnxk/cn10k_worker.c
drivers/event/cnxk/cn9k_eventdev.c
drivers/event/cnxk/cn9k_worker.c
drivers/event/cnxk/cn9k_worker.h
drivers/event/cnxk/cnxk_worker.h

index 9b4d2895ecbaff0ca359175b05720e76bf0e0325..2fa2cd31c2b8c6491ba9ba68e253d02089b9a332 100644 (file)
@@ -137,9 +137,7 @@ cn10k_sso_hws_flush_events(void *hws, uint8_t queue_id, uintptr_t base,
                if (fn != NULL && ev.u64 != 0)
                        fn(arg, ev);
                if (ev.sched_type != SSO_TT_EMPTY)
-                       cnxk_sso_hws_swtag_flush(
-                               ws->base + SSOW_LF_GWS_WQE0,
-                               ws->base + SSOW_LF_GWS_OP_SWTAG_FLUSH);
+                       cnxk_sso_hws_swtag_flush(ws->base);
                do {
                        val = plt_read64(ws->base + SSOW_LF_GWS_PENDSTATE);
                } while (val & BIT_ULL(56));
index 1ffd48a5abb0c748978e7225528fc3d93f072680..f953e19dd04219cb07bf24fc7d3e7a3e833eef0b 100644 (file)
@@ -18,8 +18,12 @@ cn10k_sso_hws_enq(void *port, const struct rte_event *ev)
                cn10k_sso_hws_forward_event(ws, ev);
                break;
        case RTE_EVENT_OP_RELEASE:
-               cnxk_sso_hws_swtag_flush(ws->base + SSOW_LF_GWS_WQE0,
-                                        ws->base + SSOW_LF_GWS_OP_SWTAG_FLUSH);
+               if (ws->swtag_req) {
+                       cnxk_sso_hws_desched(ev->u64, ws->base);
+                       ws->swtag_req = 0;
+                       break;
+               }
+               cnxk_sso_hws_swtag_flush(ws->base);
                break;
        default:
                return 0;
index 4bba477dd1ecc018c9b9a23de61a1a2b06abcb85..41bbe3cb224d3aff15c2defd181968d7ef329bc8 100644 (file)
@@ -156,9 +156,7 @@ cn9k_sso_hws_flush_events(void *hws, uint8_t queue_id, uintptr_t base,
                if (fn != NULL && ev.u64 != 0)
                        fn(arg, ev);
                if (ev.sched_type != SSO_TT_EMPTY)
-                       cnxk_sso_hws_swtag_flush(
-                               ws_base + SSOW_LF_GWS_TAG,
-                               ws_base + SSOW_LF_GWS_OP_SWTAG_FLUSH);
+                       cnxk_sso_hws_swtag_flush(ws_base);
                do {
                        val = plt_read64(ws_base + SSOW_LF_GWS_PENDSTATE);
                } while (val & BIT_ULL(56));
index fca1f0dffa642bb419700d2e56baf60379e75ef7..abbbfffd853b23f39c5c3e485010a3bdbbb94451 100644 (file)
@@ -19,8 +19,12 @@ cn9k_sso_hws_enq(void *port, const struct rte_event *ev)
                cn9k_sso_hws_forward_event(ws, ev);
                break;
        case RTE_EVENT_OP_RELEASE:
-               cnxk_sso_hws_swtag_flush(ws->base + SSOW_LF_GWS_TAG,
-                                        ws->base + SSOW_LF_GWS_OP_SWTAG_FLUSH);
+               if (ws->swtag_req) {
+                       cnxk_sso_hws_desched(ev->u64, ws->base);
+                       ws->swtag_req = 0;
+                       break;
+               }
+               cnxk_sso_hws_swtag_flush(ws->base);
                break;
        default:
                return 0;
@@ -78,8 +82,12 @@ cn9k_sso_hws_dual_enq(void *port, const struct rte_event *ev)
                cn9k_sso_hws_dual_forward_event(dws, base, ev);
                break;
        case RTE_EVENT_OP_RELEASE:
-               cnxk_sso_hws_swtag_flush(base + SSOW_LF_GWS_TAG,
-                                        base + SSOW_LF_GWS_OP_SWTAG_FLUSH);
+               if (dws->swtag_req) {
+                       cnxk_sso_hws_desched(ev->u64, base);
+                       dws->swtag_req = 0;
+                       break;
+               }
+               cnxk_sso_hws_swtag_flush(base);
                break;
        default:
                return 0;
index 917d1e0b40afb1dbb5e625154687f90ee0a71b30..88eb4e9cf991a57e6f16d26406ea8f7f91ad519c 100644 (file)
@@ -841,8 +841,7 @@ done:
                        return 1;
        }
 
-       cnxk_sso_hws_swtag_flush(base + SSOW_LF_GWS_TAG,
-                                base + SSOW_LF_GWS_OP_SWTAG_FLUSH);
+       cnxk_sso_hws_swtag_flush(base);
 
        return 1;
 }
index 7de03f3fbb2d9baaefaddead50a838ad8ea42d07..5e5e96b1ec3019d79f3a1fcd1cf30b9acb5afd6b 100644 (file)
@@ -45,11 +45,15 @@ cnxk_sso_hws_swtag_untag(uintptr_t swtag_untag_op)
 }
 
 static __rte_always_inline void
-cnxk_sso_hws_swtag_flush(uint64_t tag_op, uint64_t flush_op)
+cnxk_sso_hws_swtag_flush(uint64_t base)
 {
-       if (CNXK_TT_FROM_TAG(plt_read64(tag_op)) == SSO_TT_EMPTY)
+       /* Ensure that there is no previous flush is pending. */
+       while (plt_read64(base + SSOW_LF_GWS_PENDSTATE) & BIT_ULL(56))
+               ;
+       if (CNXK_TT_FROM_TAG(plt_read64(base + SSOW_LF_GWS_TAG)) ==
+           SSO_TT_EMPTY)
                return;
-       plt_write64(0, flush_op);
+       plt_write64(0, base + SSOW_LF_GWS_OP_SWTAG_FLUSH);
 }
 
 static __rte_always_inline uint64_t
@@ -78,4 +82,11 @@ cnxk_sso_hws_swtag_wait(uintptr_t tag_op)
        return swtp;
 }
 
+static __rte_always_inline void
+cnxk_sso_hws_desched(uint64_t u64, uint64_t base)
+{
+       plt_write64(u64, base + SSOW_LF_GWS_OP_UPD_WQP_GRP1);
+       plt_write64(0, base + SSOW_LF_GWS_OP_DESCHED);
+}
+
 #endif