[PATCH v10] api: packet: redefine packet data sharing with packet references#2287
[PATCH v10] api: packet: redefine packet data sharing with packet references#2287JannePeltonen wants to merge 14 commits intoOpenDataPlane:masterfrom
Conversation
| * Packets returned by this function can be used normally in ODP API functions | ||
| * unless otherwise noted. There are restrictions in packet output. | ||
| * | ||
| * Referenced packets can be used in ODP API functions that treat packet data |
There was a problem hiding this comment.
I think we should use one word to refer. Either base packet or referenced packet.
There was a problem hiding this comment.
Changed in v2 so that we talk about referenced packets, not base packets.
include/odp/api/spec/packet.h
Outdated
| * of a static reference it also shares metadata. Packet data and data layout | ||
| * of packet that have references must be treated as read only. | ||
| * | ||
| * Packets created through odp_packet_ref() or odp_packet_ref_hdr() share data |
There was a problem hiding this comment.
odp_packet_ref_hdr() --> odp_packet_ref_pkt()
fc5ce20 to
3a94a2c
Compare
|
v2: Many text clarifications and typo fixes. Removed base packet from terminology. Made the packet I/O capabilities more granular. Added reference related text in odp_packet_concat() specification. Added a new function to test whether a packet is a referencing packet. Mentioned that the functions that create referencing packets and static references can be called simultaneously in multiple threads for the same packet. |
3a94a2c to
3a39a0c
Compare
|
v3: Specified that sending shared packets to TM must obey the restrictions of the egress pktio (but currently TM does not support the dont_free flag, which maybe needs to change). |
3a39a0c to
a728f44
Compare
|
v4:
|
a728f44 to
1fec78c
Compare
|
v5: Updated based on review comments. Text clarifications only, no semantic changes. |
|
v6: cosmetic changes based on review comments, rebased |
1fec78c to
25f5e64
Compare
|
Acked-by: Ashwin Sekhar T K asekhar@marvell.com |
25f5e64 to
3c3e8f7
Compare
| /** Referencing packets can be consumed */ | ||
| uint8_t referencing :1; | ||
|
|
||
| } odp_pktout_packet_ref_capability_t; |
There was a problem hiding this comment.
Could we use the same type for both pktout and TM capas? In both cases the flag tells if packet output can consume the packet, and that common part of the documentation could remain here (the first paragraph). The differing part could be documented in the capa documentation using the type (second paragraph about dont_free moved into pktio capa).
Type name could be shortened to odp_pktout_ref_capability_t.
3c3e8f7 to
8b9e863
Compare
|
v8:
|
8b9e863 to
a5f7b0f
Compare
|
v9:
|
Make packet reference tests forward compatible with the following changes that are coming in the API version by removing or changing the conflicting code. - odp_packet_has_ref() returns 0 for packets created using odp_packet_ref() and odp_packet_ref_pkt(). - Referenced packets may not be modified - Creating references of references is not allowed Also fix a couple of asserts that checked the wrong packet handles. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Specification text of odp_packet_head() says that odp_packet_data() and odp_packet_l2_ptr() can be used to return packet data start address. The latter is incorrect as there is packet data before the l2_ptr if l2 offset is nonzero. Remove the incorrect reference to odp_packet_l2_ptr(). Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Current API regarding dynamic packet references is not easy to efficiently support in some ODP implementations with HW accelerated packet output due to the need to update reference counts after TX completion and based on that conditionally free packet buffers. odp_packet_ref() has been implemented only as a full packet copy in all ODP implementations. Redefine the semantics of odp_packet_ref() and the packets involved in packet data sharing in a way that hopefully makes it simpler to support packet data sharing with restrictions in packet output and with per-packet reference counting instead of per-segment reference counting. The new semantics also enable use cases that were not previously possible. Specify better the rules regarding packet data layout manipulation operations, allowing private packet data also in the tail of the packets that reference other packets. Pull and truncate operations may involve shared packet data, in which case they just remove that data from the packet, not affecting the packet owning the data. All push and extend operations always produce non-shared packet data. Change odp_packet_has_ref() to indicate whether a packet is referenced by another packet, not whether the packet shares data with another packet. In particular, odp_packet_ref() returns a packet that shares data with the given packet but is not itself referenced by other packets. Specify that packet data and layout of packets referenced by other packets cannot be modified at all. Add new odp_packet_is_referencing() to test whether a packet references another packet but is not a static reference. Introduce pktio capability bits to indicate whether a pktio supports sending packets with shared data without using the dont_free flag. Sending with the dont_free flag is supported with all types of packets. Introduce TM capability bits that indicate if referencing and referenced packets and static packet references can be enqueued to TM. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Maximum CoS index is 63 but the field for it in packet header is of type uint16_t. Change the field to uint8_t to make room for other things without a need to change the memory layout of the header. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Introduce the concept of indirect segments whose data pointers point to data areas of other segments. Use the existing per-segment reference counts to keep track of the usage of shared segments. Implement dynamic packet references, or referencing packets, using indirect segments. A referencing packet has a chain of segments so that some of the segments may be indirect. Add special handling for indirect segments in packet manipulation functions wherever necessary. This commit tries to keep the implementation simple and leaves optimization opportunities for the future. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Add support for packet references to all pktios. Many pktios copy packets before output processing already. Check for referencing packets and make a copy if needed in loop, ipc and xdp pktio and in the dpdk pktio in the zero copy case. Set the relevant pktio capabilities in the common packet i/o code. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
If a referencing packet is passed to crypto, copy it before processing to avoid writing to the read-only parts of the packet. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
If a referencing packet is passed to TM, copy it before processing to avoid writing to the read-only parts of the packet. Unconditional copying at TM enqueue time could be avoided by making the copy only when needed in various marking functions but this commit keeps things simple and does the copy always. Copying for referenced packets and static packet references was already in place. Add capability bits to indicate support for packet references. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
If a referencing packet is passed to ipsec, copy it before processing to avoid writing to the read-only parts of the packet. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Add testing with referencing and referenced packets in addition to normal packets and static references. Add checking of the related new pktio capabilities. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Add testing with referencing and referenced packets in addition to normal packets and static references. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Add testing of odp_packet_is_referencing(). Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Check that odp_pktio_capability_t::packet_ref.static_ref capability is present in the used pktios when static reference TX mode is requested. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Print the odp_pktout_packet_ref_capability_t flags for pktios. Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
a5f7b0f to
df92333
Compare
|
v10:
I will add new packet API validation tests later as those need still some work. |
Current API regarding dynamic packet references is not easy to efficiently support in some ODP implementations with HW accelerated packet output due to the need to update reference counts after TX completion and based on that conditionally free packet buffers. odp_packet_ref() has been implemented only as a full packet copy in all ODP implementation.
Redefine the semantics of odp_packet_ref() and the packets involved in packet data sharing in a way that hopefully makes it simpler to support packet data sharing with restrictions in packet output and with per-packet reference counting instead of per-segment reference counting. The new semantics also enable use cases that were not previously possible.
Specify better the rules regarding packet data layout manipulation operations, allowing private packet data also in the tail of the packets that reference other packets. Pull and truncate operations may involve shared packet data, in which case they just remove that data from the packet, not affecting the packet owning the data. All extend and truncate operations always produce non-shared packet data.
Change odp_packet_has_ref() to indicate whether a packet is referenced by another packet, not whether the packet shares data with another packet. In partivular, odp_packet_ref() returns a packet that shares data with the given packet but is not itself referenced by other packets. Specify that packet data and layout of packets referenced by other packets can not be modified at all.
Introduce pktio capability bits to indicate whether a pktio supports sending packets with shared data without using the dont_free flag. Sending with the dont_free flag is supported with all types of packets.