mirror of https://github.com/ipxe/ipxe.git
[pxe] Discard queued PXE UDP packets when under memory pressure
The PXE UDP receive queue may grow without limit if the PXE NBP does not call PXENV_UDP_READ sufficiently frequently. Fix by implementing a cache discarder for received PXE UDP packets (similar to the TCP cache discarder). Reported-by: Tal Shorer <shorer@amazon.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/859/head
parent
c5426cdaa9
commit
4bffe0f0d9
|
@ -12,6 +12,7 @@
|
||||||
#include <ipxe/uaccess.h>
|
#include <ipxe/uaccess.h>
|
||||||
#include <ipxe/process.h>
|
#include <ipxe/process.h>
|
||||||
#include <ipxe/netdevice.h>
|
#include <ipxe/netdevice.h>
|
||||||
|
#include <ipxe/malloc.h>
|
||||||
#include <realmode.h>
|
#include <realmode.h>
|
||||||
#include <pxe.h>
|
#include <pxe.h>
|
||||||
|
|
||||||
|
@ -482,3 +483,28 @@ struct pxe_api_call pxe_udp_api[] __pxe_api_call = {
|
||||||
PXE_API_CALL ( PXENV_UDP_READ, pxenv_udp_read,
|
PXE_API_CALL ( PXENV_UDP_READ, pxenv_udp_read,
|
||||||
struct s_PXENV_UDP_READ ),
|
struct s_PXENV_UDP_READ ),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Discard some cached PXE UDP data
|
||||||
|
*
|
||||||
|
* @ret discarded Number of cached items discarded
|
||||||
|
*/
|
||||||
|
static unsigned int pxe_udp_discard ( void ) {
|
||||||
|
struct io_buffer *iobuf;
|
||||||
|
unsigned int discarded = 0;
|
||||||
|
|
||||||
|
/* Try to discard the oldest received UDP packet */
|
||||||
|
iobuf = list_first_entry ( &pxe_udp.list, struct io_buffer, list );
|
||||||
|
if ( iobuf ) {
|
||||||
|
list_del ( &iobuf->list );
|
||||||
|
free_iob ( iobuf );
|
||||||
|
discarded++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return discarded;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** PXE UDP cache discarder */
|
||||||
|
struct cache_discarder pxe_udp_discarder __cache_discarder ( CACHE_NORMAL ) = {
|
||||||
|
.discard = pxe_udp_discard,
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue