diff --git a/http_server.c b/http_server.c index 9b81371..ad29ae5 100644 --- a/http_server.c +++ b/http_server.c @@ -7,6 +7,8 @@ #include "http_parser.h" #include "http_server.h" +extern mempool_t *http_buf_pool; + #define CRLF "\r\n" #define HTTP_RESPONSE_200_DUMMY \ @@ -30,7 +32,6 @@ "Content-Type: text/plain" CRLF "Content-Length: 21" CRLF \ "Connection: KeepAlive" CRLF CRLF "501 Not Implemented" CRLF -#define RECV_BUFFER_SIZE 4096 struct http_request { struct socket *socket; @@ -165,7 +166,7 @@ static int http_server_worker(void *arg) allow_signal(SIGKILL); allow_signal(SIGTERM); - buf = kzalloc(RECV_BUFFER_SIZE, GFP_KERNEL); + buf = mempool_alloc(http_buf_pool, GFP_KERNEL); if (!buf) { pr_err("can't allocate memory!\n"); err = -ENOMEM; @@ -190,7 +191,7 @@ static int http_server_worker(void *arg) memset(buf, 0, RECV_BUFFER_SIZE); } out_free_buf: - kfree(buf); + mempool_free(buf, http_buf_pool); out: kernel_sock_shutdown(socket, SHUT_RDWR); sock_release(socket); diff --git a/http_server.h b/http_server.h index 7081361..7e6992c 100644 --- a/http_server.h +++ b/http_server.h @@ -3,10 +3,22 @@ #include +#define RECV_BUFFER_SIZE 4096 +extern mempool_t *http_buf_pool; + struct http_server_param { struct socket *listen_socket; }; extern int http_server_daemon(void *arg); +static inline void *http_buf_alloc(gfp_t gfp_mask, void *pool_data) +{ + return kzalloc(RECV_BUFFER_SIZE, gfp_mask); +} + +static inline void http_buf_free(void *element, void *pool_data) +{ + kfree(element); +} #endif diff --git a/main.c b/main.c index d1cd278..692886a 100644 --- a/main.c +++ b/main.c @@ -1,7 +1,9 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include +#include #include +#include #include #include #include @@ -10,6 +12,9 @@ #define DEFAULT_PORT 8081 #define DEFAULT_BACKLOG 100 +#define POOL_MIN_NR 4 + +mempool_t *http_buf_pool; static ushort port = DEFAULT_PORT; module_param(port, ushort, S_IRUGO); @@ -154,6 +159,11 @@ static void close_listen_socket(struct socket *socket) static int __init khttpd_init(void) { + if (!(http_buf_pool = mempool_create(POOL_MIN_NR, http_buf_alloc, + http_buf_free, NULL))) { + pr_err("failed to create mempool\n"); + return -ENOMEM; + } int err = open_listen_socket(port, backlog, &listen_socket); if (err < 0) { pr_err("can't open listen socket\n");