diff options
Diffstat (limited to 'debian/patches/tmpfs-improve-diskfs_node_iterate.patch')
-rw-r--r-- | debian/patches/tmpfs-improve-diskfs_node_iterate.patch | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/debian/patches/tmpfs-improve-diskfs_node_iterate.patch b/debian/patches/tmpfs-improve-diskfs_node_iterate.patch new file mode 100644 index 00000000..fbb013bd --- /dev/null +++ b/debian/patches/tmpfs-improve-diskfs_node_iterate.patch @@ -0,0 +1,53 @@ +commit 328d69406ec81b4b8248f46fafa205c6745ef083 +Author: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Wed Apr 30 02:08:41 2014 +0200 + + tmpfs: improve diskfs_node_iterate + + Currently, diskfs_node_iterate iterates twice over all nodes. The + first time only to determine the number of nodes currently in the + cache. Simply count them instead. + + * tmpfs/node.c (all_nodes_nr_items): New variable. + (diskfs_node_norefs): Decrement all_nodes_nr_items. + (diskfs_cached_lookup): Increment all_nodes_nr_items. + (diskfs_node_iterate): Fix the type of num_nodes, use all_nodes_nr_items. + +diff --git a/tmpfs/node.c b/tmpfs/node.c +index bc0ad64..3925d00 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) +@@ -122,6 +123,7 @@ diskfs_node_norefs (struct node *np) + np->dn->hnext->dn->hprevp = np->dn->hprevp; + np->dn->hnext = 0; + np->dn->hprevp = 0; ++ all_nodes_nr_items -= 1; + } + + free (np); +@@ -186,6 +188,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; +@@ -233,8 +236,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) |