bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH 4/4] tmpfs: improve diskfs_node_iterate


From: Samuel Thibault
Subject: Re: [PATCH 4/4] tmpfs: improve diskfs_node_iterate
Date: Wed, 30 Apr 2014 11:10:06 +0200
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Wed 30 Apr 2014 11:06:02 +0200, a écrit :
> Currently, diskfs_node_iterate iterates twice over all nodes.  The
> first time only to determine the number of nodes.  Simply count them
> instead.

Ack.

> * 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
> 

-- 
Samuel
"How should I know if it works?  That's what beta testers are for.  I only
coded it."
(Attributed to Linus Torvalds, somewhere in a posting)



reply via email to

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