From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752686AbcAFSt7 (ORCPT ); Wed, 6 Jan 2016 13:49:59 -0500 Received: from terminus.zytor.com ([198.137.202.10]:54671 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751863AbcAFSty (ORCPT ); Wed, 6 Jan 2016 13:49:54 -0500 Date: Wed, 6 Jan 2016 10:49:15 -0800 From: tip-bot for Jiri Olsa Message-ID: Cc: peterz@infradead.org, dave@sr71.net, efault@gmx.de, torvalds@linux-foundation.org, mingo@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org, jolsa@kernel.org, tglx@linutronix.de Reply-To: hpa@zytor.com, mingo@kernel.org, tglx@linutronix.de, jolsa@kernel.org, linux-kernel@vger.kernel.org, peterz@infradead.org, dave@sr71.net, efault@gmx.de, torvalds@linux-foundation.org In-Reply-To: <1450707930-3445-1-git-send-email-jolsa@kernel.org> References: <1450707930-3445-1-git-send-email-jolsa@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:sched/core] x86/fpu: Properly align size in CHECK_MEMBER_AT_END_OF() macro Git-Commit-ID: 25ec02f2c14466a4549c5dcc044b628c2cc46fde X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 25ec02f2c14466a4549c5dcc044b628c2cc46fde Gitweb: http://git.kernel.org/tip/25ec02f2c14466a4549c5dcc044b628c2cc46fde Author: Jiri Olsa AuthorDate: Mon, 21 Dec 2015 15:25:30 +0100 Committer: Ingo Molnar CommitDate: Wed, 6 Jan 2016 11:06:06 +0100 x86/fpu: Properly align size in CHECK_MEMBER_AT_END_OF() macro The CHECK_MEMBER_AT_END_OF(TYPE, MEMBER) checks whether MEMBER is last member of TYPE by evaluating: offsetof(TYPE::MEMBER) + sizeof(TYPE::MEMBER) == sizeof(TYPE) and ensuring TYPE::MEMBER is the last member of the TYPE. This condition breaks on structs that are padded to be aligned. This patch ensures the TYPE alignment is taken into account. This bug was revealed after adding cacheline alignment into struct sched_entity, which broke task_struct::thread check: CHECK_MEMBER_AT_END_OF(struct task_struct, thread); Signed-off-by: Jiri Olsa Signed-off-by: Peter Zijlstra (Intel) Cc: Dave Hansen Cc: Linus Torvalds Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Thomas Gleixner Link: http://lkml.kernel.org/r/1450707930-3445-1-git-send-email-jolsa@kernel.org Signed-off-by: Ingo Molnar --- arch/x86/kernel/fpu/init.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c index be39b5f..8e839e7 100644 --- a/arch/x86/kernel/fpu/init.c +++ b/arch/x86/kernel/fpu/init.c @@ -143,9 +143,18 @@ static void __init fpu__init_system_generic(void) unsigned int xstate_size; EXPORT_SYMBOL_GPL(xstate_size); -/* Enforce that 'MEMBER' is the last field of 'TYPE': */ +/* Get alignment of the TYPE. */ +#define TYPE_ALIGN(TYPE) offsetof(struct { char x; TYPE test; }, test) + +/* + * Enforce that 'MEMBER' is the last field of 'TYPE'. + * + * Align the computed size with alignment of the TYPE, + * because that's how C aligns structs. + */ #define CHECK_MEMBER_AT_END_OF(TYPE, MEMBER) \ - BUILD_BUG_ON(sizeof(TYPE) != offsetofend(TYPE, MEMBER)) + BUILD_BUG_ON(sizeof(TYPE) != ALIGN(offsetofend(TYPE, MEMBER), \ + TYPE_ALIGN(TYPE))) /* * We append the 'struct fpu' to the task_struct: