mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	netdev-genl: Elide napi_id when not present
There are at least two cases where napi_id may not present and the napi_id should be elided: 1. Queues could be created, but napi_enable may not have been called yet. In this case, there may be a NAPI but it may not have an ID and output of a napi_id should be elided. 2. TX-only NAPIs currently do not have NAPI IDs. If a TX queue happens to be linked with a TX-only NAPI, elide the NAPI ID from the netlink output as a NAPI ID of 0 is not useful for users. Signed-off-by: Joe Damato <jdamato@fastly.com> Reviewed-by: Sridhar Samudrala <sridhar.samudrala@intel.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/20250205193751.297211-1-jdamato@fastly.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									71f0dd5a32
								
							
						
					
					
						commit
						6597e8d358
					
				
					 2 changed files with 14 additions and 5 deletions
				
			
		|  | @ -24,6 +24,11 @@ | ||||||
|  */ |  */ | ||||||
| #define MIN_NAPI_ID ((unsigned int)(NR_CPUS + 1)) | #define MIN_NAPI_ID ((unsigned int)(NR_CPUS + 1)) | ||||||
| 
 | 
 | ||||||
|  | static inline bool napi_id_valid(unsigned int napi_id) | ||||||
|  | { | ||||||
|  | 	return napi_id >= MIN_NAPI_ID; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #define BUSY_POLL_BUDGET 8 | #define BUSY_POLL_BUDGET 8 | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_NET_RX_BUSY_POLL | #ifdef CONFIG_NET_RX_BUSY_POLL | ||||||
|  |  | ||||||
|  | @ -365,6 +365,13 @@ int netdev_nl_napi_set_doit(struct sk_buff *skb, struct genl_info *info) | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int nla_put_napi_id(struct sk_buff *skb, const struct napi_struct *napi) | ||||||
|  | { | ||||||
|  | 	if (napi && napi_id_valid(napi->napi_id)) | ||||||
|  | 		return nla_put_u32(skb, NETDEV_A_QUEUE_NAPI_ID, napi->napi_id); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int | static int | ||||||
| netdev_nl_queue_fill_one(struct sk_buff *rsp, struct net_device *netdev, | netdev_nl_queue_fill_one(struct sk_buff *rsp, struct net_device *netdev, | ||||||
| 			 u32 q_idx, u32 q_type, const struct genl_info *info) | 			 u32 q_idx, u32 q_type, const struct genl_info *info) | ||||||
|  | @ -386,9 +393,7 @@ netdev_nl_queue_fill_one(struct sk_buff *rsp, struct net_device *netdev, | ||||||
| 	switch (q_type) { | 	switch (q_type) { | ||||||
| 	case NETDEV_QUEUE_TYPE_RX: | 	case NETDEV_QUEUE_TYPE_RX: | ||||||
| 		rxq = __netif_get_rx_queue(netdev, q_idx); | 		rxq = __netif_get_rx_queue(netdev, q_idx); | ||||||
| 
 | 		if (nla_put_napi_id(rsp, rxq->napi)) | ||||||
| 		if (rxq->napi && nla_put_u32(rsp, NETDEV_A_QUEUE_NAPI_ID, |  | ||||||
| 					     rxq->napi->napi_id)) |  | ||||||
| 			goto nla_put_failure; | 			goto nla_put_failure; | ||||||
| 
 | 
 | ||||||
| 		params = &rxq->mp_params; | 		params = &rxq->mp_params; | ||||||
|  | @ -398,8 +403,7 @@ netdev_nl_queue_fill_one(struct sk_buff *rsp, struct net_device *netdev, | ||||||
| 		break; | 		break; | ||||||
| 	case NETDEV_QUEUE_TYPE_TX: | 	case NETDEV_QUEUE_TYPE_TX: | ||||||
| 		txq = netdev_get_tx_queue(netdev, q_idx); | 		txq = netdev_get_tx_queue(netdev, q_idx); | ||||||
| 		if (txq->napi && nla_put_u32(rsp, NETDEV_A_QUEUE_NAPI_ID, | 		if (nla_put_napi_id(rsp, txq->napi)) | ||||||
| 					     txq->napi->napi_id)) |  | ||||||
| 			goto nla_put_failure; | 			goto nla_put_failure; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Joe Damato
						Joe Damato