}
 #endif
 
-static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb,
-                            unsigned int len)
+static __cold void tcp_gro_dev_warn(const struct sock *sk, const struct sk_buff *skb,
+                                   unsigned int len)
 {
-       static bool __once __read_mostly;
+       struct net_device *dev;
 
-       if (!__once) {
-               struct net_device *dev;
-
-               __once = true;
-
-               rcu_read_lock();
-               dev = dev_get_by_index_rcu(sock_net(sk), skb->skb_iif);
-               if (!dev || len >= dev->mtu)
-                       pr_warn("%s: Driver has suspect GRO implementation, TCP performance may be compromised.\n",
-                               dev ? dev->name : "Unknown driver");
-               rcu_read_unlock();
-       }
+       rcu_read_lock();
+       dev = dev_get_by_index_rcu(sock_net(sk), skb->skb_iif);
+       if (!dev || len >= READ_ONCE(dev->mtu))
+               pr_warn("%s: Driver has suspect GRO implementation, TCP performance may be compromised.\n",
+                       dev ? dev->name : "Unknown driver");
+       rcu_read_unlock();
 }
 
 /* Adapt the MSS value used to make delayed ack decision to the
                icsk->icsk_ack.rcv_mss = min_t(unsigned int, len,
                                               tcp_sk(sk)->advmss);
                /* Account for possibly-removed options */
-               if (unlikely(len > icsk->icsk_ack.rcv_mss +
-                                  MAX_TCP_OPTION_SPACE))
-                       tcp_gro_dev_warn(sk, skb, len);
+               DO_ONCE_LITE_IF(len > icsk->icsk_ack.rcv_mss + MAX_TCP_OPTION_SPACE,
+                               tcp_gro_dev_warn, sk, skb, len);
                /* If the skb has a len of exactly 1*MSS and has the PSH bit
                 * set then it is likely the end of an application write. So
                 * more data may not be arriving soon, and yet the data sender