/* sk_tx_queue_mapping accept only upto a 16-bit value */
        if (WARN_ON_ONCE((unsigned short)tx_queue >= USHRT_MAX))
                return;
-       sk->sk_tx_queue_mapping = tx_queue;
+       /* Paired with READ_ONCE() in sk_tx_queue_get() and
+        * other WRITE_ONCE() because socket lock might be not held.
+        */
+       WRITE_ONCE(sk->sk_tx_queue_mapping, tx_queue);
 }
 
 #define NO_QUEUE_MAPPING       USHRT_MAX
 
 static inline void sk_tx_queue_clear(struct sock *sk)
 {
-       sk->sk_tx_queue_mapping = NO_QUEUE_MAPPING;
+       /* Paired with READ_ONCE() in sk_tx_queue_get() and
+        * other WRITE_ONCE() because socket lock might be not held.
+        */
+       WRITE_ONCE(sk->sk_tx_queue_mapping, NO_QUEUE_MAPPING);
 }
 
 static inline int sk_tx_queue_get(const struct sock *sk)
 {
-       if (sk && sk->sk_tx_queue_mapping != NO_QUEUE_MAPPING)
-               return sk->sk_tx_queue_mapping;
+       if (sk) {
+               /* Paired with WRITE_ONCE() in sk_tx_queue_clear()
+                * and sk_tx_queue_set().
+                */
+               int val = READ_ONCE(sk->sk_tx_queue_mapping);
 
+               if (val != NO_QUEUE_MAPPING)
+                       return val;
+       }
        return -1;
 }