From 2dbed699e78ed3393ac97a64b04581974070afed Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Sun, 26 Sep 2021 23:19:40 +0200 Subject: passt: Align pkt_buf to PAGE_SIZE (start and size), try to fit in huge pages If transparent huge pages are available, madvise() will do the trick. While at it, decrease EPOLL_EVENTS for the main loop from 10 to 8, for slightly better socket fairness. Signed-off-by: Stefano Brivio --- Makefile | 1 + passt.c | 8 ++++++-- passt.h | 3 ++- util.h | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index c7cbbb7..ac809df 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ CFLAGS += -Wall -Wextra -pedantic CFLAGS += -DRLIMIT_STACK_VAL=$(shell ulimit -s) +CFLAGS += -DPAGE_SIZE=$(shell getconf PAGE_SIZE) prefix ?= /usr/local diff --git a/passt.c b/passt.c index 3604fa1..6645e45 100644 --- a/passt.c +++ b/passt.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -61,12 +62,12 @@ #include "tap.h" #include "conf.h" -#define EPOLL_EVENTS 10 +#define EPOLL_EVENTS 8 #define __TIMER_INTERVAL MIN(TCP_TIMER_INTERVAL, UDP_TIMER_INTERVAL) #define TIMER_INTERVAL MIN(__TIMER_INTERVAL, ICMP_TIMER_INTERVAL) -char pkt_buf [PKT_BUF_BYTES]; +char pkt_buf[PKT_BUF_BYTES] __attribute__ ((aligned(PAGE_SIZE))); char *ip_proto_str[IPPROTO_SCTP + 1] = { [IPPROTO_ICMP] = "ICMP", @@ -323,6 +324,9 @@ int main(int argc, char **argv) log_name = "passt"; } + if (madvise(pkt_buf, TAP_BUF_BYTES, MADV_HUGEPAGE)) + perror("madvise"); + openlog(log_name, 0, LOG_DAEMON); setlogmask(LOG_MASK(LOG_EMERG)); diff --git a/passt.h b/passt.h index 649d4fc..bb41e90 100644 --- a/passt.h +++ b/passt.h @@ -45,7 +45,8 @@ union epoll_ref { uint64_t u64; }; -#define TAP_BUF_BYTES ((ETH_MAX_MTU + sizeof(uint32_t)) * 256) +#define TAP_BUF_BYTES \ + ROUND_DOWN(((ETH_MAX_MTU + sizeof(uint32_t)) * 256), PAGE_SIZE) #define TAP_BUF_FILL (TAP_BUF_BYTES - ETH_MAX_MTU - sizeof(uint32_t)) #define TAP_MSGS \ DIV_ROUND_UP(TAP_BUF_BYTES, ETH_ZLEN - 2 * ETH_ALEN + sizeof(uint32_t)) diff --git a/util.h b/util.h index 2e7699c..6402f41 100644 --- a/util.h +++ b/util.h @@ -25,6 +25,7 @@ void debug(const char *format, ...); #endif #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#define ROUND_DOWN(x, y) ((x) & ~((y) - 1)) #define SWAP(a, b) \ do { \ -- cgit v1.2.3