From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965382AbcCOJxs (ORCPT ); Tue, 15 Mar 2016 05:53:48 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34992 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755207AbcCOJxl (ORCPT ); Tue, 15 Mar 2016 05:53:41 -0400 Date: Tue, 15 Mar 2016 10:53:37 +0100 From: Ingo Molnar To: Linus Torvalds Cc: Linux Kernel Mailing List , =?iso-8859-1?Q?Fr=E9d=E9ric?= Weisbecker , Thomas Gleixner , Peter Zijlstra , Andrew Morton Subject: [PATCH] nohz: Change tick_dep_mask from 'unsigned long' to 'unsigned int' Message-ID: <20160315095337.GC7943@gmail.com> References: <20160314123200.GA15971@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Linus noticed that the new tick_dep_mask types introduced in: d027d45d8a17 ("nohz: New tick dependency mask") ... are sloppily defined as 'unsigned long' - which is wasteful to carry just 4 bits and which may also create suboptimal data types on 64-bit systems with word alignment padding holes in them. Fix this by changing the type to the more natural 'unsigned int'. (The xchg_or() API will work fine with 'unsigned int' as well.) Reported-by: Linus Torvalds Cc: Chris Metcalf Cc: Frederic Weisbecker Cc: Christoph Lameter Cc: Chris Metcalf Cc: Ingo Molnar Cc: Luiz Capitulino Cc: Peter Zijlstra Cc: Rik van Riel Cc: Thomas Gleixner Cc: Viresh Kumar Signed-off-by: Ingo Molnar --- include/linux/sched.h | 4 ++-- kernel/time/tick-sched.c | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index c617ea12c6b7..6d1842bb7abd 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -718,7 +718,7 @@ struct signal_struct { struct task_cputime cputime_expires; #ifdef CONFIG_NO_HZ_FULL - unsigned long tick_dep_mask; + unsigned int tick_dep_mask; #endif struct list_head cpu_timers[3]; @@ -1548,7 +1548,7 @@ struct task_struct { #endif #ifdef CONFIG_NO_HZ_FULL - unsigned long tick_dep_mask; + unsigned int tick_dep_mask; #endif unsigned long nvcsw, nivcsw; /* context switch counts */ u64 start_time; /* monotonic time in nsec */ diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 851631899352..fe0f57f3432f 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -157,9 +157,9 @@ static void tick_sched_handle(struct tick_sched *ts, struct pt_regs *regs) cpumask_var_t tick_nohz_full_mask; cpumask_var_t housekeeping_mask; bool tick_nohz_full_running; -static unsigned long tick_dep_mask; +static unsigned int tick_dep_mask; -static void trace_tick_dependency(unsigned long dep) +static void trace_tick_dependency(unsigned int dep) { if (dep & TICK_DEP_MASK_POSIX_TIMER) { trace_tick_stop(0, TICK_DEP_MASK_POSIX_TIMER); @@ -259,10 +259,9 @@ static void tick_nohz_full_kick_all(void) preempt_enable(); } -static void tick_nohz_dep_set_all(unsigned long *dep, - enum tick_dep_bits bit) +static void tick_nohz_dep_set_all(unsigned int *dep, enum tick_dep_bits bit) { - unsigned long prev; + unsigned int prev; prev = xchg_or(dep, BIT_MASK(bit)); if (!prev) @@ -289,7 +288,7 @@ void tick_nohz_dep_clear(enum tick_dep_bits bit) */ void tick_nohz_dep_set_cpu(int cpu, enum tick_dep_bits bit) { - unsigned long prev; + unsigned int prev; struct tick_sched *ts; ts = per_cpu_ptr(&tick_cpu_sched, cpu);