From 151133a33c18e9ba103cea77a269b56c6f5cf23a Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Wed, 30 Apr 2014 02:08:41 +0200 Subject: tmpfs: improve diskfs_node_iterate Currently, diskfs_node_iterate iterates twice over all nodes. The first time only to determine the number of nodes. Simply count them instead. * tmpfs/node.c (all_nodes_nr_items): New variable. (diskfs_free_node): Decrement all_nodes_nr_items. (diskfs_node_norefs): Likewise. (diskfs_cached_lookup): Increment all_nodes_nr_items. (diskfs_node_iterate): Fix type of sum_nodes, use all_nodes_nr_items. --- tmpfs/node.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'tmpfs/node.c') diff --git a/tmpfs/node.c b/tmpfs/node.c index bc0ad642..acc029ae 100644 --- a/tmpfs/node.c +++ b/tmpfs/node.c @@ -30,6 +30,7 @@ unsigned int num_files; static unsigned int gen; struct node *all_nodes; +static size_t all_nodes_nr_items; error_t diskfs_alloc_node (struct node *dp, mode_t mode, struct node **npp) @@ -77,6 +78,7 @@ diskfs_free_node (struct node *np, mode_t mode) *np->dn->hprevp = np->dn->hnext; if (np->dn->hnext != 0) np->dn->hnext->dn->hprevp = np->dn->hprevp; + all_nodes_nr_items -= 1; free (np->dn); np->dn = 0; @@ -120,6 +122,7 @@ diskfs_node_norefs (struct node *np) *np->dn->hprevp = np->dn->hnext; if (np->dn->hnext != 0) np->dn->hnext->dn->hprevp = np->dn->hprevp; + all_nodes_nr_items -= 1; np->dn->hnext = 0; np->dn->hprevp = 0; } @@ -186,6 +189,7 @@ diskfs_cached_lookup (ino_t inum, struct node **npp) dn->hnext->dn->hprevp = &dn->hnext; dn->hprevp = &all_nodes; all_nodes = np; + all_nodes_nr_items += 1; pthread_spin_unlock (&diskfs_node_refcnt_lock); st = &np->dn_stat; @@ -222,7 +226,7 @@ error_t diskfs_node_iterate (error_t (*fun) (struct node *)) { error_t err = 0; - unsigned int num_nodes = 0; + size_t num_nodes; struct node *node, **node_list, **p; pthread_spin_lock (&diskfs_node_refcnt_lock); @@ -233,8 +237,7 @@ diskfs_node_iterate (error_t (*fun) (struct node *)) diskfs_node_refcnt_lock, but we can't hold this while locking the individual node locks). */ - for (node = all_nodes; node != 0; node = node->dn->hnext) - num_nodes++; + num_nodes = all_nodes_nr_items; p = node_list = alloca (num_nodes * sizeof (struct node *)); for (node = all_nodes; node != 0; node = node->dn->hnext) -- cgit v1.2.3