common/mlx5: fix device list operations concurrency
[dpdk.git] / drivers / event / octeontx2 / otx2_worker_dual.c
index 3d55d92..81af4ca 100644 (file)
@@ -26,9 +26,9 @@ static __rte_always_inline void
 otx2_ssogws_dual_fwd_swtag(struct otx2_ssogws_state *ws,
                           const struct rte_event *ev)
 {
+       const uint8_t cur_tt = OTX2_SSOW_TT_FROM_TAG(otx2_read64(ws->tag_op));
        const uint32_t tag = (uint32_t)ev->event;
        const uint8_t new_tt = ev->sched_type;
-       const uint8_t cur_tt = ws->cur_tt;
 
        /* 96XX model
         * cur_tt/new_tt     SSO_SYNC_ORDERED SSO_SYNC_ATOMIC SSO_SYNC_UNTAGGED
@@ -66,15 +66,15 @@ otx2_ssogws_dual_forward_event(struct otx2_ssogws_dual *ws,
        const uint8_t grp = ev->queue_id;
 
        /* Group hasn't changed, Use SWTAG to forward the event */
-       if (vws->cur_grp == grp) {
+       if (OTX2_SSOW_GRP_FROM_TAG(otx2_read64(vws->tag_op)) == grp) {
                otx2_ssogws_dual_fwd_swtag(vws, ev);
                ws->swtag_req = 1;
        } else {
-       /*
-        * Group has been changed for group based work pipelining,
-        * Use deschedule/add_work operation to transfer the event to
-        * new group/core
-        */
+               /*
+                * Group has been changed for group based work pipelining,
+                * Use deschedule/add_work operation to transfer the event to
+                * new group/core
+                */
                otx2_ssogws_dual_fwd_group(vws, ev, grp);
        }
 }
@@ -93,7 +93,7 @@ otx2_ssogws_dual_enq(void *port, const struct rte_event *ev)
                otx2_ssogws_dual_forward_event(ws, vws, ev);
                break;
        case RTE_EVENT_OP_RELEASE:
-               otx2_ssogws_swtag_flush((struct otx2_ssogws *)vws);
+               otx2_ssogws_swtag_flush(vws->tag_op, vws->swtag_flush_op);
                break;
        default:
                return 0;
@@ -308,36 +308,38 @@ SSO_RX_ADPTR_ENQ_FASTPATH_FUNC
 #undef R
 
 #define T(name, f6, f5, f4, f3, f2, f1, f0, sz, flags)                 \
-uint16_t __rte_hot                                                             \
+uint16_t __rte_hot                                                     \
 otx2_ssogws_dual_tx_adptr_enq_ ## name(void *port,                     \
                                       struct rte_event ev[],           \
                                       uint16_t nb_events)              \
 {                                                                      \
        struct otx2_ssogws_dual *ws = port;                             \
-       struct otx2_ssogws *vws =                                       \
-               (struct otx2_ssogws *)&ws->ws_state[!ws->vws];          \
        uint64_t cmd[sz];                                               \
                                                                        \
        RTE_SET_USED(nb_events);                                        \
-       return otx2_ssogws_event_tx(vws, ev, cmd, flags);               \
+       return otx2_ssogws_event_tx(ws->base[!ws->vws], &ev[0],         \
+                                         cmd, (const uint64_t          \
+                                         (*)[RTE_MAX_QUEUES_PER_PORT]) \
+                                         &ws->tx_adptr_data, flags);   \
 }
 SSO_TX_ADPTR_ENQ_FASTPATH_FUNC
 #undef T
 
 #define T(name, f6, f5, f4, f3, f2, f1, f0, sz, flags)                 \
-uint16_t __rte_hot                                                             \
+uint16_t __rte_hot                                                     \
 otx2_ssogws_dual_tx_adptr_enq_seg_ ## name(void *port,                 \
                                           struct rte_event ev[],       \
                                           uint16_t nb_events)          \
 {                                                                      \
-       struct otx2_ssogws_dual *ws = port;                             \
-       struct otx2_ssogws *vws =                                       \
-               (struct otx2_ssogws *)&ws->ws_state[!ws->vws];          \
        uint64_t cmd[(sz) + NIX_TX_MSEG_SG_DWORDS - 2];                 \
+       struct otx2_ssogws_dual *ws = port;                             \
                                                                        \
        RTE_SET_USED(nb_events);                                        \
-       return otx2_ssogws_event_tx(vws, ev, cmd, (flags) |             \
-                                   NIX_TX_MULTI_SEG_F);                \
+       return otx2_ssogws_event_tx(ws->base[!ws->vws], &ev[0],         \
+                                         cmd, (const uint64_t          \
+                                         (*)[RTE_MAX_QUEUES_PER_PORT]) \
+                                         &ws->tx_adptr_data,           \
+                                         (flags) | NIX_TX_MULTI_SEG_F);\
 }
 SSO_TX_ADPTR_ENQ_FASTPATH_FUNC
 #undef T