From: Jun Yang <[email protected]>

The atomic scheduling context (DQRR index) is saved in the mbuf
seq dynfield at dequeue time and consumed at enqueue time. However,
the enqueue and dequeue may happen on different DPIO
portals, so the context must remember which DPIO produced it.

Change the seqn dynfield from a bare uint32_t to a small struct that
carries both the sequence value and the originating dequeue DPIO
pointer. This is the base type change; additional changes are in the
following patches.

Signed-off-by: Jun Yang <[email protected]>
---
 drivers/bus/fslmc/bus_fslmc_driver.h | 28 +++++++++++++++++++++-------
 drivers/bus/fslmc/fslmc_bus.c        |  4 ++--
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/drivers/bus/fslmc/bus_fslmc_driver.h 
b/drivers/bus/fslmc/bus_fslmc_driver.h
index 40c9ba0699..ddde52d89c 100644
--- a/drivers/bus/fslmc/bus_fslmc_driver.h
+++ b/drivers/bus/fslmc/bus_fslmc_driver.h
@@ -43,21 +43,35 @@ struct vfio_device_info;
 
 #define DPAA2_INVALID_MBUF_SEQN        0
 
-typedef uint32_t dpaa2_seqn_t;
+struct dpaa2_seq_t {
+       uint32_t seqn;
+       void *seq_dpio_dq;
+};
+
 extern int dpaa2_seqn_dynfield_offset;
 
 /**
- * Read dpaa2 sequence number from mbuf.
+ * Read dpaa2 sequence struct from mbuf.
  *
  * @param mbuf Structure to read from.
- * @return pointer to dpaa2 sequence number.
+ * @return pointer to dpaa2 sequence struct.
  */
-__rte_internal
-static inline dpaa2_seqn_t *
+static __rte_always_inline struct dpaa2_seq_t *
+dpaa2_seq(struct rte_mbuf *mbuf)
+{
+       return RTE_MBUF_DYNFIELD(mbuf, dpaa2_seqn_dynfield_offset, struct 
dpaa2_seq_t *);
+}
+
+static __rte_always_inline uint32_t *
 dpaa2_seqn(struct rte_mbuf *mbuf)
 {
-       return RTE_MBUF_DYNFIELD(mbuf, dpaa2_seqn_dynfield_offset,
-               dpaa2_seqn_t *);
+       return &(dpaa2_seq(mbuf)->seqn);
+}
+
+static __rte_always_inline void **
+dpaa2_seq_dpio_dq(struct rte_mbuf *mbuf)
+{
+       return &(dpaa2_seq(mbuf)->seq_dpio_dq);
 }
 
 /** Device driver supports link state interrupt */
diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
index d20103ee36..82b11176e1 100644
--- a/drivers/bus/fslmc/fslmc_bus.c
+++ b/drivers/bus/fslmc/fslmc_bus.c
@@ -651,8 +651,8 @@ rte_fslmc_probe(struct rte_bus *bus)
 {
        static const struct rte_mbuf_dynfield dpaa2_seqn_dynfield_desc = {
                .name = DPAA2_SEQN_DYNFIELD_NAME,
-               .size = sizeof(dpaa2_seqn_t),
-               .align = alignof(dpaa2_seqn_t),
+               .size = sizeof(struct dpaa2_seq_t),
+               .align = alignof(struct dpaa2_seq_t),
        };
        int ret;
 
-- 
2.43.0

Reply via email to