From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752642AbdKJMST (ORCPT ); Fri, 10 Nov 2017 07:18:19 -0500 Received: from merlin.infradead.org ([205.233.59.134]:50620 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751558AbdKJMSR (ORCPT ); Fri, 10 Nov 2017 07:18:17 -0500 Date: Fri, 10 Nov 2017 13:17:56 +0100 From: Peter Zijlstra To: Dave Hansen Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, hughd@google.com, moritz.lipp@iaik.tugraz.at, daniel.gruss@iaik.tugraz.at, michael.schwarz@iaik.tugraz.at, richard.fellner@student.tugraz.at, luto@kernel.org, torvalds@linux-foundation.org, keescook@google.com, x86@kernel.org Subject: Re: [PATCH 18/30] x86, kaiser: map virtually-addressed performance monitoring buffers Message-ID: <20171110121756.t7mn7bb4gy3rnw2w@hirez.programming.kicks-ass.net> References: <20171108194646.907A1942@viggo.jf.intel.com> <20171108194720.0ADD17E2@viggo.jf.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20171108194720.0ADD17E2@viggo.jf.intel.com> User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Nov 08, 2017 at 11:47:20AM -0800, Dave Hansen wrote: > +static > +DEFINE_PER_CPU_SHARED_ALIGNED_USER_MAPPED(struct debug_store, cpu_debug_store); > + > /* The size of a BTS record in bytes: */ > #define BTS_RECORD_SIZE 24 > > @@ -278,6 +282,39 @@ void fini_debug_store_on_cpu(int cpu) > > static DEFINE_PER_CPU(void *, insn_buffer); > > +static void *dsalloc(size_t size, gfp_t flags, int node) > +{ > +#ifdef CONFIG_KAISER > + unsigned int order = get_order(size); > + struct page *page; > + unsigned long addr; > + > + page = __alloc_pages_node(node, flags | __GFP_ZERO, order); > + if (!page) > + return NULL; > + addr = (unsigned long)page_address(page); > + if (kaiser_add_mapping(addr, size, __PAGE_KERNEL | _PAGE_GLOBAL) < 0) { > + __free_pages(page, order); > + addr = 0; > + } > + return (void *)addr; > +#else > + return kmalloc_node(size, flags | __GFP_ZERO, node); > +#endif > +} > + > +static void dsfree(const void *buffer, size_t size) > +{ > +#ifdef CONFIG_KAISER > + if (!buffer) > + return; > + kaiser_remove_mapping((unsigned long)buffer, size); > + free_pages((unsigned long)buffer, get_order(size)); > +#else > + kfree(buffer); > +#endif > +} You might as well use __alloc_pages_node() / free_pages() unconditionally. Those buffers are at least one page in size. That should also get rid of the #ifdef muck. > static int alloc_ds_buffer(int cpu) > { > - int node = cpu_to_node(cpu); > - struct debug_store *ds; > - > - ds = kzalloc_node(sizeof(*ds), GFP_KERNEL, node); > - if (unlikely(!ds)) > - return -ENOMEM; > + struct debug_store *ds = per_cpu_ptr(&cpu_debug_store, cpu); > > + memset(ds, 0, sizeof(*ds)); Why the memset() ? isn't static per-cpu memory 0 initialized