forked from mirrors/linux
		
	virtio_net: suppress cpu stall when free_unused_bufs
For multi-queue and large ring-size use case, the following error
occurred when free_unused_bufs:
rcu: INFO: rcu_sched self-detected stall on CPU.
Fixes: 986a4f4d45 ("virtio_net: multiqueue support")
Signed-off-by: Wenliang Wang <wangwenliang.1995@bytedance.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									9f699b71c2
								
							
						
					
					
						commit
						f8bb510439
					
				
					 1 changed files with 2 additions and 0 deletions
				
			
		| 
						 | 
					@ -3560,12 +3560,14 @@ static void free_unused_bufs(struct virtnet_info *vi)
 | 
				
			||||||
		struct virtqueue *vq = vi->sq[i].vq;
 | 
							struct virtqueue *vq = vi->sq[i].vq;
 | 
				
			||||||
		while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
 | 
							while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
 | 
				
			||||||
			virtnet_sq_free_unused_buf(vq, buf);
 | 
								virtnet_sq_free_unused_buf(vq, buf);
 | 
				
			||||||
 | 
							cond_resched();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < vi->max_queue_pairs; i++) {
 | 
						for (i = 0; i < vi->max_queue_pairs; i++) {
 | 
				
			||||||
		struct virtqueue *vq = vi->rq[i].vq;
 | 
							struct virtqueue *vq = vi->rq[i].vq;
 | 
				
			||||||
		while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
 | 
							while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
 | 
				
			||||||
			virtnet_rq_free_unused_buf(vq, buf);
 | 
								virtnet_rq_free_unused_buf(vq, buf);
 | 
				
			||||||
 | 
							cond_resched();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue