Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753148AbbGWJ4e (ORCPT ); Thu, 23 Jul 2015 05:56:34 -0400 Received: from mga09.intel.com ([134.134.136.24]:53359 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752490AbbGWJ41 (ORCPT ); Thu, 23 Jul 2015 05:56:27 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,529,1432623600"; d="scan'208";a="611397545" Message-ID: <55B0B9BB.50800@intel.com> Date: Thu, 23 Jul 2015 17:54:03 +0800 From: Pan Xinhui User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: "linux-kernel@vger.kernel.org" CC: Thomas Gleixner , Borislav Petkov , mingo@redhat.com, hpa@zytor.com, x86@kernel.org, bp@suse.de, toshi.kani@hp.com, jgross@suse.com, mcgrof@suse.com, "mnipxh@163.com" , "yanmin_zhang@linux.intel.com" Subject: [PATCH] x86/mm/pat: Do a small optimization when dump PAT memtype list Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2718 Lines: 96 From: Pan Xinhui There are many nodes in the PAT memtype rb-tree. When we dump this tree we call kzalloc every time to copy nodes. Actually these kzalloc are not necessary. Lets do a optimization now. Create an *entry* in memtype_seq_start(), and free it in memtype_seq_stop(). These two callback functions are alwasys called in pair. Also because memtype_seq_show() is usually used only for outputing. Seems memtype_seq_show is not the best place to free the *entry* And reuse the *entry* in memtype_seq_next() to enhance the performance. Signed-off-by: Pan Xinhui --- arch/x86/mm/pat.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 268b2c8..6302119 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c @@ -1001,45 +1001,42 @@ EXPORT_SYMBOL_GPL(pgprot_writethrough); #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_PAT) -static struct memtype *memtype_get_idx(loff_t pos) +static struct memtype *memtype_get_idx(struct memtype *entry, loff_t pos) { - struct memtype *print_entry; int ret; - print_entry = kzalloc(sizeof(struct memtype), GFP_KERNEL); - if (!print_entry) - return NULL; - spin_lock(&memtype_lock); - ret = rbt_memtype_copy_nth_element(print_entry, pos); + ret = rbt_memtype_copy_nth_element(entry, pos); spin_unlock(&memtype_lock); - if (!ret) { - return print_entry; - } else { - kfree(print_entry); - return NULL; - } + return ret ? NULL : entry; } static void *memtype_seq_start(struct seq_file *seq, loff_t *pos) { + struct memtype *entry; + if (*pos == 0) { ++*pos; seq_puts(seq, "PAT memtype list:\n"); } - return memtype_get_idx(*pos); + entry = kzalloc(sizeof(*entry), GFP_KERNEL); + seq->private = entry; + if (!entry) + return NULL; + return memtype_get_idx(entry, *pos); } static void *memtype_seq_next(struct seq_file *seq, void *v, loff_t *pos) { ++*pos; - return memtype_get_idx(*pos); + return memtype_get_idx((struct memtype *)v, *pos); } static void memtype_seq_stop(struct seq_file *seq, void *v) { + kfree(seq->private); } static int memtype_seq_show(struct seq_file *seq, void *v) @@ -1048,7 +1045,6 @@ static int memtype_seq_show(struct seq_file *seq, void *v) seq_printf(seq, "%s @ 0x%Lx-0x%Lx\n", cattr_name(print_entry->type), print_entry->start, print_entry->end); - kfree(print_entry); return 0; } -- 1.9.1 -- 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/