@@ -136,7 +136,7 @@ struct conn {
/* Mutable data. */
struct ovs_mutex lock; /* Guards all mutable fields. */
ovs_u128 label;
- long long expiration;
+ atomic_llong expiration;
uint32_t mark;
int seq_skew;
@@ -100,6 +100,7 @@ static enum ct_update_res conn_update(struct conntrack *ct, struct conn *conn,
struct dp_packet *pkt,
struct conn_lookup_ctx *ctx,
long long now);
+static long long int conn_expiration(const struct conn *);
static bool conn_expired(struct conn *, long long now);
static void set_mark(struct dp_packet *, struct conn *,
uint32_t val, uint32_t mask);
@@ -973,13 +974,10 @@ un_nat_packet(struct dp_packet *pkt, const struct conn *conn,
static void
conn_seq_skew_set(struct conntrack *ct, const struct conn *conn_in,
long long now, int seq_skew, bool seq_skew_dir)
- OVS_NO_THREAD_SAFETY_ANALYSIS
{
struct conn *conn;
- ovs_mutex_unlock(&conn_in->lock);
- conn_lookup(ct, &conn_in->key, now, &conn, NULL);
- ovs_mutex_lock(&conn_in->lock);
+ conn_lookup(ct, &conn_in->key, now, &conn, NULL);
if (conn && seq_skew) {
conn->seq_skew = seq_skew;
conn->seq_skew_dir = seq_skew_dir;
@@ -2519,14 +2517,21 @@ conn_update(struct conntrack *ct, struct conn *conn, struct dp_packet *pkt,
return update_res;
}
+static long long int
+conn_expiration(const struct conn *conn)
+{
+ long long int expiration;
+
+ atomic_read_relaxed(&CONST_CAST(struct conn *, conn)->expiration,
+ &expiration);
+ return expiration;
+}
+
static bool
conn_expired(struct conn *conn, long long now)
{
if (conn->conn_type == CT_CONN_TYPE_DEFAULT) {
- ovs_mutex_lock(&conn->lock);
- bool expired = now >= conn->expiration ? true : false;
- ovs_mutex_unlock(&conn->lock);
- return expired;
+ return now >= conn_expiration(conn);
}
return false;
}
@@ -2659,7 +2664,7 @@ conn_to_ct_dpif_entry(const struct conn *conn, struct ct_dpif_entry *entry,
entry->mark = conn->mark;
memcpy(&entry->labels, &conn->label, sizeof entry->labels);
- long long expiration = conn->expiration - now;
+ long long expiration = conn_expiration(conn) - now;
struct ct_l4_proto *class = l4_protos[conn->key.nw_proto];
if (class->conn_get_protoinfo) {