david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[linux] Impose receive quota on tap driver

The tap driver can retrieve a potentially unlimited number of packets
in a single poll.  This can lead to heap exhaustion under heavy load.

Fix by imposing an artificial receive quota (as already used in other
drivers without natural receive limits).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2017-09-04 18:00:34 +01:00
parent 42eedb04c1
commit 306465bef3
1 changed files with 4 additions and 1 deletions

View File

@ -40,6 +40,7 @@
#include <linux/if_tun.h>
#define RX_BUF_SIZE 1536
#define RX_QUOTA 4
/** @file
*
@ -127,6 +128,7 @@ static void tap_poll(struct net_device *netdev)
struct tap_nic * nic = netdev->priv;
struct pollfd pfd;
struct io_buffer * iobuf;
unsigned int quota = RX_QUOTA;
int r;
pfd.fd = nic->fd;
@ -144,7 +146,8 @@ static void tap_poll(struct net_device *netdev)
if (! iobuf)
goto allocfail;
while ((r = linux_read(nic->fd, iobuf->data, RX_BUF_SIZE)) > 0) {
while (quota-- &&
((r = linux_read(nic->fd, iobuf->data, RX_BUF_SIZE)) > 0)) {
DBGC2(nic, "tap %p read %d bytes\n", nic, r);
iob_put(iobuf, r);