limit guest messages to once in perf kvm top
cover limit guest messages to once in perf kvm top
Some refactoring so that strlist and intlist have a common base - rblist.
Quoted 1 line
From there use intlist to only show guest messages once.
David Ahern (4):
perf tool: introducing rblist
perf tool: change strlist to use the new rblist perf tool: introduce intlist
perf kvm top: limit guest kernel info message to once
tools/perf/Makefile | 4 ++ tools/perf/builtin-top.c | 13 ++++- tools/perf/util/intlist.c | 101 +++++++++++++++++++++++++++++++++++ tools/perf/util/intlist.h | 75 ++++++++++++++++++++++++++ tools/perf/util/rblist.c | 107 +++++++++++++++++++++++++++++++++++++ tools/perf/util/rblist.h | 47 ++++++++++++++++ tools/perf/util/strlist.c | 130 ++++++++++++++++++--------------------------- tools/perf/util/strlist.h | 11 ++-- 8 files changed, 402 insertions(+), 86 deletions(-) create mode 100644 tools/perf/util/intlist.c create mode 100644 tools/perf/util/intlist.h create mode 100644 tools/perf/util/rblist.c create mode 100644 tools/perf/util/rblist.h
Signature · 1 line
1.7.10.1
PATCH 1/4 perf tool: introducing rblist
rblist is the rbtree based code from strlist. It will be the common code for strlist and the to-be-introduced intlist.
--- tools/perf/Makefile | 2 + tools/perf/util/rblist.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/rblist.h | 47 ++++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 tools/perf/util/rblist.c create mode 100644 tools/perf/util/rblist.h
tools/perf/Makefile +2 -0
@@ -319,6 +319,7 @@ LIB_H += $(ARCH_INCLUDE) LIB_H += util/cgroup.h LIB_H += $(TRACE_EVENT_DIR)event-parse.h LIB_H += util/target.h +LIB_H += util/rblist.h LIB_OBJS += $(OUTPUT)util/abspath.o LIB_OBJS += $(OUTPUT)util/alias.o
@@ -383,6 +384,7 @@ LIB_OBJS += $(OUTPUT)util/xyarray.o LIB_OBJS += $(OUTPUT)util/cpumap.o LIB_OBJS += $(OUTPUT)util/cgroup.o LIB_OBJS += $(OUTPUT)util/target.o +LIB_OBJS += $(OUTPUT)util/rblist.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
tools/perf/util/rblist.c new file +107 -0
107 lines not on this page · raw message
tools/perf/util/rblist.h new file +47 -0
47 lines not on this page · raw message
Signature · 1 line
1.7.10.1
[tip:perf/urgent] perf tools: Introducing rblist
Commit-ID: 37bbd3fff1480a1f5d57abb9e9e56f468954c1b1 Gitweb: http://git.kernel.org/tip/37bbd3fff1480a1f5d57abb9e9e56f468954c1b1 Author: David Ahern <[email protected]> AuthorDate: Mon, 30 Jul 2012 22:31:32 -0600 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 3 Aug 2012 10:37:21 -0300
perf tools: Introducing rblist
rblist is the rbtree based code from strlist. It will be the common code for strlist and the to-be-introduced intlist.
--- tools/perf/Makefile | 2 + tools/perf/util/rblist.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/rblist.h | 47 ++++++++++++++++++++ 3 files changed, 156 insertions(+), 0 deletions(-)
tools/perf/Makefile +2 -0
@@ -319,6 +319,7 @@ LIB_H += $(ARCH_INCLUDE) LIB_H += util/cgroup.h LIB_H += $(TRACE_EVENT_DIR)event-parse.h LIB_H += util/target.h +LIB_H += util/rblist.h LIB_OBJS += $(OUTPUT)util/abspath.o LIB_OBJS += $(OUTPUT)util/alias.o
@@ -383,6 +384,7 @@ LIB_OBJS += $(OUTPUT)util/xyarray.o LIB_OBJS += $(OUTPUT)util/cpumap.o LIB_OBJS += $(OUTPUT)util/cgroup.o LIB_OBJS += $(OUTPUT)util/target.o +LIB_OBJS += $(OUTPUT)util/rblist.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
tools/perf/util/rblist.c new file +107 -0
107 lines not on this page · raw message
tools/perf/util/rblist.h new file +47 -0
47 lines not on this page · raw message
PATCH 2/4 perf tool: change strlist to use the new rblist
In reply to David AhernReplaces the direct use of rbtree code with the rblist API. In the end the patch is a no-op on strlist functionality; the API for strlist is not changed, only its implementaton.
--- tools/perf/util/strlist.c | 130 ++++++++++++++++++--------------------------- tools/perf/util/strlist.h | 11 ++-- 2 files changed, 57 insertions(+), 84 deletions(-)
tools/perf/util/strlist.c +51 -79
@@ -10,23 +10,28 @@#include <stdlib.h> #include <string.h> -static struct str_node *str_node__new (const char *s,bool dupstr) +static +struct rb_node *strlist__node_new (struct rblist *rblist,const void *entry) { -struct str_node *self =malloc (sizeof (*self)); +const char *s = entry; +struct rb_node *rc =NULL ; + struct strlist *strlist = container_of(rblist, struct strlist, rblist); +struct str_node *snode =malloc (sizeof (*snode)); -if (self !=NULL ) { -if (dupstr) { +if (snode !=NULL ) { +if (strlist->dupstr) { s =strdup (s);if (s ==NULL ) goto out_delete; } - self->s = s; + snode->s = s; + rc = &snode->rb_node; } -return self; +return rc; out_delete: -free (self); +free (snode);return NULL ; }
@@ -37,36 +42,26 @@ static void str_node__delete(struct str_node *self, bool dupstr)free (self); } -int strlist__add (struct strlist *self,const char *new_entry) +static +void strlist__node_delete (struct rblist *rblist,struct rb_node *rb_node) { -struct rb_node **p = &self->entries.rb_node; -struct rb_node *parent =NULL ; -struct str_node *sn; - -while (*p !=NULL ) { -int rc; - - parent = *p; - sn = rb_entry(parent, struct str_node, rb_node); - rc =strcmp (sn->s, new_entry); - -if (rc >0 ) - p = &(*p)->rb_left; -else if (rc <0 ) - p = &(*p)->rb_right; -else -return -EEXIST ; - } + struct strlist *slist = container_of(rblist, struct strlist, rblist); + struct str_node *snode = container_of(rb_node, struct str_node, rb_node); - sn =str_node__new (new_entry, self->dupstr); -if (sn ==NULL ) -return -ENOMEM ; +str_node__delete (snode, slist->dupstr); +} -rb_link_node (&sn->rb_node, parent, p); -rb_insert_color (&sn->rb_node, &self->entries); - ++self->nr_entries; +static int strlist__node_cmp (struct rb_node *rb_node,const void *entry) +{ +const char *str = entry; + struct str_node *snode = container_of(rb_node, struct str_node, rb_node); + +return strcmp (snode->s, str); +} -return 0 ; +int strlist__add (struct strlist *self,const char *new_entry) +{ +return rblist__add_node (&self->rblist, new_entry); }int strlist__load (struct strlist *self,const char *filename)
@@ -96,34 +91,20 @@ out:return err; } -void strlist__remove (struct strlist *self,struct str_node *sn) +void strlist__remove (struct strlist *slist,struct str_node *snode) { -rb_erase (&sn->rb_node, &self->entries); -str_node__delete (sn, self->dupstr); +str_node__delete (snode, slist->dupstr); } -struct str_node *strlist__find (struct strlist *self,const char *entry) +struct str_node *strlist__find (struct strlist *slist,const char *entry) { -struct rb_node **p = &self->entries.rb_node; -struct rb_node *parent =NULL ; - -while (*p !=NULL ) { -struct str_node *sn; -int rc; - - parent = *p; - sn = rb_entry(parent, struct str_node, rb_node); - rc =strcmp (sn->s, entry); - -if (rc >0 ) - p = &(*p)->rb_left; -else if (rc <0 ) - p = &(*p)->rb_right; -else -return sn; - } +struct str_node *snode =NULL ; +struct rb_node *rb_node =rblist__find (&slist->rblist, entry); -return NULL ; +if (rb_node) + snode = container_of(rb_node, struct str_node, rb_node); + +return snode; }static int strlist__parse_list_entry (struct strlist *self,const char *s)
@@ -156,9 +137,12 @@ struct strlist *strlist__new(bool dupstr, const char *slist)struct strlist *self =malloc (sizeof (*self));if (self !=NULL ) { - self->entries =RB_ROOT ; +rblist__init (&self->rblist); + self->rblist.node_cmp = strlist__node_cmp; + self->rblist.node_new = strlist__node_new; + self->rblist.node_delete = strlist__node_delete; + self->dupstr = dupstr; - self->nr_entries =0 ;if (slist &&strlist__parse_list (self, slist) !=0 ) goto out_error; }
@@ -171,30 +155,18 @@ out_error:void strlist__delete (struct strlist *self) { -if (self !=NULL ) { -struct str_node *pos; -struct rb_node *next =rb_first (&self->entries); - -while (next) { - pos = rb_entry(next, struct str_node, rb_node); - next =rb_next (&pos->rb_node); -strlist__remove (self, pos); - } - self->entries =RB_ROOT ; -free (self); - } +if (self !=NULL ) +rblist__delete (&self->rblist); } -struct str_node *strlist__entry (const struct strlist *self,unsigned int idx) +struct str_node *strlist__entry (const struct strlist *slist,unsigned int idx) { -struct rb_node *nd; +struct str_node *snode =NULL ; +struct rb_node *rb_node; -for (nd =rb_first (&self->entries); nd; nd =rb_next (nd)) { - struct str_node *pos = rb_entry(nd, struct str_node, rb_node); + rb_node =rblist__entry (&slist->rblist, idx); +if (rb_node) + snode = container_of(rb_node, struct str_node, rb_node); -if (!idx--) -return pos; - } - -return NULL ; +return snode; }
tools/perf/util/strlist.h +6 -5
@@ -4,14 +4,15 @@#include <linux/rbtree.h> #include <stdbool.h> +#include "rblist.h" +struct str_node {struct rb_node rb_node;const char *s; };struct strlist { -struct rb_root entries; -unsigned int nr_entries; +struct rblist rblist;bool dupstr; };
@@ -32,18 +33,18 @@ static inline bool strlist__has_entry(struct strlist *self, const char *entry)static inline bool strlist__empty (const struct strlist *self) { -return self->nr_entries ==0 ; +return rblist__empty (&self->rblist); }static inline unsigned int strlist__nr_entries (const struct strlist *self) { -return self->nr_entries; +return rblist__nr_entries (&self->rblist); }/* For strlist iteration */ static inline struct str_node *strlist__first (struct strlist *self) { -struct rb_node *rn =rb_first (&self->entries); +struct rb_node *rn =rb_first (&self->rblist.entries); return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; }static inline struct str_node *strlist__next (struct str_node *sn)
Signature · 1 line
1.7.10.1
[tip:perf/urgent] perf tools: Change strlist to use the new rblist
Commit-ID: ee8dd3ca43f151d9fbe1edeef68fb8a77eb9f047 Gitweb: http://git.kernel.org/tip/ee8dd3ca43f151d9fbe1edeef68fb8a77eb9f047 Author: David Ahern <[email protected]> AuthorDate: Mon, 30 Jul 2012 22:31:33 -0600 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 3 Aug 2012 10:39:51 -0300
perf tools: Change strlist to use the new rblist
Replaces the direct use of rbtree code with the rblist API. In the end the patch is a no-op on strlist functionality; the API for strlist is not changed, only its implementaton.
--- tools/perf/util/strlist.c | 130 ++++++++++++++++++--------------------------- tools/perf/util/strlist.h | 11 ++-- 2 files changed, 57 insertions(+), 84 deletions(-)
tools/perf/util/strlist.c +51 -79
@@ -10,23 +10,28 @@#include <stdlib.h> #include <string.h> -static struct str_node *str_node__new (const char *s,bool dupstr) +static +struct rb_node *strlist__node_new (struct rblist *rblist,const void *entry) { -struct str_node *self =malloc (sizeof (*self)); +const char *s = entry; +struct rb_node *rc =NULL ; + struct strlist *strlist = container_of(rblist, struct strlist, rblist); +struct str_node *snode =malloc (sizeof (*snode)); -if (self !=NULL ) { -if (dupstr) { +if (snode !=NULL ) { +if (strlist->dupstr) { s =strdup (s);if (s ==NULL ) goto out_delete; } - self->s = s; + snode->s = s; + rc = &snode->rb_node; } -return self; +return rc; out_delete: -free (self); +free (snode);return NULL ; }
@@ -37,36 +42,26 @@ static void str_node__delete(struct str_node *self, bool dupstr)free (self); } -int strlist__add (struct strlist *self,const char *new_entry) +static +void strlist__node_delete (struct rblist *rblist,struct rb_node *rb_node) { -struct rb_node **p = &self->entries.rb_node; -struct rb_node *parent =NULL ; -struct str_node *sn; - -while (*p !=NULL ) { -int rc; - - parent = *p; - sn = rb_entry(parent, struct str_node, rb_node); - rc =strcmp (sn->s, new_entry); - -if (rc >0 ) - p = &(*p)->rb_left; -else if (rc <0 ) - p = &(*p)->rb_right; -else -return -EEXIST ; - } + struct strlist *slist = container_of(rblist, struct strlist, rblist); + struct str_node *snode = container_of(rb_node, struct str_node, rb_node); - sn =str_node__new (new_entry, self->dupstr); -if (sn ==NULL ) -return -ENOMEM ; +str_node__delete (snode, slist->dupstr); +} -rb_link_node (&sn->rb_node, parent, p); -rb_insert_color (&sn->rb_node, &self->entries); - ++self->nr_entries; +static int strlist__node_cmp (struct rb_node *rb_node,const void *entry) +{ +const char *str = entry; + struct str_node *snode = container_of(rb_node, struct str_node, rb_node); + +return strcmp (snode->s, str); +} -return 0 ; +int strlist__add (struct strlist *self,const char *new_entry) +{ +return rblist__add_node (&self->rblist, new_entry); }int strlist__load (struct strlist *self,const char *filename)
@@ -96,34 +91,20 @@ out:return err; } -void strlist__remove (struct strlist *self,struct str_node *sn) +void strlist__remove (struct strlist *slist,struct str_node *snode) { -rb_erase (&sn->rb_node, &self->entries); -str_node__delete (sn, self->dupstr); +str_node__delete (snode, slist->dupstr); } -struct str_node *strlist__find (struct strlist *self,const char *entry) +struct str_node *strlist__find (struct strlist *slist,const char *entry) { -struct rb_node **p = &self->entries.rb_node; -struct rb_node *parent =NULL ; - -while (*p !=NULL ) { -struct str_node *sn; -int rc; - - parent = *p; - sn = rb_entry(parent, struct str_node, rb_node); - rc =strcmp (sn->s, entry); - -if (rc >0 ) - p = &(*p)->rb_left; -else if (rc <0 ) - p = &(*p)->rb_right; -else -return sn; - } +struct str_node *snode =NULL ; +struct rb_node *rb_node =rblist__find (&slist->rblist, entry); -return NULL ; +if (rb_node) + snode = container_of(rb_node, struct str_node, rb_node); + +return snode; }static int strlist__parse_list_entry (struct strlist *self,const char *s)
@@ -156,9 +137,12 @@ struct strlist *strlist__new(bool dupstr, const char *slist)struct strlist *self =malloc (sizeof (*self));if (self !=NULL ) { - self->entries =RB_ROOT ; +rblist__init (&self->rblist); + self->rblist.node_cmp = strlist__node_cmp; + self->rblist.node_new = strlist__node_new; + self->rblist.node_delete = strlist__node_delete; + self->dupstr = dupstr; - self->nr_entries =0 ;if (slist &&strlist__parse_list (self, slist) !=0 ) goto out_error; }
@@ -171,30 +155,18 @@ out_error:void strlist__delete (struct strlist *self) { -if (self !=NULL ) { -struct str_node *pos; -struct rb_node *next =rb_first (&self->entries); - -while (next) { - pos = rb_entry(next, struct str_node, rb_node); - next =rb_next (&pos->rb_node); -strlist__remove (self, pos); - } - self->entries =RB_ROOT ; -free (self); - } +if (self !=NULL ) +rblist__delete (&self->rblist); } -struct str_node *strlist__entry (const struct strlist *self,unsigned int idx) +struct str_node *strlist__entry (const struct strlist *slist,unsigned int idx) { -struct rb_node *nd; +struct str_node *snode =NULL ; +struct rb_node *rb_node; -for (nd =rb_first (&self->entries); nd; nd =rb_next (nd)) { - struct str_node *pos = rb_entry(nd, struct str_node, rb_node); + rb_node =rblist__entry (&slist->rblist, idx); +if (rb_node) + snode = container_of(rb_node, struct str_node, rb_node); -if (!idx--) -return pos; - } - -return NULL ; +return snode; }
tools/perf/util/strlist.h +6 -5
@@ -4,14 +4,15 @@#include <linux/rbtree.h> #include <stdbool.h> +#include "rblist.h" +struct str_node {struct rb_node rb_node;const char *s; };struct strlist { -struct rb_root entries; -unsigned int nr_entries; +struct rblist rblist;bool dupstr; };
@@ -32,18 +33,18 @@ static inline bool strlist__has_entry(struct strlist *self, const char *entry)static inline bool strlist__empty (const struct strlist *self) { -return self->nr_entries ==0 ; +return rblist__empty (&self->rblist); }static inline unsigned int strlist__nr_entries (const struct strlist *self) { -return self->nr_entries; +return rblist__nr_entries (&self->rblist); }/* For strlist iteration */ static inline struct str_node *strlist__first (struct strlist *self) { -struct rb_node *rn =rb_first (&self->entries); +struct rb_node *rn =rb_first (&self->rblist.entries); return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; }static inline struct str_node *strlist__next (struct str_node *sn)
PATCH 3/4 perf tool: introduce intlist
In reply to David AhernBuilt on rblist - like strlist. Used in the next patch.
--- tools/perf/Makefile | 2 + tools/perf/util/intlist.c | 101 +++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/intlist.h | 75 +++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 tools/perf/util/intlist.c create mode 100644 tools/perf/util/intlist.h
tools/perf/Makefile +2 -0
@@ -320,6 +320,7 @@ LIB_H += util/cgroup.h LIB_H += $(TRACE_EVENT_DIR)event-parse.h LIB_H += util/target.h LIB_H += util/rblist.h +LIB_H += util/intlist.h LIB_OBJS += $(OUTPUT)util/abspath.o LIB_OBJS += $(OUTPUT)util/alias.o
@@ -385,6 +386,7 @@ LIB_OBJS += $(OUTPUT)util/cpumap.o LIB_OBJS += $(OUTPUT)util/cgroup.o LIB_OBJS += $(OUTPUT)util/target.o LIB_OBJS += $(OUTPUT)util/rblist.o +LIB_OBJS += $(OUTPUT)util/intlist.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
tools/perf/util/intlist.c new file +101 -0
101 lines not on this page · raw message
tools/perf/util/intlist.h new file +75 -0
75 lines not on this page · raw message
Signature · 1 line
1.7.10.1
[tip:perf/urgent] perf tools: Introduce intlist
Commit-ID: 70b40c4a43ddfcf7a06dad4be32ff1dd2b62be09 Gitweb: http://git.kernel.org/tip/70b40c4a43ddfcf7a06dad4be32ff1dd2b62be09 Author: David Ahern <[email protected]> AuthorDate: Mon, 30 Jul 2012 22:31:34 -0600 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 3 Aug 2012 10:42:25 -0300
perf tools: Introduce intlist
Built on rblist - like strlist. Used in the next patch.
--- tools/perf/Makefile | 2 + tools/perf/util/intlist.c | 101 +++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/intlist.h | 75 +++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+), 0 deletions(-)
tools/perf/Makefile +2 -0
@@ -320,6 +320,7 @@ LIB_H += util/cgroup.h LIB_H += $(TRACE_EVENT_DIR)event-parse.h LIB_H += util/target.h LIB_H += util/rblist.h +LIB_H += util/intlist.h LIB_OBJS += $(OUTPUT)util/abspath.o LIB_OBJS += $(OUTPUT)util/alias.o
@@ -385,6 +386,7 @@ LIB_OBJS += $(OUTPUT)util/cpumap.o LIB_OBJS += $(OUTPUT)util/cgroup.o LIB_OBJS += $(OUTPUT)util/target.o LIB_OBJS += $(OUTPUT)util/rblist.o +LIB_OBJS += $(OUTPUT)util/intlist.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
tools/perf/util/intlist.c new file +101 -0
101 lines not on this page · raw message
tools/perf/util/intlist.h new file +75 -0
75 lines not on this page · raw message
PATCH 4/4 perf kvm top: limit guest kernel info message to once
In reply to David Ahern'perf kvm top' shows a continual flurry of:
Can't find guest [5201]'s kernel information
if it can't find the guest info and with a lot of VMs running a user has no chance of reading them all. Limit message to once per guest.
--- tools/perf/builtin-top.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
tools/perf/builtin-top.c +11 -2
@@ -38,6 +38,7 @@#include "util/cpumap.h" #include "util/xyarray.h" #include "util/sort.h" +#include "util/intlist.h" #include "util/debug.h"
@@ -706,8 +707,16 @@ static void perf_event__process_sample(struct perf_tool *tool,int err;if (!machine && perf_guest) { -pr_err ("Can't find guest [%d]'s kernel information\n" , - event->ip.pid); +static struct intlist *seen; + +if (!seen) + seen =intlist__new (); + +if (!intlist__has_entry (seen, event->ip.pid)) { +pr_err ("Can't find guest [%d]'s kernel information\n" , + event->ip.pid); +intlist__add (seen, event->ip.pid); + }return ; }
Signature · 1 line
1.7.10.1
[tip:perf/urgent] perf kvm top: Limit guest kernel info message to once
Commit-ID: 6b118e92cc78ccef7b54a296158d4738fd377bcc Gitweb: http://git.kernel.org/tip/6b118e92cc78ccef7b54a296158d4738fd377bcc Author: David Ahern <[email protected]> AuthorDate: Mon, 30 Jul 2012 22:31:35 -0600 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 3 Aug 2012 10:43:47 -0300
perf kvm top: Limit guest kernel info message to once
'perf kvm top' shows a continual flurry of:
Can't find guest [5201]'s kernel information
if it can't find the guest info and with a lot of VMs running a user has no chance of reading them all. Limit message to once per guest.
--- tools/perf/builtin-top.c | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-)
tools/perf/builtin-top.c +11 -2
@@ -38,6 +38,7 @@#include "util/cpumap.h" #include "util/xyarray.h" #include "util/sort.h" +#include "util/intlist.h" #include "util/debug.h"
@@ -706,8 +707,16 @@ static void perf_event__process_sample(struct perf_tool *tool,int err;if (!machine && perf_guest) { -pr_err ("Can't find guest [%d]'s kernel information\n" , - event->ip.pid); +static struct intlist *seen; + +if (!seen) + seen =intlist__new (); + +if (!intlist__has_entry (seen, event->ip.pid)) { +pr_err ("Can't find guest [%d]'s kernel information\n" , + event->ip.pid); +intlist__add (seen, event->ip.pid); + }return ; }