All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@tv-sign.ru>
To: Gregory Haskins <ghaskins@novell.com>
Cc: Daniel Walker <dwalker@mvista.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@elte.hu>,
	linux-rt-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] RT: Add priority-queuing and priority-inheritance to workqueue infrastructure
Date: Thu, 2 Aug 2007 23:50:49 +0400	[thread overview]
Message-ID: <20070802195049.GA361@tv-sign.ru> (raw)
In-Reply-To: <1186012439.9513.321.camel@ghaskins-t60p.haskins.net>

On 08/01, Gregory Haskins wrote:
>
> On Thu, 2007-08-02 at 02:22 +0400, Oleg Nesterov wrote:
> 
> > No,
> 
> You sure are a confident one ;)

Yeah, this is a rare case when I am very sure I am right ;)

I strongly believe you guys take a _completely_ wrong approach.
queue_work() should _not_ take the priority of the caller into
account, this is bogus.

Once again. Why do you think that queue_work() from RT99 should
be considered as more important? This is just not true _unless_
this task has to _wait_ for this work.

So, perhaps, perhaps, it makes sense to modify insert_wq_barrier()
so that it temporary raises the priority of cwq->thread to match
that of the caller of flush_workqueue() or cancel_work_sync().

However, I think even this is not needed. Please show us the real
life example why the current implementation sucks.

> > The comment near flush_workqueue() says:
> > 
> > 	* We sleep until all works which were queued on entry have been handled,
> > 	* but we are not livelocked by new incoming ones.
> 
> Dude, of *course* says that.  It would be completely illogical for it to
> say otherwise with the linear priority queue that mainline has.  Since
> we are changing things here you have to read between the lines and ask
> yourself "what is the intention of this barrier logic?".  Generally
> speaking, the point of a barrier is to flush relevant work from your own
> context, sometimes at the granularity of flushing everyone elses work
> inadvertently if the flush mechanism isn't fine grained enough.  But
> that is a side-effect, not a requirement.
> 
> So now my turn:
> 
> No. :P

OK. Suppose that we re-order work_struct's according to the caller's
priority.

Now, a niced thread doing flush_workqueue() can livelock if workqueue
is actively used.

Actually a niced (so that its priority is lower than cwq->thread's one)
can deadlock. Suppose it does

	lock(LOCK);
	flush_workueue(wq);

and we have a pending work_struct which does:

	void work_handler(struct work_struct *self)
	{
		if (!try_lock(LOCK)) {
			// try again later...
			queue_work(wq, self);
			return;
		}

		do_something();
	}

Deadlock. Because now the caller of queue_work() is cwq->thread itself,
so we insert this work ahead of the barrier which should complete
flush_workueue(wq) above.

There are other scenarious scenarios for more subtle deadlocks. Say,
the pending task doesn't touch LOCK itself, but schedules another
work which takes the LOCK.

[... snip a good portion of text which I wasn't able to translate
 and understand ... ;) ]

> > Now, again, why do you think this task should wait?
> 
> I don't think it *should* wait.  It *will* wait and we don't want that.
> And without PI-boost, it could wait indefinitely.  I think the detail
> you are missing is that the RT kernel introduces some new workqueue APIs
> that allow for "RPC" like behavior.  E.g. they are like
> "smp_call_function()", but instead of using an IPI, it uses workqueues
> to dispatch work to other CPUs.

Aha. And this is exactly what I meant above. And this means that flush
should govern the priority boosting, not queueing!

But again, I think we can just create a special workqueue for that and
make it RT99. No re-ordering, no playing games with re-niceing.

Because that workqueue should be "idle" most of the time (no pending
works), otherwise we are doing something wrong. And I don't think this
wq can have many users and work->func() shouldn't be heavy, so perhaps
it is OK if it always runs with the high priority. The latter may be
wrong though.

> However, you seem to have objections to the overall change in general

Well, yes... You propose the complex changes to solve the problem which
doesn't look very common, this makes me unhappy :)

Oleg.

  reply	other threads:[~2007-08-02 19:50 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-01  0:26 [PATCH] RT: Add priority-queuing and priority-inheritance to workqueue infrastructure Gregory Haskins
2007-08-01  3:52 ` Daniel Walker
2007-08-01 11:59   ` Gregory Haskins
2007-08-01 15:10     ` Daniel Walker
2007-08-01 15:19       ` Gregory Haskins
2007-08-01 15:55         ` Daniel Walker
2007-08-01 17:32           ` Gregory Haskins
2007-08-01 21:48       ` Esben Nielsen
2007-08-01 17:01   ` Peter Zijlstra
2007-08-01 17:10     ` Daniel Walker
2007-08-01 18:26       ` Oleg Nesterov
2007-08-01 18:39         ` Daniel Walker
2007-08-01 20:25           ` Oleg Nesterov
2007-08-01 18:12     ` Oleg Nesterov
2007-08-01 18:29       ` Daniel Walker
2007-08-01 20:18         ` Oleg Nesterov
2007-08-01 20:32           ` Oleg Nesterov
2007-08-01 20:43             ` Daniel Walker
2007-08-01 20:34           ` Daniel Walker
2007-08-01 20:50             ` Oleg Nesterov
2007-08-01 21:02               ` Daniel Walker
2007-08-01 21:13               ` Gregory Haskins
2007-08-01 21:34                 ` Oleg Nesterov
2007-08-01 21:59                   ` Gregory Haskins
2007-08-01 22:22                     ` Oleg Nesterov
2007-08-01 23:53                       ` Gregory Haskins
2007-08-02 19:50                         ` Oleg Nesterov [this message]
2007-08-06 11:35                           ` Gregory Haskins
2007-08-06 14:26                             ` Oleg Nesterov
2007-08-06 14:57                               ` Gregory Haskins
2007-08-06 15:36                                 ` Oleg Nesterov
2007-08-06 15:50                                   ` Gregory Haskins
2007-08-06 16:50                                     ` Oleg Nesterov
2007-08-06 16:57                                       ` Gregory Haskins
2007-08-06 11:49                           ` Ingo Molnar
2007-08-06 13:18                             ` Oleg Nesterov
2007-08-06 13:29                               ` Peter Zijlstra
2007-08-06 13:32                                 ` Peter Zijlstra
2007-08-06 14:45                                   ` Oleg Nesterov
2007-08-06 14:52                                     ` Peter Zijlstra
2007-08-06 16:40                                       ` Oleg Nesterov
2007-08-06 15:04                                     ` Gregory Haskins
2007-08-06 15:38                                       ` Oleg Nesterov
2007-08-06 19:33                           ` Oleg Nesterov
2007-08-06 19:37                             ` Gregory Haskins

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070802195049.GA361@tv-sign.ru \
    --to=oleg@tv-sign.ru \
    --cc=dwalker@mvista.com \
    --cc=ghaskins@novell.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.