| .. | .. |
|---|
| 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 | } |
|---|