lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 08 Dec 2009 16:29:23 +0100
From:	Peter Zijlstra <peterz@...radead.org>
To:	Oleg Nesterov <oleg@...hat.com>
Cc:	Alexey Dobriyan <adobriyan@...il.com>,
	Ananth Mavinakayanahalli <ananth@...ibm.com>,
	Christoph Hellwig <hch@...radead.org>,
	"Frank Ch. Eigler" <fche@...hat.com>, Ingo Molnar <mingo@...e.hu>,
	Roland McGrath <roland@...hat.com>,
	linux-kernel@...r.kernel.org, utrace-devel@...hat.com
Subject: Re: [RFC,PATCH 14/14] utrace core

On Tue, 2009-12-08 at 16:04 +0100, Oleg Nesterov wrote:
> > > > > +       /*
> > > > > +        * In theory spin_lock() doesn't imply rcu_read_lock().
> > > > > +        * Once we clear ->utrace_flags this task_struct can go away
> > > > > +        * because tracehook_prepare_release_task() path does not take
> > > > > +        * utrace->lock when ->utrace_flags == 0.
> > > > > +        */
> > > > > +       rcu_read_lock();
> > > > > +       task->utrace_flags = flags;
> > > > > +       spin_unlock(&utrace->lock);
> > > > > +       rcu_read_unlock();
> > > >
> > > > yuck!
> > > >
> > > > why not simply keep a task reference over the utrace_reset call?
> > >
> > > Yes, we could use get_task_struct() instead. Not sure this would
> > > be more clean, though.
> >
> > For one it would allow getting rid of that insane assymetric locking.
> 
> Well, this is subjective, but I don't agree that
> 
>         get_task_struct(task);
>         task->utrace_flags = flags;
>         spin_unlock(&utrace->lock);
>         put_task_struct(task);
> 
> looks better. 

No, what I mean by assymetric locking is that utrace_reset() and
utrace_reap() drop the utrace->lock where their caller acquired it,
resulting in non-obvious like:

utrace_control()
{

  ...
  spin_lock(&utrace->lock);

  ...

  if (reset)
    utrace_reset(utrace);
  else
    spin_unlock(&utrace->lock);
}

If you take a task ref you can write the much saner:

utrace_control()
{
  ...
  spin_lock(&utrace->lock);
  ...
  if (reset)
    utrace_reset(utrace);

  spin_unlock(&utrace->lock);
}



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ