From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932167AbcIBOD0 (ORCPT ); Fri, 2 Sep 2016 10:03:26 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34546 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753631AbcIBODU (ORCPT ); Fri, 2 Sep 2016 10:03:20 -0400 From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Paolo Bonzini , Peter Zijlstra , Wanpeng Li , Eric Dumazet , Ingo Molnar , Mike Galbraith , Rik van Riel Subject: [PATCH 3/5] u64_stats: Introduce IRQs disabled helpers Date: Fri, 2 Sep 2016 16:03:03 +0200 Message-Id: <1472824985-22947-4-git-send-email-fweisbec@gmail.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1472824985-22947-1-git-send-email-fweisbec@gmail.com> References: <1472824985-22947-1-git-send-email-fweisbec@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Introduce light versions of u64_stats helpers for context where either preempt or IRQs are disabled. This way we can make this library usable by scheduler irqtime accounting which currenty implement its ad-hoc version. Cc: Rik van Riel Cc: Paolo Bonzini Cc: Wanpeng Li Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Eric Dumazet Signed-off-by: Frederic Weisbecker --- include/linux/u64_stats_sync.h | 55 ++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h index d3a2bb7..9101d23 100644 --- a/include/linux/u64_stats_sync.h +++ b/include/linux/u64_stats_sync.h @@ -103,28 +103,41 @@ static inline void u64_stats_update_end_raw(struct u64_stats_sync *syncp) #endif } +static inline unsigned int __u64_stats_fetch_begin(const struct u64_stats_sync *syncp) +{ +#if BITS_PER_LONG==32 && defined(CONFIG_SMP) + return read_seqcount_begin(&syncp->seq); +#else + return 0; +#endif +} + static inline unsigned int u64_stats_fetch_begin(const struct u64_stats_sync *syncp) { -#if BITS_PER_LONG==32 && defined(CONFIG_SMP) - return read_seqcount_begin(&syncp->seq); -#else -#if BITS_PER_LONG==32 +#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) preempt_disable(); +#else + return __u64_stats_fetch_begin(syncp); #endif - return 0; +} + +static inline bool __u64_stats_fetch_retry(const struct u64_stats_sync *syncp, + unsigned int start) +{ +#if BITS_PER_LONG==32 && defined(CONFIG_SMP) + return read_seqcount_retry(&syncp->seq, start); +#else + return false; #endif } static inline bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp, unsigned int start) { -#if BITS_PER_LONG==32 && defined(CONFIG_SMP) - return read_seqcount_retry(&syncp->seq, start); -#else -#if BITS_PER_LONG==32 +#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) preempt_enable(); -#endif - return false; +#else + return __u64_stats_fetch_retry(syncp, start); #endif } @@ -136,26 +149,20 @@ static inline bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp, */ static inline unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *syncp) { -#if BITS_PER_LONG==32 && defined(CONFIG_SMP) - return read_seqcount_begin(&syncp->seq); -#else -#if BITS_PER_LONG==32 +#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) local_irq_disable(); -#endif - return 0; +#else + return __u64_stats_fetch_begin(syncp); #endif } static inline bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *syncp, - unsigned int start) + unsigned int start) { -#if BITS_PER_LONG==32 && defined(CONFIG_SMP) - return read_seqcount_retry(&syncp->seq, start); -#else -#if BITS_PER_LONG==32 +#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) local_irq_enable(); -#endif - return false; +#else + return __u64_stats_fetch_retry(syncp, start); #endif } -- 2.7.0