[undi] Place an upper limit on the number of PXENV_UNDI_ISR calls per poll
PXENV_UNDI_ISR calls may implicitly refill the underlying receive ring, and so could continue to retrieve packets indefinitely. Place an upper limit on the number of calls to PXENV_UNDI_ISR per call to undinet_poll(). Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
71ed061776
commit
69313edad8
@ -72,6 +72,9 @@ struct undi_nic {
|
|||||||
/** Delay between retries of PXENV_UNDI_INITIALIZE */
|
/** Delay between retries of PXENV_UNDI_INITIALIZE */
|
||||||
#define UNDI_INITIALIZE_RETRY_DELAY_MS 200
|
#define UNDI_INITIALIZE_RETRY_DELAY_MS 200
|
||||||
|
|
||||||
|
/** Maximum number of calls to PXENV_UNDI_ISR per poll */
|
||||||
|
#define UNDI_POLL_QUOTA 4
|
||||||
|
|
||||||
/** Alignment of received frame payload */
|
/** Alignment of received frame payload */
|
||||||
#define UNDI_RX_ALIGN 16
|
#define UNDI_RX_ALIGN 16
|
||||||
|
|
||||||
@ -328,6 +331,7 @@ static void undinet_poll ( struct net_device *netdev ) {
|
|||||||
struct undi_nic *undinic = netdev->priv;
|
struct undi_nic *undinic = netdev->priv;
|
||||||
struct s_PXENV_UNDI_ISR undi_isr;
|
struct s_PXENV_UNDI_ISR undi_isr;
|
||||||
struct io_buffer *iobuf = NULL;
|
struct io_buffer *iobuf = NULL;
|
||||||
|
unsigned int quota = UNDI_POLL_QUOTA;
|
||||||
size_t len;
|
size_t len;
|
||||||
size_t reserve_len;
|
size_t reserve_len;
|
||||||
size_t frag_len;
|
size_t frag_len;
|
||||||
@ -366,7 +370,7 @@ static void undinet_poll ( struct net_device *netdev ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Run through the ISR loop */
|
/* Run through the ISR loop */
|
||||||
while ( 1 ) {
|
while ( quota-- ) {
|
||||||
profile_start ( &undinet_isr_call_profiler );
|
profile_start ( &undinet_isr_call_profiler );
|
||||||
if ( ( rc = pxeparent_call ( undinet_entry, PXENV_UNDI_ISR,
|
if ( ( rc = pxeparent_call ( undinet_entry, PXENV_UNDI_ISR,
|
||||||
&undi_isr,
|
&undi_isr,
|
||||||
|
Reference in New Issue
Block a user