From: Sven Eckelmann The last TT version number of an meshif is only accessed as plain loads/stores and does not require full atomic_t semantics. Convert to an native integer and replace its users with READ_ONCE()/WRITE_ONCE() to avoid load/store tearing. Signed-off-by: Sven Eckelmann Signed-off-by: Simon Wunderlich --- net/batman-adv/originator.c | 2 +- net/batman-adv/routing.c | 4 ++-- net/batman-adv/send.c | 2 +- net/batman-adv/translation-table.c | 16 ++++++++-------- net/batman-adv/types.h | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c index 0ce07bfdade59..d05c8240426bd 100644 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c @@ -965,7 +965,7 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv, orig_node->bat_priv = bat_priv; ether_addr_copy(orig_node->orig, addr); batadv_dat_init_orig_node_addr(orig_node); - atomic_set(&orig_node->last_ttvn, 0); + WRITE_ONCE(orig_node->last_ttvn, 0); orig_node->tt_buff = NULL; orig_node->tt_buff_len = 0; orig_node->last_seen = jiffies; diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index 1dd295d934f49..cd4368b846add 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c @@ -765,7 +765,7 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb, goto out; orig_addr = orig_node->orig; - orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn); + orig_ttvn = READ_ONCE(orig_node->last_ttvn); } /* update the packet header */ @@ -845,7 +845,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, if (!orig_node) return false; - curr_ttvn = (u8)atomic_read(&orig_node->last_ttvn); + curr_ttvn = READ_ONCE(orig_node->last_ttvn); batadv_orig_node_put(orig_node); } diff --git a/net/batman-adv/send.c b/net/batman-adv/send.c index c7e86c83242a2..5f9da3606a8f5 100644 --- a/net/batman-adv/send.c +++ b/net/batman-adv/send.c @@ -222,7 +222,7 @@ batadv_send_skb_push_fill_unicast(struct sk_buff *skb, int hdr_size, struct batadv_orig_node *orig_node) { struct batadv_unicast_packet *unicast_packet; - u8 ttvn = (u8)atomic_read(&orig_node->last_ttvn); + u8 ttvn = READ_ONCE(orig_node->last_ttvn); if (batadv_skb_head_push(skb, hdr_size) < 0) return false; diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index e319b0796f7c8..8903b2f84f512 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -841,7 +841,7 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node, } (*tt_data)->flags = BATADV_NO_FLAGS; - (*tt_data)->ttvn = atomic_read(&orig_node->last_ttvn); + (*tt_data)->ttvn = READ_ONCE(orig_node->last_ttvn); (*tt_data)->num_vlan = htons(num_vlan); tt_vlan = (*tt_data)->vlan_data; @@ -1822,7 +1822,7 @@ batadv_tt_global_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq, if (!hdr) return -ENOBUFS; - last_ttvn = atomic_read(&orig->orig_node->last_ttvn); + last_ttvn = READ_ONCE(orig->orig_node->last_ttvn); if (nla_put(msg, BATADV_ATTR_TT_ADDRESS, ETH_ALEN, common->addr) || nla_put(msg, BATADV_ATTR_ORIG_ADDRESS, ETH_ALEN, @@ -3013,7 +3013,7 @@ static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv, if (!res_dst_orig_node) goto out; - orig_ttvn = (u8)atomic_read(&req_dst_orig_node->last_ttvn); + orig_ttvn = READ_ONCE(req_dst_orig_node->last_ttvn); req_ttvn = tt_data->ttvn; /* this node doesn't have the requested data */ @@ -3300,7 +3300,7 @@ static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv, orig_node->tt_buff = NULL; spin_unlock_bh(&orig_node->tt_buff_lock); - atomic_set(&orig_node->last_ttvn, ttvn); + WRITE_ONCE(orig_node->last_ttvn, ttvn); out: batadv_orig_node_put(orig_node); @@ -3316,7 +3316,7 @@ static void batadv_tt_update_changes(struct batadv_priv *bat_priv, batadv_tt_save_orig_buffer(bat_priv, orig_node, tt_change, batadv_tt_len(tt_num_changes)); - atomic_set(&orig_node->last_ttvn, ttvn); + WRITE_ONCE(orig_node->last_ttvn, ttvn); } /** @@ -3769,7 +3769,7 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv, struct batadv_tvlv_tt_change *tt_change, u16 tt_num_changes, u8 ttvn) { - u8 orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn); + u8 orig_ttvn = READ_ONCE(orig_node->last_ttvn); struct batadv_tvlv_tt_vlan_data *tt_vlan; bool full_table = true; bool has_tt_init; @@ -3911,7 +3911,7 @@ bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv, if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid, BATADV_TT_CLIENT_TEMP, - atomic_read(&orig_node->last_ttvn))) + READ_ONCE(orig_node->last_ttvn))) return false; batadv_dbg(BATADV_DBG_TT, bat_priv, @@ -4125,7 +4125,7 @@ static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv, batadv_tt_global_add(bat_priv, orig_node, roaming_adv->client, ntohs(roaming_adv->vid), BATADV_TT_CLIENT_ROAM, - atomic_read(&orig_node->last_ttvn) + 1); + READ_ONCE(orig_node->last_ttvn) + 1); out: batadv_orig_node_put(orig_node); diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h index 7533d71b73725..c188ec1cfb748 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h @@ -464,7 +464,7 @@ struct batadv_orig_node { unsigned long capa_initialized; /** @last_ttvn: last seen translation table version number */ - atomic_t last_ttvn; + u8 last_ttvn; /** @tt_buff: last tt changeset this node received from the orig node */ unsigned char *tt_buff; -- 2.47.3