bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/4] tmpfs: improve diskfs_node_iterate


From: Justus Winter
Subject: [PATCH 4/4] tmpfs: improve diskfs_node_iterate
Date: Wed, 30 Apr 2014 11:06:02 +0200

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(-)

diff --git a/tmpfs/node.c b/tmpfs/node.c
index bc0ad64..acc029a 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)
-- 
1.9.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]