forked from mirrors/linux
		
	net: optimize napi_schedule_rps()
Based on initial patch from Jason Xing. Idea is to not raise NET_RX_SOFTIRQ from napi_schedule_rps() when we queued a packet into another cpu backlog. We can do this only in the context of us being called indirectly from net_rx_action(), to have the guarantee our rps_ipi_list will be processed before we exit from net_rx_action(). Link: https://lore.kernel.org/lkml/20230325152417.5403-1-kerneljasonxing@gmail.com/ Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Jason Xing <kernelxing@tencent.com> Reviewed-by: Jason Xing <kerneljasonxing@gmail.com> Tested-by: Jason Xing <kerneljasonxing@gmail.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
		
							parent
							
								
									c59647c0dc
								
							
						
					
					
						commit
						821eba962d
					
				
					 1 changed files with 5 additions and 3 deletions
				
			
		|  | @ -4587,8 +4587,6 @@ static void trigger_rx_softirq(void *data) | ||||||
|  * |  * | ||||||
|  * - If this is another cpu queue, link it to our rps_ipi_list, |  * - If this is another cpu queue, link it to our rps_ipi_list, | ||||||
|  *   and make sure we will process rps_ipi_list from net_rx_action(). |  *   and make sure we will process rps_ipi_list from net_rx_action(). | ||||||
|  *   As we do not know yet if we are called from net_rx_action(), |  | ||||||
|  *   we have to raise NET_RX_SOFTIRQ. This might change in the future. |  | ||||||
|  * |  * | ||||||
|  * - If this is our own queue, NAPI schedule our backlog. |  * - If this is our own queue, NAPI schedule our backlog. | ||||||
|  *   Note that this also raises NET_RX_SOFTIRQ. |  *   Note that this also raises NET_RX_SOFTIRQ. | ||||||
|  | @ -4602,6 +4600,10 @@ static void napi_schedule_rps(struct softnet_data *sd) | ||||||
| 		sd->rps_ipi_next = mysd->rps_ipi_list; | 		sd->rps_ipi_next = mysd->rps_ipi_list; | ||||||
| 		mysd->rps_ipi_list = sd; | 		mysd->rps_ipi_list = sd; | ||||||
| 
 | 
 | ||||||
|  | 		/* If not called from net_rx_action()
 | ||||||
|  | 		 * we have to raise NET_RX_SOFTIRQ. | ||||||
|  | 		 */ | ||||||
|  | 		if (!mysd->in_net_rx_action) | ||||||
| 			__raise_softirq_irqoff(NET_RX_SOFTIRQ); | 			__raise_softirq_irqoff(NET_RX_SOFTIRQ); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Eric Dumazet
						Eric Dumazet