On 16 May 2016 at 05:50, Matias Elo <[email protected]> wrote:
> Using memset to initialize struct odp_packet_hdr_t contents
> to 0 has a significant overhead. Instead, initialize only
> the required members of the struct.
>
> Signed-off-by: Matias Elo <[email protected]>
> ---
> platform/linux-generic/include/odp_packet_internal.h | 13 +++++++++----
> platform/linux-generic/odp_packet.c | 18
> ++++++------------
> 2 files changed, 15 insertions(+), 16 deletions(-)
>
> diff --git a/platform/linux-generic/include/odp_packet_internal.h
> b/platform/linux-generic/include/odp_packet_internal.h
> index 1306b05..c87bc9f 100644
> --- a/platform/linux-generic/include/odp_packet_internal.h
> +++ b/platform/linux-generic/include/odp_packet_internal.h
> @@ -4,7 +4,6 @@
> * SPDX-License-Identifier: BSD-3-Clause
> */
>
-
> /**
> * @file
> *
> @@ -129,11 +128,16 @@ ODP_STATIC_ASSERT(sizeof(output_flags_t) ==
> sizeof(uint32_t),
>
> /**
> * Internal Packet header
> + *
> + * To optimize fast path performance this struct is not initialized to
> zero in
> + * packet_init(). Because of this any new fields added must be reviewed
> for
> + * initialization requirements.
> */
This file will not contribute to the generated API documentation and I
think it should. This platform specific warning should appear there as a
doxygen @warning
Perhaps we need to start a trend of adding a doxygen platform specific
module called "PLATFORM SPECIFICS", then we can add information with the
@addtogroup platform_specifics and users across platforms will know where
to look for this sort of information.
typedef struct {
> /* common buffer header */
> odp_buffer_hdr_t buf_hdr;
>
> + /* Following members are initialized by packet_init() */
> input_flags_t input_flags;
> error_flags_t error_flags;
> output_flags_t output_flags;
> @@ -142,15 +146,16 @@ typedef struct {
> uint32_t l3_offset; /**< offset to L3 hdr, e.g. IPv4, IPv6 */
> uint32_t l4_offset; /**< offset to L4 hdr (TCP, UDP, SCTP, also
> ICMP) */
>
> - uint32_t l3_len; /**< Layer 3 length */
> - uint32_t l4_len; /**< Layer 4 length */
> -
> uint32_t frame_len;
> uint32_t headroom;
> uint32_t tailroom;
>
> odp_pktio_t input;
>
> + /* Members below are not initialized by packet_init() */
> + uint32_t l3_len; /**< Layer 3 length */
> + uint32_t l4_len; /**< Layer 4 length */
> +
> uint32_t flow_hash; /**< Flow hash value */
> odp_time_t timestamp; /**< Timestamp value */
>
> diff --git a/platform/linux-generic/odp_packet.c
> b/platform/linux-generic/odp_packet.c
> index 4f523c9..8dde404 100644
> --- a/platform/linux-generic/odp_packet.c
> +++ b/platform/linux-generic/odp_packet.c
> @@ -49,19 +49,11 @@ void packet_parse_reset(odp_packet_hdr_t *pkt_hdr)
> static void packet_init(pool_entry_t *pool, odp_packet_hdr_t *pkt_hdr,
> size_t size, int parse)
> {
> - /*
> - * Reset parser metadata. Note that we clear via memset to make
> - * this routine indepenent of any additional adds to packet
> metadata.
> - */
> - const size_t start_offset = ODP_FIELD_SIZEOF(odp_packet_hdr_t,
> buf_hdr);
> - uint8_t *start;
> - size_t len;
> + pkt_hdr->input_flags.all = 0;
> + pkt_hdr->output_flags.all = 0;
> + pkt_hdr->error_flags.all = 0;
>
> - start = (uint8_t *)pkt_hdr + start_offset;
> - len = sizeof(odp_packet_hdr_t) - start_offset;
> - memset(start, 0, len);
> -
> - /* Set metadata items that initialize to non-zero values */
> + pkt_hdr->l2_offset = 0;
> pkt_hdr->l3_offset = ODP_PACKET_OFFSET_INVALID;
> pkt_hdr->l4_offset = ODP_PACKET_OFFSET_INVALID;
>
> @@ -79,6 +71,8 @@ static void packet_init(pool_entry_t *pool,
> odp_packet_hdr_t *pkt_hdr,
> pkt_hdr->tailroom =
> (pool->s.seg_size * pkt_hdr->buf_hdr.segcount) -
> (pool->s.headroom + size);
> +
> + pkt_hdr->input = ODP_PKTIO_INVALID;
> }
>
> odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse)
> --
> 1.9.1
>
> _______________________________________________
> lng-odp mailing list
> [email protected]
> https://lists.linaro.org/mailman/listinfo/lng-odp
>
--
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
"Work should be fun and collaborative, the rest follows"
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp