]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[pxe] Discard queued PXE UDP packets when under memory pressure 859/head
authorMichael Brown <mcb30@ipxe.org>
Mon, 23 Jan 2023 22:20:36 +0000 (22:20 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 25 Jan 2023 10:03:09 +0000 (10:03 +0000)
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>
src/arch/x86/interface/pxe/pxe_udp.c

index 5a04f0865f9953aec41b8b80d2b553af5e41d05e..a5d5eb77b5906fab0a56382ebb9102967dc13ce6 100644 (file)
@@ -12,6 +12,7 @@
 #include <ipxe/uaccess.h>
 #include <ipxe/process.h>
 #include <ipxe/netdevice.h>
+#include <ipxe/malloc.h>
 #include <realmode.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,
                       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,
+};