bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH] Remove global netfs lock and use hard and soft references fo


From: Justus Winter
Subject: Re: [PATCH] Remove global netfs lock and use hard and soft references for nodes.
Date: Mon, 07 Mar 2016 19:57:10 +0100
User-agent: alot/0.3.8.dev

Hi,

nitpick: Your subject is still quite long, and you got a newline in
your subject, however you managed to do that o_O

Quoting Flavio Cruz (2016-03-07 00:14:52)
> -  /* The number of references to this node.  */
> -  int references;
> +  /* Hard and soft references to this node.  */
> +  refcounts_t refcounts;

I guess having both hard and soft references allowed you to simplify
some users of netfs?

(Answering myself: Yes, console and fakeroot benefit greatly.)

>  void
>  netfs_nref (struct node *np)
>  {
> -  pthread_spin_lock (&netfs_node_refcnt_lock);
> -  np->references++;
> -  pthread_spin_unlock (&netfs_node_refcnt_lock);
> +  struct references result;
> +  refcounts_ref (&np->refcounts, &result);
> +}

If you are not interested in the result, pass NULL here.

> +void
> +netfs_nref_light (struct node *np)
> +{
> +  struct references result;
> +  refcounts_ref_weak (&np->refcounts, &result);
>  }

Likewise.

> --- a/trans/fakeroot.c
> +++ b/trans/fakeroot.c
> @@ -110,6 +110,9 @@ new_node (file_t file, mach_port_t idport, int locked, 
> int openmodes,
>  
>    if (!locked)
>      pthread_mutex_lock (&idport_ihash_lock);
> +  /* The light reference allows us to safely keep the node in the
> +     hash table.  */
> +  netfs_nref_light (*np);
>    err = hurd_ihash_add (&idport_ihash, nn->idport, *np);
>    if (err)
>      goto lose;
> @@ -155,22 +158,31 @@ set_faked_attribute (struct node *np, unsigned int 
> faked)
>      }
>  }
>  
> +void
> +netfs_try_dropping_softrefs (struct node *np)
> +{
> +  /* We have to drop our light reference by removing the node from the
> +     idport_ihash hash table.  */
> +  pthread_mutex_lock (&idport_ihash_lock);
> +
> +  hurd_ihash_locp_remove (&idport_ihash, netfs_node_netnode 
> (np)->idport_locp);
> +  netfs_nrele_light (np);
> +
> +  pthread_mutex_unlock (&idport_ihash_lock);

I haven't thought this through, but I guess you want to do the
netfs_nrele_light with the idport_ihash_lock unlocked.

Looks fine otherwise,  I'll test it in my builds.

Thanks,
Justus



reply via email to

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