x86/mm/pat: Do a small optimization when dump PAT memtype list
PATCH 1/1 x86/mm/pat: Do a small optimization when dump PAT memtype list
From: Pan Xinhui <[email protected]>
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.
Let seq_file core create an *entry* when open and free it when release. *entry* is stored as seq->private, so we can use it in seq_operations callback who traverse/output the PAT memtype rb-tree only. Lots of unnecessary kzalloc could be avoided now.
Signed-off-by Pan Xinhui <[email protected]>
---
v1 -> v2:
Use seq_open/release_private. let seq_file core handle memory alloc/free. seq_operations callbacks now only traverse/output the PAT rb-tree.
--- arch/x86/mm/pat.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-)
arch/x86/mm/pat.c +10 -18
@@ -1001,41 +1001,33 @@ 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 = seq->private; +if (*pos ==0 ) { ++*pos;seq_puts (seq,"PAT memtype list:\n" ); } -return memtype_get_idx (*pos); +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)
@@ -1048,7 +1040,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 ; }
@@ -1062,14 +1053,15 @@ static const struct seq_operations memtype_seq_ops = {static int memtype_seq_open (struct inode *inode,struct file *file) { -return seq_open (file, &memtype_seq_ops); +return seq_open_private (file, &memtype_seq_ops, +sizeof (struct memtype )); }static const struct file_operations memtype_fops = { .open = memtype_seq_open, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = seq_release_private, };static int __init pat_memtype_list_init (void )
Signature · 1 line
1.9.1