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] [day] [month] [year] [list]
Date:	Fri, 19 Feb 2016 17:22:39 +0100
From:	Petr Mladek <pmladek@...e.com>
To:	Tejun Heo <tj@...nel.org>
Cc:	Andrew Morton <akpm@...ux-foundation.org>,
	Oleg Nesterov <oleg@...hat.com>,
	Ingo Molnar <mingo@...hat.com>,
	Peter Zijlstra <peterz@...radead.org>,
	Steven Rostedt <rostedt@...dmis.org>,
	"Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>,
	Josh Triplett <josh@...htriplett.org>,
	Thomas Gleixner <tglx@...utronix.de>,
	Linus Torvalds <torvalds@...ux-foundation.org>,
	Jiri Kosina <jkosina@...e.cz>, Borislav Petkov <bp@...e.de>,
	Michal Hocko <mhocko@...e.cz>, linux-mm@...ck.org,
	Vlastimil Babka <vbabka@...e.cz>, linux-api@...r.kernel.org,
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH v4 09/22] kthread: Allow to cancel kthread work

On Mon 2016-01-25 14:17:09, Tejun Heo wrote:
> On Mon, Jan 25, 2016 at 04:44:58PM +0100, Petr Mladek wrote:
> > +static bool __cancel_kthread_work_sync(struct kthread_work *work)
[...]
 > > +	work->canceling++;
> > +	ret = try_to_cancel_kthread_work(work, &worker->lock, &flags);
> > +
> > +	if (worker->current_work != work)
> > +		goto out_fast;
> 
> If there are two racing cancellers, wouldn't this allow the losing one
> to return while the work item is still running?

If the work is running, worker->current_work must point to it.
All cancelers will see it and queue its own kthread_flush_work.
It is a bit sub-optimal but it is trivial. I doubt that there
will be many parallel cancelers in practice.

> > +	spin_unlock_irqrestore(&worker->lock, flags);
> > +	flush_kthread_work(work);
> > +	/*
> > +	 * Nobody is allowed to switch the worker or queue the work
> > +	 * when .canceling is set.
> > +	 */
> > +	spin_lock_irqsave(&worker->lock, flags);
> > +
> > +out_fast:
> > +	work->canceling--;
> > +	spin_unlock_irqrestore(&worker->lock, flags);
> > +out:
> > +	return ret;

Best Regards,
Petr

PS: I have updated the patchset according to your other comments.
In addition, I got rid of many try_lock games. We do not allow
to queue the same work to different workers. Therefore it should
be enough to warn if the worker changes unexpectedly. It makes
the code even more simple. I still need to do some testing.
I will send it next week, hopefully.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ