static bool packet_use_direct_xmit(const struct packet_sock *po)
 {
-       return po->xmit == packet_direct_xmit;
+       /* Paired with WRITE_ONCE() in packet_setsockopt() */
+       return READ_ONCE(po->xmit) == packet_direct_xmit;
 }
 
 static u16 packet_pick_tx_queue(struct sk_buff *skb)
                packet_inc_pending(&po->tx_ring);
 
                status = TP_STATUS_SEND_REQUEST;
-               err = po->xmit(skb);
+               /* Paired with WRITE_ONCE() in packet_setsockopt() */
+               err = READ_ONCE(po->xmit)(skb);
                if (unlikely(err != 0)) {
                        if (err > 0)
                                err = net_xmit_errno(err);
                virtio_net_hdr_set_proto(skb, &vnet_hdr);
        }
 
-       err = po->xmit(skb);
+       /* Paired with WRITE_ONCE() in packet_setsockopt() */
+       err = READ_ONCE(po->xmit)(skb);
        if (unlikely(err != 0)) {
                if (err > 0)
                        err = net_xmit_errno(err);
                if (copy_from_sockptr(&val, optval, sizeof(val)))
                        return -EFAULT;
 
-               po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
+               /* Paired with all lockless reads of po->xmit */
+               WRITE_ONCE(po->xmit, val ? packet_direct_xmit : dev_queue_xmit);
                return 0;
        }
        default: