> From: Stephen Hemminger [mailto:step...@networkplumber.org]
> Sent: Sunday, 13 April 2025 16.32
> 
> On Sun, 13 Apr 2025 09:00:19 +0200
> Morten Brørup <m...@smartsharesystems.com> wrote:
> 
> > > From: Stephen Hemminger [mailto:step...@networkplumber.org]
> > > Sent: Saturday, 12 April 2025 18.57
> > >
> > > On Sat, 12 Apr 2025 11:59:10 +0200
> > > Morten Brørup <m...@smartsharesystems.com> wrote:
> > >
> > > > > From: Stephen Hemminger [mailto:step...@networkplumber.org]
> > > > > Sent: Saturday, 12 April 2025 01.45
> > > > >
> > > > > Add field to union used for sched/event etc, for use when
> > > > > an mbuf is mirrored.
> > > > >
> > > > > Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
> > > > > ---
> > > > >  lib/mbuf/rte_mbuf_core.h | 8 ++++++++
> > > > >  1 file changed, 8 insertions(+)
> > > > >
> > > > > diff --git a/lib/mbuf/rte_mbuf_core.h
> b/lib/mbuf/rte_mbuf_core.h
> > > > > index a0df265b5d..1806dddd67 100644
> > > > > --- a/lib/mbuf/rte_mbuf_core.h
> > > > > +++ b/lib/mbuf/rte_mbuf_core.h
> > > > > @@ -589,6 +589,14 @@ struct __rte_cache_aligned rte_mbuf {
> > > > >                                                * @see
> > > > > rte_event_eth_tx_adapter_txq_set()
> > > > >                                                */
> > > > >                                       } txadapter; /**< Eventdev 
> > > > > ethdev
> Tx
> > > > > adapter */
> > > > > +                                     struct rte_mbuf_mirror {
> > > > > +                                             uint32_t orig_len;
> > > > > +                                             uint16_t queue_id;
> > > > > +                                             uint16_t direction;
> > > > > +                                             /**< Port mirroring 
> > > > > uses this
> to
> > > > > store origin
> > > > > +                                              * @see rte_eth_mirror()
> > > > > +                                              */
> > > > > +                                     } mirror;
> > > > >                                       uint32_t usr;
> > > > >                                       /**< User defined tags. See
> > > > > rte_distributor_process() */
> > > > >                               } hash;                   /**< hash
> information
> > > >
> > > > Stop overloading the "hash" field!
> > > >
> > > > We now have dynfields. The mbuf structure's dedicated fields
> should
> > > be limited to absolute core features.
> > > >
> > > > Long term, the "hash" field should be cleaned up.
> > > > E.g. if we get rid of the Flow Director and make the 8 byte
> "sched"
> > > (Hierarchical Scheduler) a dynfield, the "hash" field can be
> reduced
> > > from 8 byte to 4 byte (RSS hash).
> > > >
> > > > I acknowledge that some mbuf fields can be overloaded and thus
> used
> > > for multiple purposes - i.e. a value only used for
> ingress/forwarding
> > > (e.g. RSS hash) can share an mbuf field with a value only used for
> > > egress (e.g. Scheduler).
> > > >
> > > > The overloading of the "hash" field is too much already. E.g. can
> the
> > > Hierarchical Scheduler be used together with the Eventdev ethdev Tx
> > > adapter, or are they mutually exclusive due to sharing the same
> mbuf
> > > field?
> > > >
> > > > Going to the extreme, we would completely replace the "hash"
> field by
> > > dynfields.
> > > >
> > > > In short: Overloading the "hash" field with port mirror
> information
> > > is a step in the wrong direction.
> > >
> > > Short answer: Dynamic Fields are hard to work with
> primary/secondary
> > > process model.
> > > The goal was to allow dumpcap to run and just work without
> > > modifications to the primary application.
> > > If secondary creates dynamic field, the primary doesn't see it.
> >
> > I skimmed the mbuf dynfield source code, and it looks like it is
> designed for primary/secondary process model.
> > If the primary process doesn't see a dynfield created in a secondary
> process, it is a bug in the mbuf dynfield library. I couldn't find such
> a bug in Bugzilla.
> > I would be much better to fix the bug than overloading the "hash"
> field.
> 
> The problem is that if secondary makes a new field, the primary still
> has to lookup the offset.
> And don't want to do that in the packet path. Need to invoke a control
> path argument in the primary.
> If primary always makes the dynamic field, there really is not much
> point in it being dynamic.

The secondary could provide the dynfield offset to the primary in the control 
plane when adding the mirror, either as part of the struct rte_eth_mirror, or 
by some other means before setting dev->data->rx/tx_mirror.

Reply via email to