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: Mon, 6 Aug 2007 19:36:55 +0400	[thread overview]
Message-ID: <20070806153655.GA245@tv-sign.ru> (raw)
In-Reply-To: <1186412235.21381.82.camel@ghaskins-t60p.haskins.net>

On 08/06, Gregory Haskins wrote:
>
> On Mon, 2007-08-06 at 18:26 +0400, Oleg Nesterov wrote:
> 
> > Immediately, A inserts the work on CPU 1.
> 
> Well, if you didn't care about which CPU, that's true.  But suppose we
> want to direct this specifically at CWQ for cpu 0.

please see below...

> > It can livelock if other higher-priority threads add works to this wq
> > repeteadly.
> 
> That's really starvation, though.  I agree with you that it is
> technically possible to happen if the bandwidth of the higher priority
> producer task is greater than the bandwidth of the consumer.  But note
> that the RT priorities already forgo starvation avoidance, so IMO the
> queue can here as well.  E.g. if the system designer runs a greedy app
> at a high RT priority, it can starve as many lower priority items as it
> wants anyway.  This is no different.

OK.

> > > > 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.
> > > 
> > > That code is completely broken, so I don't think it matters much.  But
> > > regardless, the new API changes will address that.
> > 
> > Sorry. This code is not very nice, but it is correct currently.
> 
> Well, the "trylock+requeue" avoids the obvious recursive deadlock, but
> it introduces a more subtle error: the reschedule effectively bypasses
> the flush.

this is OK, flush_workqueue() should only care about work_struct's that are
already queued.

> E.g. whatever work was being flushed was allowed to escape
> out from behind the barrier.  If you don't care about the flush working,
> why do it at all?

The caller of flush_workueue() doesn't necessary know we have such a work
on list. It just wants to flush its own works.

> But like I said, its moot...we will fix that condition at the API level
> (or move away from overloading the workqueues)

Oh, good :)

> > Well, if we can use smp_call_() we don't need these complications?
> 
> With an RT99 or smp_call() solution, all invocations effectively preempt
> whatever is running on the target CPU.  That is why I said it was the
> opposite problem.  A low priority client can preempt a high-priority
> task, which is just as bad as the current situation.

Aha, now I see what another problem you are trying to solve. I had a false
impression that might_sleep() is the issue.

After reading the couple of Peter's emails, I guess I am starting to
understand another issue. RT has irq threads, and they have different
priorities. So, in that case I agree, it is natural to consider the work
which was queued from the higher-priority irq thread as "more important".
Yes?

Oleg.

  reply	other threads:[~2007-08-06 15:34 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
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 [this message]
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=20070806153655.GA245@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.