diff --git a/qtfs/qtfs/Makefile b/qtfs/qtfs/Makefile index 9b3ebe5586b3ce1c28dcfc87225a792bdd16dd81..a6a6dca6c2e507cdf13a06b15ae8af96724bda3d 100644 --- a/qtfs/qtfs/Makefile +++ b/qtfs/qtfs/Makefile @@ -3,6 +3,9 @@ ccflags-y += -I$(src)/../ -I$(src)/../utils/ -I$(src)/../include/ -I$(src)/../ip else ccflags-y += -I$(src)/../ -I$(src)/../utils/ -I$(src)/../include/ -I$(src)/../ipc/ -I$(src) -DQTFS_CLIENT endif +ifdef EPOLL_PROXY +ccflags-y += -DEPOLL_PROXY +endif KBUILD=/lib/modules/$(shell uname -r)/build/ COMM=../qtfs_common/ diff --git a/qtfs/qtfs/qtfs-mod.c b/qtfs/qtfs/qtfs-mod.c index 0ce43fb8405836fb46d358d03f16608aafb35d5c..79256ad0028a22be4edca6429dce7db24529b10e 100644 --- a/qtfs/qtfs/qtfs-mod.c +++ b/qtfs/qtfs/qtfs-mod.c @@ -33,8 +33,9 @@ static struct file_system_type qtfs_fs_type = { }; MODULE_ALIAS_FS("qtfs"); struct kmem_cache *qtfs_inode_priv_cache; +#ifdef EPOLL_PROXY struct task_struct *g_qtfs_epoll_thread = NULL; - +#endif /* * 转发框架层: * 1. 调用者先在pvar里预留框架头后,填好自己的私有发送数据。 @@ -124,6 +125,7 @@ retry: return pvar->conn_ops->get_conn_msg_buf(pvar, QTFS_RECV); } +#ifdef EPOLL_PROXY static int qtfs_epoll_thread(void *data) { struct qtfs_conn_var_s *pvar = NULL; @@ -202,6 +204,7 @@ end: g_qtfs_epoll_thread = NULL; return 0; } +#endif struct file_operations qtfs_misc_fops = { .owner=THIS_MODULE, @@ -236,12 +239,14 @@ static int __init qtfs_init(void) goto conn_init_err; } qtfs_whitelist_initset(); +#ifdef EPOLL_PROXY g_qtfs_epoll_thread = kthread_run(qtfs_epoll_thread, NULL, "qtfs_epoll"); if (IS_ERR_OR_NULL(g_qtfs_epoll_thread)) { qtfs_err("qtfs epoll thread run failed.\n"); ret = QTFS_PTR_ERR(g_qtfs_epoll_thread); goto epoll_thread_err; } +#endif qtfs_diag_info = (struct qtinfo *)kmalloc(sizeof(struct qtinfo), GFP_KERNEL); if (qtfs_diag_info == NULL) { qtfs_err("kmalloc qtfs diag info failed."); @@ -278,7 +283,9 @@ syscall_replace_err: misc_register_err: kfree(qtfs_diag_info); diag_malloc_err: +#ifdef EPOLL_PROXY kthread_stop(g_qtfs_epoll_thread); +#endif epoll_thread_err: qtfs_conn_param_fini(); conn_init_err: @@ -293,18 +300,22 @@ static void __exit qtfs_exit(void) int ret; qtfs_mod_exiting = true; +#ifdef EPOLL_PROXY if (g_qtfs_epoll_thread) { kthread_stop(g_qtfs_epoll_thread); } +#endif qtfs_conn_param_fini(); qtfs_misc_destroy(); +#ifdef EPOLL_PROXY if (qtfs_epoll_var != NULL) { qtfs_epoll_cut_conn(qtfs_epoll_var); qtfs_epoll_var->conn_ops->conn_var_fini(qtfs_epoll_var); kfree(qtfs_epoll_var); qtfs_epoll_var = NULL; } +#endif qtfs_whitelist_exit(); kfree(qtfs_diag_info); diff --git a/qtfs/qtfs_common/conn.c b/qtfs/qtfs_common/conn.c index 5f080cdea598feb536757f18cd826a4db0140721..fd5f65461cd05075f3587f2cf93f30b5923ffb09 100644 --- a/qtfs/qtfs_common/conn.c +++ b/qtfs/qtfs_common/conn.c @@ -42,7 +42,9 @@ static struct mutex g_param_mutex; static struct mutex g_fifo_mutex; int qtfs_mod_exiting = false; struct qtfs_conn_var_s *qtfs_thread_var[QTFS_MAX_THREADS] = {NULL}; +#ifdef EPOLL_PROXY struct qtfs_conn_var_s *qtfs_epoll_var = NULL; +#endif #ifdef QTFS_SERVER struct qtfs_server_userp_s *qtfs_userps = NULL; #endif @@ -520,7 +522,11 @@ void *qtfs_conn_msg_buf(struct qtfs_conn_var_s *pvar, int dir) static int qtfs_sm_connecting(struct qtfs_conn_var_s *pvar) { int ret = QTERROR; +#ifdef QTFS_CLIENT int retry = 3; +#else + int retry = 1; +#endif while (qtfs_mod_exiting == false && retry-- > 0) { ret = pvar->conn_ops->conn_new_connection(&pvar->conn_var, pvar->user_type); if (ret == 0) { @@ -873,6 +879,7 @@ retry: return pvar; } +#ifdef EPOLL_PROXY struct qtfs_conn_var_s *qtfs_epoll_establish_conn(void) { struct qtfs_conn_var_s *pvar = NULL; @@ -920,6 +927,7 @@ struct qtfs_conn_var_s *qtfs_epoll_establish_conn(void) qtfs_info("qtfs create new epoll param state:%s", QTCONN_CUR_STATE(pvar)); return pvar; } +#endif void qtfs_conn_put_param(struct qtfs_conn_var_s *pvar) { @@ -944,6 +952,7 @@ void qtfs_conn_put_param(struct qtfs_conn_var_s *pvar) mutex_unlock(&g_param_mutex); } +#ifdef EPOLL_PROXY void qtfs_epoll_cut_conn(struct qtfs_conn_var_s *pvar) { int ret = 0; @@ -958,6 +967,7 @@ void qtfs_epoll_cut_conn(struct qtfs_conn_var_s *pvar) qtfs_err("qtfs epoll put param exit failed, ret:%d state:%s", ret, QTCONN_CUR_STATE(pvar)); } } +#endif #ifdef QTFS_CLIENT /* fifo的机制有所不同,每一个pvar对应唯一一个fifo的访问,生命周期贯穿 diff --git a/qtfs/qtfs_common/misc.c b/qtfs/qtfs_common/misc.c index e1c3520da20860e7f848196a8078a1ea875a9037..3adfb578a78ba9d099f7bf07896cd75b29ee93c5 100644 --- a/qtfs/qtfs_common/misc.c +++ b/qtfs/qtfs_common/misc.c @@ -68,7 +68,9 @@ void qtfs_misc_flush_threadstate(void) } qtfs_diag_info->thread_state[i] = qtfs_thread_var[i]->state; } +#ifdef EPOLL_PROXY qtfs_diag_info->epoll_state = (qtfs_epoll_var == NULL) ? -1 : qtfs_epoll_var->state; +#endif } void qtfs_req_size(void) diff --git a/qtfs/qtfs_common/socket.c b/qtfs/qtfs_common/socket.c index f247be09037527618ceddd1520bb590500e4e19b..233a1ce7a2778271826db3ca6d70634646d9ad0d 100644 --- a/qtfs/qtfs_common/socket.c +++ b/qtfs/qtfs_common/socket.c @@ -162,6 +162,11 @@ static int qtfs_conn_sock_server_accept(void *connvar, qtfs_conn_type_e type) mutex_unlock(&qtfs_server_main_sock[type].lock); return -EFAULT; } + if (qtfs_server_thread_run == 0) { + qtfs_err("engine is exit now, return right now."); + mutex_unlock(&qtfs_server_main_sock[type].lock); + return -EINTR; + } sock = qtfs_server_main_sock[type].sock; if (sock == NULL) { @@ -246,7 +251,7 @@ static int qtfs_conn_sock_init(void *connvar, qtfs_conn_type_e type) } qtfs_info("qtfs socket init sock OK, type:%d!", type); - qtfs_sock_recvtimeo_set(sock, 0, 100000); + qtfs_sock_recvtimeo_set(sock, 1, 0); qtfs_server_main_sock[type].sock = sock; mutex_unlock(&qtfs_server_main_sock[type].lock); return 0; @@ -282,6 +287,7 @@ static int qtfs_conn_sock_client_connect(void *connvar, qtfs_conn_type_e type) ret = sock->ops->connect(sock, (struct sockaddr *)&saddr, sizeof(saddr), 0); if (ret < 0) { + qtfs_err("qtfs client connect failed, ret:%d", ret); return ret; } #ifdef QTFS_TEST_MODE diff --git a/qtfs/qtfs_common/user_engine.c b/qtfs/qtfs_common/user_engine.c index a3edac28f63ce6cb3d6e9ff874c8a2d397ce5b25..a6029809fcaee1cbc237df8e0694e30da07f0972 100644 --- a/qtfs/qtfs_common/user_engine.c +++ b/qtfs/qtfs_common/user_engine.c @@ -177,8 +177,8 @@ static void *qtfs_engine_kthread(void *arg) break; } if (sig_int_flag == 1) { + sig_int_flag = 0; engine_out("qtfs engine recv SIGINT."); - if (qtfs_fd < 0) { engine_err("qtfs engine signal int file:%s open failed, fd:%d.", QTFS_SERVER_FILE, qtfs_fd); continue; @@ -204,6 +204,7 @@ static void qtfs_signal_int(int signum) return; } +#ifdef EPOLL_PROXY static void *qtfs_engine_epoll_thread(void *data) { struct engine_arg *arg = (struct engine_arg *)data; @@ -264,6 +265,7 @@ int qtfs_epoll_init(int fd) return epfd; } +#endif static void qtfs_whitelist_free_items(char **items, gsize count) { @@ -498,11 +500,13 @@ int main(int argc, char *argv[]) } qtfs_fd = fd; // init epoll +#ifdef EPOLL_PROXY int epfd = qtfs_epoll_init(fd); if (epfd < 0) { close(fd); return -1; } +#endif ret = ioctl(fd, QTFS_IOCTL_EXIT, 1); if (ret == QTERROR) { goto end; @@ -539,7 +543,9 @@ int main(int argc, char *argv[]) arg[i].thread_idx = i; (void)pthread_create(&texec[i], NULL, qtfs_engine_kthread, &arg[i]); } +#ifdef EPOLL_PROXY (void)pthread_create(&tepoll, NULL, qtfs_engine_epoll_thread, &arg[0]); +#endif #ifdef QTFS_TEST_MODE fifo_arg.addr = argv[3]; @@ -566,14 +572,18 @@ int main(int argc, char *argv[]) pthread_join(texec[i], NULL); engine_out("qtfs engine join thread %d.", i); } +#ifdef EPOLL_PROXY pthread_join(tepoll, NULL); +#endif pthread_join(tfifo, NULL); engine_free: qtfs_engine_userp_free(userp, thread_nums); engine_out("qtfs engine join epoll thread."); end: (void)ioctl(fd, QTFS_IOCTL_EXIT, 0); +#ifdef EPOLL_PROXY close(epfd); +#endif close(fd); engine_out("qtfs engine over."); return ret; diff --git a/qtfs/qtfs_server/Makefile b/qtfs/qtfs_server/Makefile index 4608365f1ca60e08ec60fd9abcbeb4e8941f61d8..765567a1040817ab018abebed472d9b5fd60fcbb 100644 --- a/qtfs/qtfs_server/Makefile +++ b/qtfs/qtfs_server/Makefile @@ -4,6 +4,10 @@ CFLAGS += -DUDS_TEST_MODE -DQTFS_TEST_MODE else ccflags-y += -I$(src)/../ -I$(src) -I$(src)/../ipc/ -I$(src)/../include/ -DQTFS_SERVER endif +ifdef EPOLL_PROXY +ccflags-y += -DEPOLL_PROXY +CFLAGS += -DEPOLL_PROXY +endif CFLAGS += -g -O2 CFLAGS += -fstack-protector-strong diff --git a/qtfs/qtfs_server/qtfs-server.c b/qtfs/qtfs_server/qtfs-server.c index f4e201c63efb75958f791ad1945903550e23594b..48248ba2fa8db717cac6e44c13eab0cbf6217a48 100644 --- a/qtfs/qtfs_server/qtfs-server.c +++ b/qtfs/qtfs_server/qtfs-server.c @@ -59,6 +59,7 @@ void qtfs_server_epoll_exit(void) return; } +#ifdef EPOLL_PROXY long qtfs_server_epoll_thread(struct qtfs_conn_var_s *pvar) { int n; @@ -170,6 +171,7 @@ long qtfs_server_epoll_init(void) return QTOK; } +#endif int qtfs_server_fd_bitmap_init(void) { @@ -308,11 +310,16 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a write_unlock(&qtfs_epoll_rwlock); break; case QTFS_IOCTL_EPOLL_THREAD_INIT: +#ifdef EPOLL_PROXY write_lock(&qtfs_epoll_rwlock); ret = qtfs_server_epoll_init(); write_unlock(&qtfs_epoll_rwlock); +#else + qtfs_warn("Qtfs not support epoll proxy, please compile with EPOLL_PROXY=1 to enable it."); +#endif break; case QTFS_IOCTL_EPOLL_THREAD_RUN: +#ifdef EPOLL_PROXY write_lock(&qtfs_epoll_rwlock); if (qtfs_epoll_var == NULL) { qtfs_err("qtfs epoll thread run failed, var is invalid."); @@ -326,6 +333,9 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a qtfs_info("qtfs epoll thread exit."); qtfs_epoll_cut_conn(qtfs_epoll_var); } +#else + qtfs_warn("Qtfs not support epoll proxy, please compile with EPOLL_PROXY=1 to enable it."); +#endif break; case QTFS_IOCTL_EXIT: if (arg != 0 && arg != 1) { @@ -403,6 +413,7 @@ static void __exit qtfs_server_exit(void) qtfs_conn_param_fini(); +#ifdef EPOLL_PROXY if (qtfs_epoll_var != NULL) { qtfs_epoll_cut_conn(qtfs_epoll_var); qtfs_conn_fini(qtfs_epoll_var); @@ -410,6 +421,7 @@ static void __exit qtfs_server_exit(void) kfree(qtfs_epoll_var); qtfs_epoll_var = NULL; } +#endif if (qtfs_diag_info != NULL) { kfree(qtfs_diag_info); qtfs_diag_info = NULL;