diff options
author | Jerin Jacob <jerin.jacob@caviumnetworks.com> | 2014-11-14 17:01:06 +0530 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2014-11-18 18:50:54 +0300 |
commit | 8f03c614c3fa04273242721c6f847fa52d000262 (patch) | |
tree | 41ac0365f8e7a265abdb41ddad19253a3a536fe1 /example | |
parent | ad5a82274dc079e34df79dc106f1323d4582a0b4 (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.c | 11 |
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, ¶ms, 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: |