netdev_upperhalf: add direct rx mode

avoid packet processing delays caused by task switching,
to support those applications that are extremely time-sensitive.

Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
This commit is contained in:
zhanghongyu 2025-06-29 19:14:47 +08:00 committed by Donny(董九柱)
parent 2a5de4ebc6
commit b0ab56aca2
2 changed files with 21 additions and 2 deletions

View file

@ -1396,6 +1396,9 @@ int netdev_lower_register(FAR struct netdev_lowerhalf_s *dev,
case NETDEV_RX_WORK:
extra_size = sizeof(struct work_s);
break;
case NETDEV_RX_DIRECT:
extra_size = 0; /* No extra size needed for direct mode */
break;
case NETDEV_RX_THREAD:
extra_size = sizeof(struct netdev_thread_s);
cpu = 1;
@ -1580,7 +1583,14 @@ void netdev_lower_rxready(FAR struct netdev_lowerhalf_s *dev)
* in eth_input.
*/
netdev_upper_queue_work(&dev->netdev);
if (dev->rxtype == NETDEV_RX_DIRECT)
{
netdev_upper_rxpoll_work(dev->netdev.d_private);
}
else
{
netdev_upper_queue_work(&dev->netdev);
}
}
/****************************************************************************
@ -1600,7 +1610,15 @@ void netdev_lower_txdone(FAR struct netdev_lowerhalf_s *dev)
FAR struct netdev_upperhalf_s *upper = dev->netdev.d_private;
netdev_upper_vlan_foreach(upper, netdev_lower_txdone);
#endif
netdev_upper_queue_work(&dev->netdev);
if (dev->rxtype == NETDEV_RX_DIRECT)
{
netdev_upper_txavail_work(dev->netdev.d_private);
}
else
{
netdev_upper_queue_work(&dev->netdev);
}
NETDEV_TXDONE(&dev->netdev);
}

View file

@ -90,6 +90,7 @@ enum netpkt_type_e
enum netdev_rx_e
{
NETDEV_RX_WORK, /* Use work queue thread */
NETDEV_RX_DIRECT, /* Directly based on the current thread */
NETDEV_RX_THREAD, /* Upper half dedicated thread */
NETDEV_RX_THREAD_RSS /* RSS mode, upper half thread */
};