mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-12-25 18:14:53 +00:00
loopif: only schedule poll when first packet is enqueued
This optimizes the netif_loop_output to only schedule a call to poll when the first packet is enqueued. This ensures netif_poll is ran once per burst of packets that are sent (which is typical in a TCP transfer) The old behavior scheduled a call to poll for every packet that was enqueued and this lead to exhaustion of the MEMP_TCPIP_MSG_API memory pool and tcpip_mbox (if port is using static mbox size). The extra callbacks are wasted work because netif_poll drains the entire queue when ran This issue presented itself when large TCP transfer go across the loopback netif
This commit is contained in:
parent
070e449690
commit
ffaee59f3e
@ -1060,6 +1060,9 @@ netif_loop_output(struct netif *netif, struct pbuf *p)
|
|||||||
struct netif *stats_if = netif;
|
struct netif *stats_if = netif;
|
||||||
#endif /* LWIP_HAVE_LOOPIF */
|
#endif /* LWIP_HAVE_LOOPIF */
|
||||||
#endif /* MIB2_STATS */
|
#endif /* MIB2_STATS */
|
||||||
|
#if LWIP_NETIF_LOOPBACK_MULTITHREADING
|
||||||
|
u8_t schedule_poll = 0;
|
||||||
|
#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
|
||||||
SYS_ARCH_DECL_PROTECT(lev);
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
|
|
||||||
/* Allocate a new pbuf */
|
/* Allocate a new pbuf */
|
||||||
@ -1109,6 +1112,10 @@ netif_loop_output(struct netif *netif, struct pbuf *p)
|
|||||||
} else {
|
} else {
|
||||||
netif->loop_first = r;
|
netif->loop_first = r;
|
||||||
netif->loop_last = last;
|
netif->loop_last = last;
|
||||||
|
#if LWIP_NETIF_LOOPBACK_MULTITHREADING
|
||||||
|
/* No existing packets queued, schedule poll */
|
||||||
|
schedule_poll = 1;
|
||||||
|
#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
|
||||||
}
|
}
|
||||||
SYS_ARCH_UNPROTECT(lev);
|
SYS_ARCH_UNPROTECT(lev);
|
||||||
|
|
||||||
@ -1118,7 +1125,9 @@ netif_loop_output(struct netif *netif, struct pbuf *p)
|
|||||||
|
|
||||||
#if LWIP_NETIF_LOOPBACK_MULTITHREADING
|
#if LWIP_NETIF_LOOPBACK_MULTITHREADING
|
||||||
/* For multithreading environment, schedule a call to netif_poll */
|
/* For multithreading environment, schedule a call to netif_poll */
|
||||||
tcpip_try_callback((tcpip_callback_fn)netif_poll, netif);
|
if (schedule_poll) {
|
||||||
|
tcpip_try_callback((tcpip_callback_fn)netif_poll, netif);
|
||||||
|
}
|
||||||
#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
|
#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
|
||||||
|
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
|
Loading…
Reference in New Issue
Block a user