On 13/04/16 13:40, Bala Manoharan wrote:
Regards,
Bala
On 12 April 2016 at 17:34, Zoltan Kiss <[email protected]
<mailto:[email protected]>> wrote:
On 11/04/16 05:01, Bala Manoharan wrote:
Hi,
Comments inline...
Regards,
Bala
On 8 April 2016 at 00:23, Zoltan Kiss <[email protected]
<mailto:[email protected]>
<mailto:[email protected] <mailto:[email protected]>>>
wrote:
The callers are only interested whether there is a CoS or
not. It is not
an error if there isn't, so it has a positive return value. Any
other case
needs to release the packet, which is not handled after calling
queue_enq().
Signed-off-by: Zoltan Kiss <[email protected]
<mailto:[email protected]>
<mailto:[email protected]
<mailto:[email protected]>>>
---
platform/linux-generic/odp_classification.c | 9 +++++++--
platform/linux-generic/pktio/loop.c | 2 +-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/platform/linux-generic/odp_classification.c
b/platform/linux-generic/odp_classification.c
index f5e4673..4f2974b 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -743,7 +743,7 @@ int
_odp_packet_classifier(pktio_entry_t *entry,
odp_packet_t pkt)
/* Matching PMR and selecting the CoS for the packet*/
cos = pktio_select_cos(entry, pkt_addr, pkt_hdr);
if (cos == NULL)
- return -1;
+ return 1;
The scenario of NULL Cos will occur only whether there is an invalid
configuration done by the application. If no other CoS matches the
packet then default CoS will be applied, this NULL will occur
only if
there is no defaultCoS configured and hence it is better to
return the
error to the calling function so that a proper action could be
taken.
Ok, then we should free the packet here as well.
IMO, we should free the packet at the loopback device function. so that
whenever the _odp_packet_classifier() function returns an error value
then the packet has to be freed by the calling function.
If you just look at the next few lines of this code, you'll see that
this function releases the buffer in two error scenario.
if (cos->s.pool == NULL) {
odp_packet_free(pkt);
@@ -766,7 +766,12 @@ int _odp_packet_classifier(pktio_entry_t
*entry, odp_packet_t pkt)
/* Enqueuing the Packet based on the CoS */
queue = cos->s.queue;
- return queue_enq(queue,
odp_buf_to_hdr((odp_buffer_t)new_pkt), 0);
+ if (queue_enq(queue,
odp_buf_to_hdr((odp_buffer_t)new_pkt),
0)) {
+ odp_packet_free(new_pkt);
+ return -1;
+ } else {
+ return 0;
+ }
IMO packets should be freed only by the receiving module rather
than by
the classifier in this specific error.
The only user, the loopback devices doesn't do so, it only adjusts
the statistics. That is where the memory leaks btw.
Okay. Then we have to modify the loopback device function to free the
packet when there is an error in _odp_packet_classifier() function.
The classification module drops a
packet only on specific cases either on error CoS or when the packet
pool is full.
Could you point me to the documentation where this behavior is
described?
The scenario is described in classification users-guide documentation.
Pls let me know if we need to add additional information in the document.
The idea of returning an error value is that the caller
function knows that the packet is not enqueued and it has to
either free
the packet or check the configuration.
Currently we return -1, and the packet buffer is either released or
not. The only caller doesn't care anyway, and I don't think it could
do much more anyway, other than printing a big error message and
probably abort.
Current behaviour is that when there is an error in classification, we
return -1and it means that the packet has not be enqueued into
classification queue and the buffer has not been freed.
There are two error scenarios when that's not true, see above.
You had mentioned that this patch is required to prevent a
memory leak,
can you please elaborate on the scenario when a leak is observed?
}
int packet_classifier(odp_pktio_t pktio, odp_packet_t pkt)
diff --git a/platform/linux-generic/pktio/loop.c
b/platform/linux-generic/pktio/loop.c
index 0ea6d0e..5ed4ca9 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -70,7 +70,7 @@ static int loopback_recv(pktio_entry_t
*pktio_entry, odp_packet_t pkts[],
pkt_hdr = odp_packet_hdr(pkt);
packet_parse_reset(pkt_hdr);
packet_parse_l2(pkt_hdr);
- if (0 >
_odp_packet_classifier(pktio_entry,
pkt)) {
+ if
(_odp_packet_classifier(pktio_entry, pkt)
== 1) {
pkts[j++] = pkt;
pktio_entry->s.stats.in_octets +=
odp_packet_len(pkts[i]);
--
1.9.1
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp