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 <sbrivio@redhat.com>
This commit is contained in:
parent
cc8db1c5bc
commit
2dbed699e7
4 changed files with 10 additions and 3 deletions
1
Makefile
1
Makefile
|
@ -1,5 +1,6 @@
|
||||||
CFLAGS += -Wall -Wextra -pedantic
|
CFLAGS += -Wall -Wextra -pedantic
|
||||||
CFLAGS += -DRLIMIT_STACK_VAL=$(shell ulimit -s)
|
CFLAGS += -DRLIMIT_STACK_VAL=$(shell ulimit -s)
|
||||||
|
CFLAGS += -DPAGE_SIZE=$(shell getconf PAGE_SIZE)
|
||||||
|
|
||||||
prefix ?= /usr/local
|
prefix ?= /usr/local
|
||||||
|
|
||||||
|
|
8
passt.c
8
passt.c
|
@ -28,6 +28,7 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
@ -61,12 +62,12 @@
|
||||||
#include "tap.h"
|
#include "tap.h"
|
||||||
#include "conf.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(TCP_TIMER_INTERVAL, UDP_TIMER_INTERVAL)
|
||||||
#define TIMER_INTERVAL MIN(__TIMER_INTERVAL, ICMP_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] = {
|
char *ip_proto_str[IPPROTO_SCTP + 1] = {
|
||||||
[IPPROTO_ICMP] = "ICMP",
|
[IPPROTO_ICMP] = "ICMP",
|
||||||
|
@ -323,6 +324,9 @@ int main(int argc, char **argv)
|
||||||
log_name = "passt";
|
log_name = "passt";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (madvise(pkt_buf, TAP_BUF_BYTES, MADV_HUGEPAGE))
|
||||||
|
perror("madvise");
|
||||||
|
|
||||||
openlog(log_name, 0, LOG_DAEMON);
|
openlog(log_name, 0, LOG_DAEMON);
|
||||||
|
|
||||||
setlogmask(LOG_MASK(LOG_EMERG));
|
setlogmask(LOG_MASK(LOG_EMERG));
|
||||||
|
|
3
passt.h
3
passt.h
|
@ -45,7 +45,8 @@ union epoll_ref {
|
||||||
uint64_t u64;
|
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_BUF_FILL (TAP_BUF_BYTES - ETH_MAX_MTU - sizeof(uint32_t))
|
||||||
#define TAP_MSGS \
|
#define TAP_MSGS \
|
||||||
DIV_ROUND_UP(TAP_BUF_BYTES, ETH_ZLEN - 2 * ETH_ALEN + sizeof(uint32_t))
|
DIV_ROUND_UP(TAP_BUF_BYTES, ETH_ZLEN - 2 * ETH_ALEN + sizeof(uint32_t))
|
||||||
|
|
1
util.h
1
util.h
|
@ -25,6 +25,7 @@ void debug(const char *format, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
||||||
|
#define ROUND_DOWN(x, y) ((x) & ~((y) - 1))
|
||||||
|
|
||||||
#define SWAP(a, b) \
|
#define SWAP(a, b) \
|
||||||
do { \
|
do { \
|
||||||
|
|
Loading…
Reference in a new issue