Lines Matching refs:node
146 static struct gcov_info *get_node_info(struct gcov_node *node) in get_node_info() argument
148 if (node->num_loaded > 0) in get_node_info()
149 return node->loaded_info[0]; in get_node_info()
151 return node->unloaded_info; in get_node_info()
158 static struct gcov_info *get_accumulated_info(struct gcov_node *node) in get_accumulated_info() argument
163 if (node->unloaded_info) in get_accumulated_info()
164 info = gcov_info_dup(node->unloaded_info); in get_accumulated_info()
166 info = gcov_info_dup(node->loaded_info[i++]); in get_accumulated_info()
169 for (; i < node->num_loaded; i++) in get_accumulated_info()
170 gcov_info_add(info, node->loaded_info[i]); in get_accumulated_info()
181 struct gcov_node *node = inode->i_private; in gcov_seq_open() local
193 info = get_accumulated_info(node); in gcov_seq_open()
241 struct gcov_node *node; in get_node_by_name() local
244 list_for_each_entry(node, &all_head, all) { in get_node_by_name()
245 info = get_node_info(node); in get_node_by_name()
247 return node; in get_node_by_name()
256 static void reset_node(struct gcov_node *node) in reset_node() argument
260 if (node->unloaded_info) in reset_node()
261 gcov_info_reset(node->unloaded_info); in reset_node()
262 for (i = 0; i < node->num_loaded; i++) in reset_node()
263 gcov_info_reset(node->loaded_info[i]); in reset_node()
266 static void remove_node(struct gcov_node *node);
278 struct gcov_node *node; in gcov_seq_write() local
283 node = get_node_by_name(gcov_info_filename(info)); in gcov_seq_write()
284 if (node) { in gcov_seq_write()
286 if (node->num_loaded == 0) in gcov_seq_write()
287 remove_node(node); in gcov_seq_write()
289 reset_node(node); in gcov_seq_write()
367 static void add_links(struct gcov_node *node, struct dentry *parent) in add_links() argument
376 node->links = kcalloc(num, sizeof(struct dentry *), GFP_KERNEL); in add_links()
377 if (!node->links) in add_links()
381 gcov_info_filename(get_node_info(node)), in add_links()
388 node->links[i] = debugfs_create_symlink(deskew(basename), in add_links()
390 if (!node->links[i]) in add_links()
399 debugfs_remove(node->links[i]); in add_links()
400 kfree(node->links); in add_links()
401 node->links = NULL; in add_links()
413 static void init_node(struct gcov_node *node, struct gcov_info *info, in init_node() argument
416 INIT_LIST_HEAD(&node->list); in init_node()
417 INIT_LIST_HEAD(&node->children); in init_node()
418 INIT_LIST_HEAD(&node->all); in init_node()
419 if (node->loaded_info) { in init_node()
420 node->loaded_info[0] = info; in init_node()
421 node->num_loaded = 1; in init_node()
423 node->parent = parent; in init_node()
425 strcpy(node->name, name); in init_node()
435 struct gcov_node *node; in new_node() local
437 node = kzalloc(sizeof(struct gcov_node) + strlen(name) + 1, GFP_KERNEL); in new_node()
438 if (!node) in new_node()
441 node->loaded_info = kcalloc(1, sizeof(struct gcov_info *), in new_node()
443 if (!node->loaded_info) in new_node()
446 init_node(node, info, name, parent); in new_node()
449 node->dentry = debugfs_create_file(deskew(node->name), 0600, in new_node()
450 parent->dentry, node, &gcov_data_fops); in new_node()
452 node->dentry = debugfs_create_dir(node->name, parent->dentry); in new_node()
453 if (!node->dentry) { in new_node()
455 kfree(node); in new_node()
459 add_links(node, parent->dentry); in new_node()
460 list_add(&node->list, &parent->children); in new_node()
461 list_add(&node->all, &all_head); in new_node()
463 return node; in new_node()
466 kfree(node); in new_node()
472 static void remove_links(struct gcov_node *node) in remove_links() argument
476 if (!node->links) in remove_links()
479 debugfs_remove(node->links[i]); in remove_links()
480 kfree(node->links); in remove_links()
481 node->links = NULL; in remove_links()
488 static void release_node(struct gcov_node *node) in release_node() argument
490 list_del(&node->list); in release_node()
491 list_del(&node->all); in release_node()
492 debugfs_remove(node->dentry); in release_node()
493 remove_links(node); in release_node()
494 kfree(node->loaded_info); in release_node()
495 if (node->unloaded_info) in release_node()
496 gcov_info_free(node->unloaded_info); in release_node()
497 kfree(node); in release_node()
501 static void remove_node(struct gcov_node *node) in remove_node() argument
505 while ((node != &root_node) && list_empty(&node->children)) { in remove_node()
506 parent = node->parent; in remove_node()
507 release_node(node); in remove_node()
508 node = parent; in remove_node()
519 struct gcov_node *node; in get_child_by_name() local
521 list_for_each_entry(node, &parent->children, list) { in get_child_by_name()
522 if (strcmp(node->name, name) == 0) in get_child_by_name()
523 return node; in get_child_by_name()
536 struct gcov_node *node; in reset_write() local
540 list_for_each_entry(node, &all_head, all) { in reset_write()
541 if (node->num_loaded > 0) in reset_write()
542 reset_node(node); in reset_write()
543 else if (list_empty(&node->children)) { in reset_write()
544 remove_node(node); in reset_write()
578 struct gcov_node *node; in add_node() local
597 node = get_child_by_name(parent, curr); in add_node()
598 if (!node) { in add_node()
599 node = new_node(parent, NULL, curr); in add_node()
600 if (!node) in add_node()
603 parent = node; in add_node()
606 node = new_node(parent, info, curr); in add_node()
607 if (!node) in add_node()
622 static void add_info(struct gcov_node *node, struct gcov_info *info) in add_info() argument
625 int num = node->num_loaded; in add_info()
638 memcpy(loaded_info, node->loaded_info, in add_info()
647 if (!gcov_info_is_compatible(node->unloaded_info, info)) { in add_info()
651 gcov_info_free(node->unloaded_info); in add_info()
652 node->unloaded_info = NULL; in add_info()
659 if (!gcov_info_is_compatible(node->loaded_info[0], info)) { in add_info()
667 kfree(node->loaded_info); in add_info()
668 node->loaded_info = loaded_info; in add_info()
669 node->num_loaded = num + 1; in add_info()
675 static int get_info_index(struct gcov_node *node, struct gcov_info *info) in get_info_index() argument
679 for (i = 0; i < node->num_loaded; i++) { in get_info_index()
680 if (node->loaded_info[i] == info) in get_info_index()
689 static void save_info(struct gcov_node *node, struct gcov_info *info) in save_info() argument
691 if (node->unloaded_info) in save_info()
692 gcov_info_add(node->unloaded_info, info); in save_info()
694 node->unloaded_info = gcov_info_dup(info); in save_info()
695 if (!node->unloaded_info) { in save_info()
707 static void remove_info(struct gcov_node *node, struct gcov_info *info) in remove_info() argument
711 i = get_info_index(node, info); in remove_info()
718 save_info(node, info); in remove_info()
720 node->loaded_info[i] = node->loaded_info[node->num_loaded - 1]; in remove_info()
721 node->num_loaded--; in remove_info()
722 if (node->num_loaded > 0) in remove_info()
725 kfree(node->loaded_info); in remove_info()
726 node->loaded_info = NULL; in remove_info()
727 node->num_loaded = 0; in remove_info()
728 if (!node->unloaded_info) in remove_info()
729 remove_node(node); in remove_info()
738 struct gcov_node *node; in gcov_event() local
741 node = get_node_by_name(gcov_info_filename(info)); in gcov_event()
744 if (node) in gcov_event()
745 add_info(node, info); in gcov_event()
750 if (node) in gcov_event()
751 remove_info(node, info); in gcov_event()