aboutsummaryrefslogtreecommitdiff
path: root/example
diff options
context:
space:
mode:
authorJerin Jacob <jerin.jacob@caviumnetworks.com>2014-11-14 17:01:06 +0530
committerMaxim Uvarov <maxim.uvarov@linaro.org>2014-11-18 18:50:54 +0300
commit8f03c614c3fa04273242721c6f847fa52d000262 (patch)
tree41ac0365f8e7a265abdb41ddad19253a3a536fe1 /example
parentad5a82274dc079e34df79dc106f1323d4582a0b4 (diff)
ipsec: Fix ctx->state update race
In existing code, ctx->state of packet which received from ORDERED queue has been updated after sending the packet to ATOMIC queue. This creates a race between "updating ctx->state from core x(ORDERED)" and "reading stale ctx->state from core y(ATOMIC)" In order to avoid the race, core x(ORDERED) should update the ctx->state value before sending to ATOMIC queue. Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com> Reviewed-by: Robert King <robking@cisco.com> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'example')
-rw-r--r--example/ipsec/odp_ipsec.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index da6c48e66..37ad34db6 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -932,9 +932,7 @@ pkt_disposition_e do_ipsec_out_classify(odp_packet_t pkt,
ctx->ipsec.esp_seq = &entry->state.esp_seq;
memcpy(&ctx->ipsec.params, &params, sizeof(params));
- /* Send packet to the atmoic queue to assign sequence numbers */
*skip = FALSE;
- odp_queue_enq(seqnumq, odp_packet_to_buffer(pkt));
return PKT_POSTED;
}
@@ -1108,9 +1106,12 @@ void *pktio_thread(void *arg ODP_UNUSED)
case PKT_STATE_IPSEC_OUT_CLASSIFY:
rc = do_ipsec_out_classify(pkt, ctx, &skip);
- ctx->state = (skip) ?
- PKT_STATE_TRANSMIT :
- PKT_STATE_IPSEC_OUT_SEQ;
+ if (odp_unlikely(skip)) {
+ ctx->state = PKT_STATE_TRANSMIT;
+ } else {
+ ctx->state = PKT_STATE_IPSEC_OUT_SEQ;
+ odp_queue_enq(seqnumq, buf);
+ }
break;
case PKT_STATE_IPSEC_OUT_SEQ: