.. | .. |
---|
26 | 26 | |
---|
27 | 27 | cell = this_cpu_ptr(gcells->cells); |
---|
28 | 28 | |
---|
29 | | - if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) { |
---|
| 29 | + if (skb_queue_len(&cell->napi_skbs) > READ_ONCE(netdev_max_backlog)) { |
---|
30 | 30 | drop: |
---|
31 | 31 | atomic_long_inc(&dev->rx_dropped); |
---|
32 | 32 | kfree_skb(skb); |
---|
.. | .. |
---|
99 | 99 | struct gro_cell *cell = per_cpu_ptr(gcells->cells, i); |
---|
100 | 100 | |
---|
101 | 101 | napi_disable(&cell->napi); |
---|
102 | | - netif_napi_del(&cell->napi); |
---|
| 102 | + __netif_napi_del(&cell->napi); |
---|
103 | 103 | __skb_queue_purge(&cell->napi_skbs); |
---|
104 | 104 | } |
---|
| 105 | + /* This barrier is needed because netpoll could access dev->napi_list |
---|
| 106 | + * under rcu protection. |
---|
| 107 | + */ |
---|
| 108 | + synchronize_net(); |
---|
| 109 | + |
---|
105 | 110 | free_percpu(gcells->cells); |
---|
106 | 111 | gcells->cells = NULL; |
---|
107 | 112 | } |
---|