From: Bruce Richardson <bruce.richardson@intel.com>
To: "Kinsella, Ray" <mdr@ashroe.eu>
Cc: Jerin Jacob <jerinjacobk@gmail.com>,
Pavan Nikhilesh <pbhagavatula@marvell.com>,
Jerin Jacob <jerinj@marvell.com>,
Neil Horman <nhorman@tuxdriver.com>,
John McNamara <john.mcnamara@intel.com>,
Marko Kovacevic <marko.kovacevic@intel.com>,
dpdk-dev <dev@dpdk.org>, Thomas Monjalon <thomas@monjalon.net>,
David Marchand <david.marchand@redhat.com>
Subject: Re: [dpdk-dev] [PATCH v2] doc: add reserve fields to eventdev public structures
Date: Wed, 5 Aug 2020 11:07:05 +0100 [thread overview]
Message-ID: <20200805100705.GC1716@bricha3-MOBL.ger.corp.intel.com> (raw)
In-Reply-To: <ed8c5e83-ae08-fa2a-6d0d-b350745f879b@ashroe.eu>
On Wed, Aug 05, 2020 at 10:18:41AM +0100, Kinsella, Ray wrote:
>
>
> On 04/08/2020 18:18, Jerin Jacob wrote:
> > On Tue, Aug 4, 2020 at 9:54 PM Bruce Richardson
> > <bruce.richardson@intel.com> wrote:
> >>
> >> On Tue, Aug 04, 2020 at 09:33:14PM +0530, Jerin Jacob wrote:
> >>> On Tue, Aug 4, 2020 at 7:55 PM Bruce Richardson
> >>> <bruce.richardson@intel.com> wrote:
> >>>>
> >>>> On Tue, Aug 04, 2020 at 05:07:12PM +0530, Jerin Jacob wrote:
> >>>>> On Tue, Aug 4, 2020 at 4:12 PM Bruce Richardson
> >>>>> <bruce.richardson@intel.com> wrote:
> >>>>>>
> >>>>>> On Mon, Aug 03, 2020 at 12:59:03PM +0530, pbhagavatula@marvell.com wrote:
> >>>>>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>>>>>
> >>>>>>> Add 64 byte padding at the end of event device public structure to allow
> >>>>>>> future extensions.
> >>>>>>>
> >>>>>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>>>>> Acked-by: Jerin Jacob <jerinj@marvell.com>
> >>>>>>> ---
> >>>>>>> v2 Changes:
> >>>>>>> - Modify commit title.
> >>>>>>> - Add patch reference to doc.
> >>>>>>>
> >>>>>>> doc/guides/rel_notes/deprecation.rst | 11 +++++++++++
> >>>>>>> 1 file changed, 11 insertions(+)
> >>>>>>>
> >>>>>>> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> >>>>>>> index ea4cfa7a4..ec5db68e9 100644
> >>>>>>> --- a/doc/guides/rel_notes/deprecation.rst
> >>>>>>> +++ b/doc/guides/rel_notes/deprecation.rst
> >>>>>>> @@ -151,3 +151,14 @@ Deprecation Notices
> >>>>>>> Python 2 support will be completely removed in 20.11.
> >>>>>>> In 20.08, explicit deprecation warnings will be displayed when running
> >>>>>>> scripts with Python 2.
> >>>>>>> +
> >>>>>>> +* eventdev: A 64 byte padding is added at the end of the following structures
> >>>>>>> + in event device library to support future extensions:
> >>>>>>> + ``rte_event_crypto_adapter_conf``, ``rte_event_eth_rx_adapter_conf``,
> >>>>>>> + ``rte_event_eth_rx_adapter_queue_conf``, ``rte_event_eth_tx_adapter_conf``,
> >>>>>>> + ``rte_event_timer_adapter_conf``, ``rte_event_timer_adapter_info``,
> >>>>>>> + ``rte_event_dev_info``, ``rte_event_dev_config``, ``rte_event_queue_conf``,
> >>>>>>> + ``rte_event_port_conf``, ``rte_event_timer_adapter``,
> >>>>>>> + ``rte_event_timer_adapter_data``.
> >>>>>>> + Reference:
> >>>>>>> + http://patches.dpdk.org/project/dpdk/list/?series=10728&archive=both&state=*
> >>>>>>> --
> >>>>>>
> >>>>>> I don't like this idea of adding lots of padding to the ends of these
> >>>>>> structures. For some structures, such as the public arrays for devices it
> >>>>>> may be necessary, but for all the conf structures passed as parameters to
> >>>>>> functions I think we can do better. Since these structures are passed by
> >>>>>> the user to various functions, function versioning can be used to ensure
> >>>>>> that the correct function in eventdev is always called. From there to the
> >>>>>> individual PMDs, we can implement ABI compatibility by either:
> >>>>>> 1. including the length of the struct as a parameter to the driver. (This is
> >>>>>> a bit similar to my proposal for rawdev [1])
> >>>>>> 2. including the ABI version as a parameter to the driver.
> >>>>>
> >>>>> But, Will the above solution work if the application is dependent on
> >>>>> struct size?
> >>>>> i.e change of s1 size will change offset of s3 i.e
> >>>>> app_sepecific_struct_s3. Right?
> >>>>> i.e DPDK version should not change the offset of s3. Right?
> >>>>>
> >>>>> example,
> >>>>> struct app_struct {
> >>>>> struct dpdk_public_struct_s1 s1;
> >>>>> struct dpdk_public_struct_s2 s2;
> >>>>> struct app_sepecific_struct_s3 s3;
> >>>>> }
> >>>>>
> >>>> Not sure what exactly you mean here. The actual offsets and sizes of the
> >>>> structs will obviously change as you change the struct, but the end
> >>>> compiled app has no idea of structs, all it knows of is offsets, which is
> >>>> why you provide ABI compatible versions of the functions which use "legacy"
> >>>> copies of the structs to ensure correct offsets. It's pretty much standard
> >>>> practice for ABI versioning.
> >>>
> >>> Currently, We have only function versioning(not structure versioning).
> >>> Are you suggesting having structure versioning?
> >>> Will it complicate the code in terms of readability and supporting multiple
> >>> structure versions aginst its support functions.
> >>>
> >>
> >> We don't, and can't version structures, only functions are versioned.
> >> Even if we do what you suggest and add a block of 64-bytes expansion room
> >> at the end of the structures, how is the function you are calling expected
> >> to know what the structure actually contains? For example, if you add a
> >> field to the end, and reduce the padding by 8 bytes, your structure is
> >> still the same size, and how does the called function know whether X or X+8
> >> bytes are valid in it. Basically, you still need to version all
> >> functions using the structure, just as if you didn't bother extending the
> >> struct.
> >
> > Yes. We need function versioning for sure if we change the behavior of
> > the function.
> > Is function version + reserved field enough to decode the correct value from
> > the reserved filed from the structure.
> >
> > My concern is, Let say, we are making the change in structure a->b and
> > function c->d
> > assisted with it.
> >
> > In the reserved filed case:
> > - struct a remains same(we will adding the fields in reserved filed)
> > - the function will have c and d version and both using struct a
> >
> > In another scheme:
> > - The application needs to change where versioned function(c or d) need to
> > give associate structure manually. Right? If it is manually, it will
> > be huge change
> > in application. Right?
> >
> > How an application can express the correct structure mapping?
> > Will it it be like
> > rte_substrem_v21(struct rte_subsystem_conf_v21 *config)?
> > vs
> > rte_substrem_v21(struct rte_subsystem_conf *config)?> where rte_subsystem_conf has reserved filed.
>
> So the ABI policy approach for doing this is
>
> rte_substrem_v21(struct rte_subsystem_conf_v21 *config)
>
> instead of
>
> rte_substrem_v21(struct rte_subsystem_conf *config) (with extension padding).
>
> There are benefits and drawbacks with each approach, these include ...
>
> The padding approach assumes you are always happy to tack whatever field you want
> onto the end of the structure, when in many cases it's more natural home is usually
> in the middle or beginning. Then there is also dead/unused and uninitialized memory,
> to be conscious of.
>
> However what you say is completely correct, if I have a v21 version of the function,
> only it should be looking at the new field/additional bytes in the structure.
>
> The alternative is to version the structure along with the function.
> And this is what is described in the ABI policy.
>
> The obvious drawback with this approach is that if you have a structure that is used across
> a large number of functions ... it can be a real headache as they all need to be versioned.
>
> The benefit with this approach is that it is completely explicit,
> which function and structure versions are associated.
>
IMHO, the only time we should look to use padding is for structures like
the ethdev structure that are internal-only but used across so many
functions and inline functions that it simply becomes impossible to version
them. For any structures that are simply passed as parameters, which I
believe applies to all structs referred to by this deprecation notice,
function versioning should be sufficient to deal with any issues.
Regards,
/Bruce
next prev parent reply other threads:[~2020-08-05 10:07 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-02 10:51 [dpdk-dev] [PATCH] doc: announce changes " pbhagavatula
2020-08-03 6:14 ` Jerin Jacob
2020-08-03 7:29 ` [dpdk-dev] [PATCH v2] doc: add reserve fields " pbhagavatula
2020-08-04 10:41 ` Bruce Richardson
2020-08-04 11:37 ` Jerin Jacob
2020-08-04 14:24 ` Bruce Richardson
2020-08-04 16:03 ` Jerin Jacob
2020-08-04 16:24 ` Bruce Richardson
2020-08-04 17:18 ` Jerin Jacob
2020-08-05 9:18 ` Kinsella, Ray
2020-08-05 10:07 ` Bruce Richardson [this message]
2020-08-04 16:20 ` Stephen Hemminger
2020-08-05 8:46 ` Kinsella, Ray
2020-08-05 9:10 ` Jerin Jacob
2020-08-06 0:59 ` Stephen Hemminger
2020-08-06 16:57 ` Jerin Jacob
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200805100705.GC1716@bricha3-MOBL.ger.corp.intel.com \
--to=bruce.richardson@intel.com \
--cc=david.marchand@redhat.com \
--cc=dev@dpdk.org \
--cc=jerinj@marvell.com \
--cc=jerinjacobk@gmail.com \
--cc=john.mcnamara@intel.com \
--cc=marko.kovacevic@intel.com \
--cc=mdr@ashroe.eu \
--cc=nhorman@tuxdriver.com \
--cc=pbhagavatula@marvell.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).