Lines Matching refs:node
33 * @list: list head for child node list
36 * @parent: parent node
141 * Return a profiling data set associated with the given node. This is
145 static struct gcov_info *get_node_info(struct gcov_node *node)
147 if (node->num_loaded > 0)
148 return node->loaded_info[0];
150 return node->unloaded_info;
155 * all profiling data associated with the given node.
157 static struct gcov_info *get_accumulated_info(struct gcov_node *node)
162 if (node->unloaded_info)
163 info = gcov_info_dup(node->unloaded_info);
165 info = gcov_info_dup(node->loaded_info[i++]);
168 for (; i < node->num_loaded; i++)
169 gcov_info_add(info, node->loaded_info[i]);
180 struct gcov_node *node = inode->i_private;
190 * profiling data sets associated with one node simple.
192 info = get_accumulated_info(node);
235 * Find a node by the associated data file name. Needs to be called with
240 struct gcov_node *node;
243 list_for_each_entry(node, &all_head, all) {
244 info = get_node_info(node);
246 return node;
253 * Reset all profiling data associated with the specified node.
255 static void reset_node(struct gcov_node *node)
259 if (node->unloaded_info)
260 gcov_info_reset(node->unloaded_info);
261 for (i = 0; i < node->num_loaded; i++)
262 gcov_info_reset(node->loaded_info[i]);
265 static void remove_node(struct gcov_node *node);
270 * remove the debug fs node as well.
277 struct gcov_node *node;
282 node = get_node_by_name(gcov_info_filename(info));
283 if (node) {
284 /* Reset counts or remove node for unloaded modules. */
285 if (node->num_loaded == 0)
286 remove_node(node);
288 reset_node(node);
366 static void add_links(struct gcov_node *node, struct dentry *parent)
375 node->links = kcalloc(num, sizeof(struct dentry *), GFP_KERNEL);
376 if (!node->links)
380 gcov_info_filename(get_node_info(node)),
387 node->links[i] = debugfs_create_symlink(deskew(basename),
396 debugfs_remove(node->links[i]);
397 kfree(node->links);
398 node->links = NULL;
409 /* Basic initialization of a new node. */
410 static void init_node(struct gcov_node *node, struct gcov_info *info,
413 INIT_LIST_HEAD(&node->list);
414 INIT_LIST_HEAD(&node->children);
415 INIT_LIST_HEAD(&node->all);
416 if (node->loaded_info) {
417 node->loaded_info[0] = info;
418 node->num_loaded = 1;
420 node->parent = parent;
422 strcpy(node->name, name);
426 * Create a new node and associated debugfs entry. Needs to be called with
432 struct gcov_node *node;
434 node = kzalloc(sizeof(struct gcov_node) + strlen(name) + 1, GFP_KERNEL);
435 if (!node)
438 node->loaded_info = kcalloc(1, sizeof(struct gcov_info *),
440 if (!node->loaded_info)
443 init_node(node, info, name, parent);
446 node->dentry = debugfs_create_file(deskew(node->name), 0600,
447 parent->dentry, node, &gcov_data_fops);
449 node->dentry = debugfs_create_dir(node->name, parent->dentry);
451 add_links(node, parent->dentry);
452 list_add(&node->list, &parent->children);
453 list_add(&node->all, &all_head);
455 return node;
458 kfree(node);
463 /* Remove symbolic links associated with node. */
464 static void remove_links(struct gcov_node *node)
468 if (!node->links)
471 debugfs_remove(node->links[i]);
472 kfree(node->links);
473 node->links = NULL;
477 * Remove node from all lists and debugfs and release associated resources.
480 static void release_node(struct gcov_node *node)
482 list_del(&node->list);
483 list_del(&node->all);
484 debugfs_remove(node->dentry);
485 remove_links(node);
486 kfree(node->loaded_info);
487 if (node->unloaded_info)
488 gcov_info_free(node->unloaded_info);
489 kfree(node);
492 /* Release node and empty parents. Needs to be called with node_lock held. */
493 static void remove_node(struct gcov_node *node)
497 while ((node != &root_node) && list_empty(&node->children)) {
498 parent = node->parent;
499 release_node(node);
500 node = parent;
505 * Find child node with given basename. Needs to be called with node_lock
511 struct gcov_node *node;
513 list_for_each_entry(node, &parent->children, list) {
514 if (strcmp(node->name, name) == 0)
515 return node;
528 struct gcov_node *node;
532 list_for_each_entry(node, &all_head, all) {
533 if (node->num_loaded > 0)
534 reset_node(node);
535 else if (list_empty(&node->children)) {
536 remove_node(node);
561 * Create a node for a given profiling data set and add it to all lists and
570 struct gcov_node *node;
589 node = get_child_by_name(parent, curr);
590 if (!node) {
591 node = new_node(parent, NULL, curr);
592 if (!node)
595 parent = node;
597 /* Create file node. */
598 node = new_node(parent, info, curr);
599 if (!node)
611 * Associate a profiling data set with an existing node. Needs to be called
614 static void add_info(struct gcov_node *node, struct gcov_info *info)
617 int num = node->num_loaded;
621 * case the new data set is incompatible, the node only contains
630 memcpy(loaded_info, node->loaded_info,
639 if (!gcov_info_is_compatible(node->unloaded_info, info)) {
643 gcov_info_free(node->unloaded_info);
644 node->unloaded_info = NULL;
651 if (!gcov_info_is_compatible(node->loaded_info[0], info)) {
659 kfree(node->loaded_info);
660 node->loaded_info = loaded_info;
661 node->num_loaded = num + 1;
665 * Return the index of a profiling data set associated with a node.
667 static int get_info_index(struct gcov_node *node, struct gcov_info *info)
671 for (i = 0; i < node->num_loaded; i++) {
672 if (node->loaded_info[i] == info)
681 static void save_info(struct gcov_node *node, struct gcov_info *info)
683 if (node->unloaded_info)
684 gcov_info_add(node->unloaded_info, info);
686 node->unloaded_info = gcov_info_dup(info);
687 if (!node->unloaded_info) {
696 * Disassociate a profiling data set from a node. Needs to be called with
699 static void remove_info(struct gcov_node *node, struct gcov_info *info)
703 i = get_info_index(node, info);
710 save_info(node, info);
712 node->loaded_info[i] = node->loaded_info[node->num_loaded - 1];
713 node->num_loaded--;
714 if (node->num_loaded > 0)
717 kfree(node->loaded_info);
718 node->loaded_info = NULL;
719 node->num_loaded = 0;
720 if (!node->unloaded_info)
721 remove_node(node);
730 struct gcov_node *node;
733 node = get_node_by_name(gcov_info_filename(info));
736 if (node)
737 add_info(node, info);
742 if (node)
743 remove_info(node, info);