Lines Matching full:node
34 * @list: list head for child node list
37 * @parent: parent node
251 * Return a profiling data set associated with the given node. This is
255 static struct gcov_info *get_node_info(struct gcov_node *node) in get_node_info() argument
257 if (node->num_loaded > 0) in get_node_info()
258 return node->loaded_info[0]; in get_node_info()
260 return node->unloaded_info; in get_node_info()
265 * all profiling data associated with the given node.
267 static struct gcov_info *get_accumulated_info(struct gcov_node *node) in get_accumulated_info() argument
272 if (node->unloaded_info) in get_accumulated_info()
273 info = gcov_info_dup(node->unloaded_info); in get_accumulated_info()
275 info = gcov_info_dup(node->loaded_info[i++]); in get_accumulated_info()
278 for (; i < node->num_loaded; i++) in get_accumulated_info()
279 gcov_info_add(info, node->loaded_info[i]); in get_accumulated_info()
290 struct gcov_node *node = inode->i_private; in gcov_seq_open() local
300 * profiling data sets associated with one node simple. in gcov_seq_open()
302 info = get_accumulated_info(node); in gcov_seq_open()
345 * Find a node by the associated data file name. Needs to be called with
350 struct gcov_node *node; in get_node_by_name() local
353 list_for_each_entry(node, &all_head, all) { in get_node_by_name()
354 info = get_node_info(node); in get_node_by_name()
356 return node; in get_node_by_name()
363 * Reset all profiling data associated with the specified node.
365 static void reset_node(struct gcov_node *node) in reset_node() argument
369 if (node->unloaded_info) in reset_node()
370 gcov_info_reset(node->unloaded_info); in reset_node()
371 for (i = 0; i < node->num_loaded; i++) in reset_node()
372 gcov_info_reset(node->loaded_info[i]); in reset_node()
375 static void remove_node(struct gcov_node *node);
380 * remove the debug fs node as well.
387 struct gcov_node *node; in gcov_seq_write() local
392 node = get_node_by_name(gcov_info_filename(info)); in gcov_seq_write()
393 if (node) { in gcov_seq_write()
394 /* Reset counts or remove node for unloaded modules. */ in gcov_seq_write()
395 if (node->num_loaded == 0) in gcov_seq_write()
396 remove_node(node); in gcov_seq_write()
398 reset_node(node); in gcov_seq_write()
476 static void add_links(struct gcov_node *node, struct dentry *parent) in add_links() argument
485 node->links = kzalloc_objs(struct dentry *, num); in add_links()
486 if (!node->links) in add_links()
490 gcov_info_filename(get_node_info(node)), in add_links()
497 node->links[i] = debugfs_create_symlink(deskew(basename), in add_links()
506 debugfs_remove(node->links[i]); in add_links()
507 kfree(node->links); in add_links()
508 node->links = NULL; in add_links()
519 /* Basic initialization of a new node. */
520 static void init_node(struct gcov_node *node, struct gcov_info *info, in init_node() argument
523 INIT_LIST_HEAD(&node->list); in init_node()
524 INIT_LIST_HEAD(&node->children); in init_node()
525 INIT_LIST_HEAD(&node->all); in init_node()
526 if (node->loaded_info) { in init_node()
527 node->loaded_info[0] = info; in init_node()
528 node->num_loaded = 1; in init_node()
530 node->parent = parent; in init_node()
532 strcpy(node->name, name); in init_node()
536 * Create a new node and associated debugfs entry. Needs to be called with
542 struct gcov_node *node; in new_node() local
544 node = kzalloc(sizeof(struct gcov_node) + strlen(name) + 1, GFP_KERNEL); in new_node()
545 if (!node) in new_node()
548 node->loaded_info = kzalloc_objs(struct gcov_info *, 1); in new_node()
549 if (!node->loaded_info) in new_node()
552 init_node(node, info, name, parent); in new_node()
555 node->dentry = debugfs_create_file(deskew(node->name), 0600, in new_node()
556 parent->dentry, node, &gcov_data_fops); in new_node()
558 node->dentry = debugfs_create_dir(node->name, parent->dentry); in new_node()
560 add_links(node, parent->dentry); in new_node()
561 list_add(&node->list, &parent->children); in new_node()
562 list_add(&node->all, &all_head); in new_node()
564 return node; in new_node()
567 kfree(node); in new_node()
572 /* Remove symbolic links associated with node. */
573 static void remove_links(struct gcov_node *node) in remove_links() argument
577 if (!node->links) in remove_links()
580 debugfs_remove(node->links[i]); in remove_links()
581 kfree(node->links); in remove_links()
582 node->links = NULL; in remove_links()
586 * Remove node from all lists and debugfs and release associated resources.
589 static void release_node(struct gcov_node *node) in release_node() argument
591 list_del(&node->list); in release_node()
592 list_del(&node->all); in release_node()
593 debugfs_remove(node->dentry); in release_node()
594 remove_links(node); in release_node()
595 kfree(node->loaded_info); in release_node()
596 if (node->unloaded_info) in release_node()
597 gcov_info_free(node->unloaded_info); in release_node()
598 kfree(node); in release_node()
601 /* Release node and empty parents. Needs to be called with node_lock held. */
602 static void remove_node(struct gcov_node *node) in remove_node() argument
606 while ((node != &root_node) && list_empty(&node->children)) { in remove_node()
607 parent = node->parent; in remove_node()
608 release_node(node); in remove_node()
609 node = parent; in remove_node()
614 * Find child node with given basename. Needs to be called with node_lock
620 struct gcov_node *node; in get_child_by_name() local
622 list_for_each_entry(node, &parent->children, list) { in get_child_by_name()
623 if (strcmp(node->name, name) == 0) in get_child_by_name()
624 return node; in get_child_by_name()
637 struct gcov_node *node; in reset_write() local
641 list_for_each_entry(node, &all_head, all) { in reset_write()
642 if (node->num_loaded > 0) in reset_write()
643 reset_node(node); in reset_write()
644 else if (list_empty(&node->children)) { in reset_write()
645 remove_node(node); in reset_write()
670 * Create a node for a given profiling data set and add it to all lists and
679 struct gcov_node *node; in add_node() local
698 node = get_child_by_name(parent, curr); in add_node()
699 if (!node) { in add_node()
700 node = new_node(parent, NULL, curr); in add_node()
701 if (!node) in add_node()
704 parent = node; in add_node()
706 /* Create file node. */ in add_node()
707 node = new_node(parent, info, curr); in add_node()
708 if (!node) in add_node()
720 * Associate a profiling data set with an existing node. Needs to be called
723 static void add_info(struct gcov_node *node, struct gcov_info *info) in add_info() argument
726 int num = node->num_loaded; in add_info()
730 * case the new data set is incompatible, the node only contains in add_info()
739 memcpy(loaded_info, node->loaded_info, in add_info()
748 if (!gcov_info_is_compatible(node->unloaded_info, info)) { in add_info()
752 gcov_info_free(node->unloaded_info); in add_info()
753 node->unloaded_info = NULL; in add_info()
760 if (!gcov_info_is_compatible(node->loaded_info[0], info)) { in add_info()
768 kfree(node->loaded_info); in add_info()
769 node->loaded_info = loaded_info; in add_info()
770 node->num_loaded = num + 1; in add_info()
774 * Return the index of a profiling data set associated with a node.
776 static int get_info_index(struct gcov_node *node, struct gcov_info *info) in get_info_index() argument
780 for (i = 0; i < node->num_loaded; i++) { in get_info_index()
781 if (node->loaded_info[i] == info) in get_info_index()
790 static void save_info(struct gcov_node *node, struct gcov_info *info) in save_info() argument
792 if (node->unloaded_info) in save_info()
793 gcov_info_add(node->unloaded_info, info); in save_info()
795 node->unloaded_info = gcov_info_dup(info); in save_info()
796 if (!node->unloaded_info) { in save_info()
805 * Disassociate a profiling data set from a node. Needs to be called with
808 static void remove_info(struct gcov_node *node, struct gcov_info *info) in remove_info() argument
812 i = get_info_index(node, info); in remove_info()
819 save_info(node, info); in remove_info()
821 node->loaded_info[i] = node->loaded_info[node->num_loaded - 1]; in remove_info()
822 node->num_loaded--; in remove_info()
823 if (node->num_loaded > 0) in remove_info()
826 kfree(node->loaded_info); in remove_info()
827 node->loaded_info = NULL; in remove_info()
828 node->num_loaded = 0; in remove_info()
829 if (!node->unloaded_info) in remove_info()
830 remove_node(node); in remove_info()
839 struct gcov_node *node; in gcov_event() local
842 node = get_node_by_name(gcov_info_filename(info)); in gcov_event()
845 if (node) in gcov_event()
846 add_info(node, info); in gcov_event()
851 if (node) in gcov_event()
852 remove_info(node, info); in gcov_event()