From 9025283608a2a0ec198f8aba2878aa7c5848e650 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Thu, 7 Sep 2017 11:03:13 +0200 Subject: [PATCH] server: handler limit --- kernel/mars_server.c | 18 ++++++++++++++++-- kernel/mars_server.h | 1 + kernel/sy_old/mars_proc.c | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/kernel/mars_server.c b/kernel/mars_server.c index 9a194a18..b9224e3b 100644 --- a/kernel/mars_server.c +++ b/kernel/mars_server.c @@ -52,6 +52,12 @@ EXPORT_SYMBOL_GPL(server_handler_count); ///////////////////////// own helper functions //////////////////////// +#define HANDLER_LIMIT 64 + +int handler_limit = HANDLER_LIMIT; +int handler_nr = HANDLER_LIMIT; +static struct semaphore handler_limit_sem = __SEMAPHORE_INITIALIZER(handler_limit_sem, HANDLER_LIMIT); + #define DENT_LIMIT 8 int dent_limit = DENT_LIMIT; @@ -417,11 +423,16 @@ int handler_thread(void *data) MARS_DBG("#%d is dead\n", sock->s_debug_nr); goto clean; } + if (down_trylock(&handler_limit_sem)) { + MARS_DBG("#%d handler limit reached\n", sock->s_debug_nr); + status = -EUSERS; + goto clean; + } status = mars_recv_struct(sock, &cmd, mars_cmd_meta); if (unlikely(status < 0)) { MARS_WRN("#%d recv cmd status = %d\n", sock->s_debug_nr, status); - goto clean; + goto clean_unlock; } MARS_IO("#%d cmd = %d\n", sock->s_debug_nr, cmd.cmd_code); @@ -429,7 +440,7 @@ int handler_thread(void *data) if (unlikely(!brick->global || !mars_global || !mars_global->global_power.button)) { MARS_WRN("#%d system is not alive\n", sock->s_debug_nr); status = -EINTR; - goto clean; + goto clean_unlock; } status = -EPROTO; @@ -542,6 +553,8 @@ int handler_thread(void *data) default: MARS_ERR("#%d unknown command %d\n", sock->s_debug_nr, cmd.cmd_code); } + clean_unlock: + up(&handler_limit_sem); clean: brick_string_free(cmd.cmd_str1); if (unlikely(status < 0)) { @@ -815,6 +828,7 @@ static int _server_thread(void *data) struct server_brick *brick = NULL; struct mars_socket handler_socket = {}; + change_sem(&handler_limit_sem, &handler_limit, &handler_nr); change_sem(&dent_limit_sem, &dent_limit, &dent_nr); server_global.global_version++; diff --git a/kernel/mars_server.h b/kernel/mars_server.h index 499c7958..dc51db31 100644 --- a/kernel/mars_server.h +++ b/kernel/mars_server.h @@ -33,6 +33,7 @@ extern int server_show_statist; extern struct mars_limiter server_limiter; extern int dent_limit; +extern int handler_limit; extern atomic_t server_handler_count; diff --git a/kernel/sy_old/mars_proc.c b/kernel/sy_old/mars_proc.c index 8e21d2ef..4d5a6b1d 100644 --- a/kernel/sy_old/mars_proc.c +++ b/kernel/sy_old/mars_proc.c @@ -345,6 +345,7 @@ struct ctl_table mars_table[] = { INT_ENTRY("sync_nr", global_sync_nr, 0400), INT_ENTRY("sync_limit", global_sync_limit, 0600), INT_ENTRY("handler_dent_limit", dent_limit, 0600), + INT_ENTRY("handler_limit", handler_limit, 0600), INT_ENTRY("mars_emergency_mode", mars_emergency_mode, 0600), INT_ENTRY("mars_reset_emergency", mars_reset_emergency, 0600), INT_ENTRY("mars_keep_msg_s", mars_keep_msg, 0600),