return -ERANGE;
 
        if (new_len != orig_len) {
-               dev->tx_queue_len = new_len;
+               WRITE_ONCE(dev->tx_queue_len, new_len);
                res = call_netdevice_notifiers(NETDEV_CHANGE_TX_QUEUE_LEN, dev);
                res = notifier_to_errno(res);
                if (res)
 
 err_rollback:
        netdev_err(dev, "refused to change device tx_queue_len\n");
-       dev->tx_queue_len = orig_len;
+       WRITE_ONCE(dev->tx_queue_len, orig_len);
        return res;
 }
 
 
        if (nla_put_string(skb, IFLA_IFNAME, devname))
                goto nla_put_failure;
 
-       if (nla_put_u32(skb, IFLA_TXQLEN, dev->tx_queue_len) ||
+       if (nla_put_u32(skb, IFLA_TXQLEN, READ_ONCE(dev->tx_queue_len)) ||
            nla_put_u8(skb, IFLA_OPERSTATE,
                       netif_running(dev) ? dev->operstate : IF_OPER_DOWN) ||
            nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) ||
 
         * before again attaching a qdisc.
         */
        if ((dev->priv_flags & IFF_NO_QUEUE) && (dev->tx_queue_len == 0)) {
-               dev->tx_queue_len = DEFAULT_TX_QUEUE_LEN;
+               WRITE_ONCE(dev->tx_queue_len, DEFAULT_TX_QUEUE_LEN);
                netdev_info(dev, "Caught tx_queue_len zero misconfig\n");
        }
 
 
        struct net_device *dev = qdisc_dev(sch);
        struct teql_sched_data *q = qdisc_priv(sch);
 
-       if (q->q.qlen < dev->tx_queue_len) {
+       if (q->q.qlen < READ_ONCE(dev->tx_queue_len)) {
                __skb_queue_tail(&q->q, skb);
                return NET_XMIT_SUCCESS;
        }