From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751418AbdKUI3j (ORCPT ); Tue, 21 Nov 2017 03:29:39 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:33408 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751100AbdKUI3i (ORCPT ); Tue, 21 Nov 2017 03:29:38 -0500 Date: Tue, 21 Nov 2017 09:29:28 +0100 (CET) From: Thomas Gleixner To: Andy Lutomirski cc: X86 ML , Borislav Petkov , "linux-kernel@vger.kernel.org" , Brian Gerst , Dave Hansen , Linus Torvalds , Josh Poimboeuf Subject: Re: [PATCH 04/16] x86/fixmap: Generalize the GDT fixmap mechanism In-Reply-To: Message-ID: References: <81302a25ec65f28660cba8d1d9d75b42c4c58939.1511195781.git.luto@kernel.org> User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 20 Nov 2017, Andy Lutomirski wrote: > On Mon, Nov 20, 2017 at 2:01 PM, Thomas Gleixner wrote: > > On Mon, 20 Nov 2017, Andy Lutomirski wrote: > >> + * to avoid circular header dependencies. > > > > :( > > Hmm. I could probably fix this, but it involves (at least) moving a > struct definition and adding several new includes, and I'm not sure > it'll actually converge to something working. Yeah, it's include hell. Looked at it and it's major churn. > >> + */ > >> +struct cpu_entry_area > >> +{ > >> + char gdt[PAGE_SIZE]; > >> +}; > >> + > >> +#define CPU_ENTRY_AREA_PAGES (sizeof(struct cpu_entry_area) / PAGE_SIZE) > > > >> +static inline unsigned int __get_cpu_entry_area_page_index(int cpu, int page) > >> +{ > >> + BUILD_BUG_ON(sizeof(struct cpu_entry_area) % PAGE_SIZE != 0); > >> + > >> + return FIX_CPU_ENTRY_AREA_BOTTOM - cpu*CPU_ENTRY_AREA_PAGES - page; > >> +} > >> + > >> +#define __get_cpu_entry_area_offset_index(cpu, offset) ({ \ > >> + BUILD_BUG_ON(offset % PAGE_SIZE != 0); \ > >> + __get_cpu_entry_area_page_index(cpu, offset / PAGE_SIZE); \ > >> + }) > >> + > >> +#define get_cpu_entry_area_index(cpu, field) \ > >> + __get_cpu_entry_area_offset_index((cpu), offsetof(struct cpu_entry_area, field)) > > > > Any reason why those need to be macros? > > The former is a macro because I doubt that BUILD_BUG_ON is valid in > that context in a function. Fair enough. > The latter is a macro because 'field' is a name, not a value. Bah. right. Thanks, tglx