In udp_tap_handler() the array of msghdr structures, mm[], is initialized
to zero. Since UIO_MAXIOV is 1024, this can be quite a large zero, which
is expensive if we only end up using a few of its entries. It also makes
it less obvious how we're setting all the control fields at the point we
actually invoke sendmmsg().
Rather than pre-initializing it, just initialize each element as we use it.
Signed-off-by: David Gibson
---
udp.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/udp.c b/udp.c
index c4ebecc..864e7b2 100644
--- a/udp.c
+++ b/udp.c
@@ -968,7 +968,7 @@ void udp_sock_handler(const struct ctx *c, union epoll_ref ref, uint32_t events,
int udp_tap_handler(struct ctx *c, int af, const void *addr,
const struct pool *p, const struct timespec *now)
{
- struct mmsghdr mm[UIO_MAXIOV] = { 0 };
+ struct mmsghdr mm[UIO_MAXIOV];
struct iovec m[UIO_MAXIOV];
struct sockaddr_in6 s_in6;
struct sockaddr_in s_in;
@@ -1087,6 +1087,10 @@ int udp_tap_handler(struct ctx *c, int af, const void *addr,
mm[i].msg_hdr.msg_iov = m + i;
mm[i].msg_hdr.msg_iovlen = 1;
+ mm[i].msg_hdr.msg_control = NULL;
+ mm[i].msg_hdr.msg_controllen = 0;
+ mm[i].msg_hdr.msg_flags = 0;
+
count++;
}
--
2.37.3