Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932561AbbKRNnv (ORCPT ); Wed, 18 Nov 2015 08:43:51 -0500 Received: from mail1.bemta12.messagelabs.com ([216.82.251.13]:25639 "EHLO mail1.bemta12.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752315AbbKRNnu (ORCPT ); Wed, 18 Nov 2015 08:43:50 -0500 X-Env-Sender: Marc_Gonzalez@sigmadesigns.com X-Msg-Ref: server-9.tower-219.messagelabs.com!1447854216!10065226!1 X-Originating-IP: [195.215.56.170] X-StarScan-Received: X-StarScan-Version: 7.19.2; banners=-,-,- X-VirusChecked: Checked To: Thomas Gleixner , Daniel Lezcano , Russell King CC: LKML , Mans Rullgard , Viresh Kumar , Nicolas Pitre , Tony Lindgren , Sebastian Frias From: Marc Gonzalez Subject: [PATCH] clocksource: Store reg field within struct clocksource Message-ID: <564C8086.80804@sigmadesigns.com> Date: Wed, 18 Nov 2015 14:43:34 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0 SeaMonkey/2.38 MIME-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-15" Content-Transfer-Encoding: 7bit X-Originating-IP: [172.27.0.114] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4416 Lines: 141 Since 'struct clocksource' is ____cacheline_aligned, gcc must insert a lot of padding between reg and clksrc in 'struct clocksource_mmio' (for example, L1_CACHE_BYTES = 64 on ARMv7). Storing reg within 'struct clocksource' removes unnecessary padding, and reg can then be grouped with other hot data. A nice side-effect of this patch is making container_of() unnecessary, which makes the code a bit simpler. On 32-bit platforms, reg fits in the padding between read and mask, meaning no downside from storing it there. 0 4 8 +----------------+----------------+ | read | pad/reg | +----------------+----------------+ | mask | +----------------+----------------+ | mult | shift | +----------------+----------------+ | max_idle_ns | +----------------+----------------+ On 64-bit platforms, placing reg between read and mask changes the layout, moving max_idle_ns to offset +32 instead of +24. 0 4 8 +----------------+----------------+ | read | +----------------+----------------+ | reg | +----------------+----------------+ | mask | +----------------+----------------+ | mult | shift | +----------------+----------------+ | max_idle_ns | +----------------+----------------+ Signed-off-by: Marc Gonzalez --- drivers/clocksource/mmio.c | 36 +++++++++++++----------------------- include/linux/clocksource.h | 3 +++ 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/drivers/clocksource/mmio.c b/drivers/clocksource/mmio.c index 1593ade2a815..c28fc6ef63ef 100644 --- a/drivers/clocksource/mmio.c +++ b/drivers/clocksource/mmio.c @@ -10,34 +10,24 @@ #include #include -struct clocksource_mmio { - void __iomem *reg; - struct clocksource clksrc; -}; - -static inline struct clocksource_mmio *to_mmio_clksrc(struct clocksource *c) -{ - return container_of(c, struct clocksource_mmio, clksrc); -} - cycle_t clocksource_mmio_readl_up(struct clocksource *c) { - return (cycle_t)readl_relaxed(to_mmio_clksrc(c)->reg); + return (cycle_t)readl_relaxed(c->reg); } cycle_t clocksource_mmio_readl_down(struct clocksource *c) { - return ~(cycle_t)readl_relaxed(to_mmio_clksrc(c)->reg) & c->mask; + return ~(cycle_t)readl_relaxed(c->reg) & c->mask; } cycle_t clocksource_mmio_readw_up(struct clocksource *c) { - return (cycle_t)readw_relaxed(to_mmio_clksrc(c)->reg); + return (cycle_t)readw_relaxed(c->reg); } cycle_t clocksource_mmio_readw_down(struct clocksource *c) { - return ~(cycle_t)readw_relaxed(to_mmio_clksrc(c)->reg) & c->mask; + return ~(cycle_t)readw_relaxed(c->reg) & c->mask; } /** @@ -53,21 +43,21 @@ int __init clocksource_mmio_init(void __iomem *base, const char *name, unsigned long hz, int rating, unsigned bits, cycle_t (*read)(struct clocksource *)) { - struct clocksource_mmio *cs; + struct clocksource *cs; if (bits > 32 || bits < 16) return -EINVAL; - cs = kzalloc(sizeof(struct clocksource_mmio), GFP_KERNEL); + cs = kzalloc(sizeof *cs, GFP_KERNEL); if (!cs) return -ENOMEM; - cs->reg = base; - cs->clksrc.name = name; - cs->clksrc.rating = rating; - cs->clksrc.read = read; - cs->clksrc.mask = CLOCKSOURCE_MASK(bits); - cs->clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS; + cs->read = read; + cs->reg = base; + cs->name = name; + cs->rating = rating; + cs->mask = CLOCKSOURCE_MASK(bits); + cs->flags = CLOCK_SOURCE_IS_CONTINUOUS; - return clocksource_register_hz(&cs->clksrc, hz); + return clocksource_register_hz(cs, hz); } diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 278dd279a7a8..50725fd23ab0 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -69,6 +69,9 @@ struct clocksource { * clocksource itself is cacheline aligned. */ cycle_t (*read)(struct clocksource *cs); +#ifdef CONFIG_CLKSRC_MMIO + void __iomem *reg; +#endif cycle_t mask; u32 mult; u32 shift; -- 2.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/