From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf0-f66.google.com (mail-lf0-f66.google.com [209.85.215.66]) by dpdk.org (Postfix) with ESMTP id 79B421B334 for ; Fri, 19 Jan 2018 15:48:07 +0100 (CET) Received: by mail-lf0-f66.google.com with SMTP id k19so2402859lfj.1 for ; Fri, 19 Jan 2018 06:48:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=LhPWbBXs7shzgKXYvudZzvsI8AQ0Ukjkk3wipbOEsBc=; b=SsdjW026B41apTJBNQ0mxZLGtIZfBoIebRHJrG1aMfUHyqbXEHiD8PEf7oYiCgY/zz EYFtH/rgB01j8xF3HS8wMkzr2E8KeSPQxwwsEyLNIJX0JNsinyjwCm+WeLrg8LKF1PKu 4HSbuLZxXMly6ZQgOR/bwZSQUz1eRgH1vAGtBpFd1scPSMI8tq+BiaTr9/dTojfm/FdT dV0rI2pwxsS4jJLtnXxiGxxAlFtEAYDRiCRgcJ3vJmksw6nKShFHrZHLedH1sXAq3juU vwq002GlWId88ZOoRxvtqvdaBdsxz1L7uD5G8ONyQ63WN2pb6r6JUU0KnUXOIU4bADkc Tt5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=LhPWbBXs7shzgKXYvudZzvsI8AQ0Ukjkk3wipbOEsBc=; b=AENMY6LUYXJH/5msUngO7/VDrj6InlevArw88twOzy10ZmKeVFpHlWtUpnEfDu0XAW baOT1yRjZDT0u+7Ml9YONuKbAvE/D8DnPkbjWNefthCv2fqs8mpXzW4JnC0Nq7jEU1I9 1bSK/XMjBcD9XSMpHBowxz/PGpyAD+oJ3kEiYHXa0y2kTdZmXMudRfIzwcNvCvGZAuym ZEo1/VaJNuVybzLHr3kRTJPC4GcoXGXnHtQbYtQX9U5F8VTGUS9GmnKZinw1slWHb37k xvOPig62z3ENF8rwGZbeKxT5VSnmbW50PYxeWPJn8yv2Ak1cPxcp25WOHHWOtXup4Eol HfUw== X-Gm-Message-State: AKwxytcT8RB+k/3YF6HrVfQGLlWoOeBUmXMIL3x+0Vld4ByJoUgTnPLp i8UmDR8JVSl9gvHNeahDk/on//mAWwU= X-Google-Smtp-Source: ACJfBosii1dYTM3piU8VOZQhvoKWEJQtMvZNvRdAjcsKTP/i/zRuO30qTDtjxKl/mjcObzYmKGK7Eg== X-Received: by 10.46.4.15 with SMTP id 15mr5745133lje.64.1516373286593; Fri, 19 Jan 2018 06:48:06 -0800 (PST) Received: from b.semihalf.local (31-172-191-173.noc.fibertech.net.pl. [31.172.191.173]) by smtp.gmail.com with ESMTPSA id i65sm1693752lfb.11.2018.01.19.06.48.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 19 Jan 2018 06:48:05 -0800 (PST) From: Andriy Berestovskyy To: dev@dpdk.org Cc: remy.horton@intel.com Date: Fri, 19 Jan 2018 15:47:41 +0100 Message-Id: <16d055c21f6c9e3788fff1a9ecef12d1449d7305.1516373253.git.aber@semihalf.com> X-Mailer: git-send-email 2.7.4 Subject: [dpdk-dev] [PATCH] keepalive: fix keepalive state alignment 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: Fri, 19 Jan 2018 14:48:07 -0000 The __rte_cache_aligned was applied to the whole array, not the array elements. This leads to a false sharing between the monitored cores. Fixes: e70a61ad50ab ("keepalive: export states") Cc: remy.horton@intel.com Signed-off-by: Andriy Berestovskyy --- lib/librte_eal/common/rte_keepalive.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/librte_eal/common/rte_keepalive.c b/lib/librte_eal/common/rte_keepalive.c index 7ddf201..a586e03 100644 --- a/lib/librte_eal/common/rte_keepalive.c +++ b/lib/librte_eal/common/rte_keepalive.c @@ -13,8 +13,13 @@ struct rte_keepalive { /** Core Liveness. */ - enum rte_keepalive_state __rte_cache_aligned state_flags[ - RTE_KEEPALIVE_MAXCORES]; + struct { + /* + * Each element of the state_flags table must be cache aligned + * to prevent false sharing. + */ + enum rte_keepalive_state s __rte_cache_aligned; + } state_flags[RTE_KEEPALIVE_MAXCORES]; /** Last-seen-alive timestamps */ uint64_t last_alive[RTE_KEEPALIVE_MAXCORES]; @@ -67,19 +72,19 @@ rte_keepalive_dispatch_pings(__rte_unused void *ptr_timer, if (keepcfg->active_cores[idx_core] == 0) continue; - switch (keepcfg->state_flags[idx_core]) { + switch (keepcfg->state_flags[idx_core].s) { case RTE_KA_STATE_UNUSED: break; case RTE_KA_STATE_ALIVE: /* Alive */ - keepcfg->state_flags[idx_core] = RTE_KA_STATE_MISSING; + keepcfg->state_flags[idx_core].s = RTE_KA_STATE_MISSING; keepcfg->last_alive[idx_core] = rte_rdtsc(); break; case RTE_KA_STATE_MISSING: /* MIA */ print_trace("Core MIA. ", keepcfg, idx_core); - keepcfg->state_flags[idx_core] = RTE_KA_STATE_DEAD; + keepcfg->state_flags[idx_core].s = RTE_KA_STATE_DEAD; break; case RTE_KA_STATE_DEAD: /* Dead */ - keepcfg->state_flags[idx_core] = RTE_KA_STATE_GONE; + keepcfg->state_flags[idx_core].s = RTE_KA_STATE_GONE; print_trace("Core died. ", keepcfg, idx_core); if (keepcfg->callback) keepcfg->callback( @@ -90,7 +95,7 @@ rte_keepalive_dispatch_pings(__rte_unused void *ptr_timer, case RTE_KA_STATE_GONE: /* Buried */ break; case RTE_KA_STATE_DOZING: /* Core going idle */ - keepcfg->state_flags[idx_core] = RTE_KA_STATE_SLEEP; + keepcfg->state_flags[idx_core].s = RTE_KA_STATE_SLEEP; keepcfg->last_alive[idx_core] = rte_rdtsc(); break; case RTE_KA_STATE_SLEEP: /* Idled core */ @@ -100,7 +105,7 @@ rte_keepalive_dispatch_pings(__rte_unused void *ptr_timer, keepcfg->relay_callback( keepcfg->relay_callback_data, idx_core, - keepcfg->state_flags[idx_core], + keepcfg->state_flags[idx_core].s, keepcfg->last_alive[idx_core] ); } @@ -144,11 +149,11 @@ rte_keepalive_register_core(struct rte_keepalive *keepcfg, const int id_core) void rte_keepalive_mark_alive(struct rte_keepalive *keepcfg) { - keepcfg->state_flags[rte_lcore_id()] = RTE_KA_STATE_ALIVE; + keepcfg->state_flags[rte_lcore_id()].s = RTE_KA_STATE_ALIVE; } void rte_keepalive_mark_sleep(struct rte_keepalive *keepcfg) { - keepcfg->state_flags[rte_lcore_id()] = RTE_KA_STATE_DOZING; + keepcfg->state_flags[rte_lcore_id()].s = RTE_KA_STATE_DOZING; } -- 2.7.4