Re: [PATCH] RT: Add priority-queuing and priority-inheritance to workqueue infrastructure

Oleg Nesterov
2007-08-01T18:13:28Z

On 08/01, Peter Zijlstra wrote:
>
> On Tue, 2007-07-31 at 20:52 -0700, Daniel Walker wrote:
>
> > static void insert_work(struct cpu_workqueue_struct *cwq,
> > struct work_struct *work, int tail)
> > {
> > + int prio = current->normal_prio;
> > +
> > set_wq_data(work, cwq);
> > /*
> > * Ensure that we get the right work->data if we see the
> > * result of list_add() below, see try_to_grab_pending().
> > */
> > smp_wmb();
> > - if (tail)
> > - list_add_tail(&work->entry, &cwq->worklist);
> > - else
> > - list_add(&work->entry, &cwq->worklist);
> > + plist_node_init(&work->entry, prio);
> > + plist_add(&work->entry, &cwq->worklist);

Sorry, this patch is completely wrong. It immediately breaks
flush_workqueue/cancel_workqueue functions.

And I personally think it is not very useful, even if it was correct.
You can create your own workqueue and change the priority of cwq->thread.

> > @@ -168,7 +171,7 @@ int fastcall queue_work(struct workqueue
> > int ret = 0, cpu = raw_smp_processor_id();
> >
> > if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
> > - BUG_ON(!list_empty(&work->entry));
> > + BUG_ON(!plist_node_empty(&work->entry));
> > __queue_work(wq_per_cpu(wq, cpu), work);
> > ret = 1;

Side note, looks like you use some strange kernel. This raw_smp_processor_id()
above is wrong.

Oleg.