From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id D8CD637B0 for ; Thu, 31 May 2018 12:12:37 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 May 2018 03:12:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,463,1520924400"; d="scan'208";a="60094584" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga001.fm.intel.com with ESMTP; 31 May 2018 03:12:35 -0700 Received: from sivswdev01.ir.intel.com (sivswdev01.ir.intel.com [10.237.217.45]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id w4VACYHT025116; Thu, 31 May 2018 11:12:34 +0100 Received: from sivswdev01.ir.intel.com (localhost [127.0.0.1]) by sivswdev01.ir.intel.com with ESMTP id w4VACYvw018958; Thu, 31 May 2018 11:12:34 +0100 Received: (from aburakov@localhost) by sivswdev01.ir.intel.com with LOCAL id w4VACYpj018954; Thu, 31 May 2018 11:12:34 +0100 From: Anatoly Burakov To: dev@dpdk.org Cc: thomas@monjalon.net, konstantin.ananyev@intel.com, Jianfeng Tan Date: Thu, 31 May 2018 11:12:33 +0100 Message-Id: X-Mailer: git-send-email 1.7.0.7 In-Reply-To: References: In-Reply-To: References: <1524150216-3407-1-git-send-email-jianfeng.tan@intel.com> Subject: [dpdk-dev] [RFC v2 6/6] ipc: remove main IPC thread X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 May 2018 10:12:38 -0000 Previously, to handle requests from peer(s), or replies for a request (sync or async) by itself, a dedicated IPC thread was set up. Now that every other piece of the puzzle is in place, we can get rid of the IPC thread, and move waiting for IPC messages entirely into the interrupt thread. Signed-off-by: Jianfeng Tan Signed-off-by: Anatoly Burakov Suggested-by: Thomas Monjalon --- Notes: RFC->RFCv2: - Fixed resource leaks - Improved readability lib/librte_eal/common/eal_common_proc.c | 46 ++++++++++++++----------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/lib/librte_eal/common/eal_common_proc.c b/lib/librte_eal/common/eal_common_proc.c index 6f3366403..162d67ca5 100644 --- a/lib/librte_eal/common/eal_common_proc.c +++ b/lib/librte_eal/common/eal_common_proc.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -101,6 +102,8 @@ static struct { /**< used in async requests only */ }; +static struct rte_intr_handle ipc_intr_handle; + /* forward declarations */ static int mp_send(struct rte_mp_msg *msg, const char *peer, int type); @@ -350,18 +353,17 @@ process_msg(struct mp_msg_internal *m, struct sockaddr_un *s) } } -static void * +static void mp_handle(void *arg __rte_unused) { struct mp_msg_internal msg; struct sockaddr_un sa; while (1) { - if (read_msg(&msg, &sa) == 0) - process_msg(&msg, &sa); + if (read_msg(&msg, &sa) < 0) + break; + process_msg(&msg, &sa); } - - return NULL; } static int @@ -570,7 +572,6 @@ rte_mp_channel_init(void) { char path[PATH_MAX]; int dir_fd; - pthread_t mp_handle_tid; /* create filter path */ create_socket_path("*", path, sizeof(path)); @@ -585,36 +586,32 @@ rte_mp_channel_init(void) if (dir_fd < 0) { RTE_LOG(ERR, EAL, "failed to open %s: %s\n", mp_dir_path, strerror(errno)); - return -1; + goto fail; } if (flock(dir_fd, LOCK_EX)) { RTE_LOG(ERR, EAL, "failed to lock %s: %s\n", mp_dir_path, strerror(errno)); - close(dir_fd); - return -1; + goto fail; } if (rte_eal_process_type() == RTE_PROC_PRIMARY && unlink_sockets(mp_filter)) { RTE_LOG(ERR, EAL, "failed to unlink mp sockets\n"); - close(dir_fd); - return -1; + goto fail; } if (open_socket_fd() < 0) { - close(dir_fd); - return -1; + goto fail; } - if (rte_ctrl_thread_create(&mp_handle_tid, "rte_mp_handle", - NULL, mp_handle, NULL) < 0) { - RTE_LOG(ERR, EAL, "failed to create mp thead: %s\n", - strerror(errno)); - close(mp_fd); - close(dir_fd); - mp_fd = -1; - return -1; + ipc_intr_handle.fd = mp_fd; + ipc_intr_handle.type = RTE_INTR_HANDLE_IPC; + + if (rte_intr_callback_register(&ipc_intr_handle, mp_handle, NULL) < 0) { + RTE_LOG(ERR, EAL, "failed to register IPC interrupt callback: %s\n", + strerror(errno)); + goto fail; } /* unlock the directory */ @@ -622,6 +619,13 @@ rte_mp_channel_init(void) close(dir_fd); return 0; +fail: + if (dir_fd >= 0) + close(dir_fd); + if (mp_fd >= 0) + close(mp_fd); + mp_fd = -1; + return -1; } /** -- 2.17.0